数据库基础知识、指令、语句与API接口

一. 数据库基础知识

1.1 数据库与其他存储结构的区别

数据结构:

数据存于内存:速度快,掉电数据丢失

文件:

数据存于硬盘,速度慢,掉电数据可以保存

数据库:

数据存于硬盘,专业存储数据,掉电数据不丢失

1.2 数据库的分类

数据库分类:

1、关系型数据库:

一个二维表格

将复杂的数据结构简化为二维表格形式

大型:Oracle,DB2

中型:MySql, SQLServer

小型:Sqlite

2、非关系型数据库:

以键值对存储,且结构不固定

JSON

Redis

MongoDB

1.3 嵌入式数据库

sqlite3:

文件型数据库,可以移动

数据容量最大2T

代码量少,1万行左右,总大小10M以内

开源免费,c语言开发

关系型数据库

1.4 sqlite3的安装

1.在线安装

sudo apt-get install sqlite3

sudo apt-get install libsqlite3-dev

2.源码安装

1.sqlite-autoconf-3080403源代码.tar.gz拷贝到Ubuntu系统Desktop目录中

2.tar -zxvf sqlite-autoconf-3080403源代码.tar.gz

3.cd sqlite-autoconf-3080403

4../configure// 生成makefile

5.make// 编译源码

6.sudo make install// 安装

3. 安装可视化工具

sudo apt-get install sqlitebrowser

sqlitebrowser xxx.db

Navicat Sqlite3 Windows下图形操作接口

二. sqlite3数据库的基本操作

2.1 sqlite3基本命令

1..help

查看sqlite3支持的相关命令

  1. .quit

退出sqlite3数据库

3..tables

查看数据库中的所有表

  1. .schema tablename

查看tablename创建时的SQL语句(表的结构)

  1. .headers on/off

开启关闭列名称

  1. .mode column

以左对齐列宽显示数据

  1. .width 第一列宽度 第二列宽度 第三列宽度 ...

2.2 SQL语言:

1.create table创建表

**用法:**create table 表名称(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,....);

create table if not exists 表名称(列名称1 数据类型,列名称2 数据类型....);--表不存在则创

建,存在则不创建

sqlite3数据类型:

INTEGER : int

REAL:double float

TEXT: char 字符串

NULL:值是一个 NULL值。

2.insert int 插入表

**用法:**INSERT INTO 表名称 VALUES(值1, 值2,....)

3.select 查表

SELECT * FROM 表名称

SELECT 列名称 FROM 表名称

SELECT 列名称1,列名称2,列名称3 FROM 表名称

4.where

1)条件匹配

用法: SELECT 列名称 FROM 表名称 WHERE 列 运算符 值

运算符:> >= < <= = != and or

2)模糊查询

SELECT * FROM 表名称 WHERE 列名 like '%冬梅';

SELECT * FROM 表名称 WHERE 列名 like '马%';

SELECT * FROM 表名称 WHERE 列名 like '马__';

百分号(%)代表零个、一个或多个数字或字符。
下划线(_)代表一个单一的数字或字符。这些符号可以被组合使用。

3)顺序显示

select * from class1 order by score ASC; 升序查询

select * from class1 order by score DESC;降序查询

5.delete删除表中信息

DELETE FROM 表名称 WHERE 列名称 = 值

6.update改表中信息

UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

7.datetime

datetime('now', '+8 hours');

select datetime('now', '+8 hours');

查询当前东八区时间

insert into class3 values(1, 'zhangsan', 99, datetime('now', '+8 hours'));

insert into class3 values(2, 'lisi', 100, datetime('now', '+8 hours'));

insert into class3 values(3, 'wanger', 98, datetime('now', '+8 hours'));

8. 设置主键值自动增长列

create table 表名称(id INTEGER PRIMARY KEY AUTOINCREMENT, 类名称 数据类型, ...);

再次插入时给NULL即可

9. drop table 表名称

删除一张表

2.3 sqlite3数据库编程c/c++接口:

1.编程框架

打开数据库---》读写数据库(增,删,改,查)---》关闭数据库

sqlite3.h

-lsqlite3

2.sqlite3函数接口:

2.3.1 sqlite3_open

int sqlite3_open(

const char *filename, /* Database filename (UTF-8) */

sqlite3 **ppDb /* OUT: SQLite db handle */

);

功能: 打开数据库,不存在则会创建

参数:

filename:数据库名称

ppDb:数据库的句柄,流指针,保存数据库句柄,二级指针

返回值:

成功打开:SQLITE_OK被返回

失败:error_code被返回

2.3.2 sqlite3_errmsg

const char *sqlite3_errmsg(sqlite3*);

**功能:**将数据库的错误码转换成字符串,打印错误信息

2.3.3 sqlite3_close

int sqlite3_close(sqlite3*);

**功能:**关闭数据库句柄,释放空间

2.3.4 sqlite3_exec

int sqlite3_exec(

sqlite3*, /* An open database */

const char *sql, /* SQL to be evaluated */

int (*callback)(void*,int,char**,char**), /* Callback function */

void *, /* 1st argument to callback */

char **errmsg /* Error msg written here */

);

功能: 执行SQL语句

参数:

sqlite3*:数据库句柄

const char *sql:需要被执行的SQL语句

callback:回调函数,select时使用

void *:传给callback的第一个参数

errmsg :保存错误信息的指针

返回值:

成功:SQLITE_OK被返回

失败:error_code被返回

回调函数注意事项:

int (*callback)(void* arg,int column,char** data,char** name)

功能:select查询 时触发的回调函数

arg:sqlite3_exec传递的第四个参数

column:查询到的数据的列数

char** ,char** 两个指针数组:

第一个:指向查到的每一列的数据,指针数组,分别指向查找到的数据的各列

第二个:列名,指针数据,保存查找到的数据的各列的名称的地址

二级指针在什么时候用:

被调修改主调中的指针变量

指针数组的数组名

返回值: 成功0 失败非0

注意:

当select每查找的一条数据,callback就会被回调一次,回调函数查询到几行数据就执行几次

callback必须要有返回值,回调函数必须要返回值,否则sqlite3_exec调用失败

从数据库查找出来的数据均是字符串

2.3.5 sqlite3_free

void sqlite3_free(void*);

功能:释放保存出错信息的空间

2.4 示例代码

1、创建新表并插入数据

cpp 复制代码
int main()
{
    int ret;
    sqlite3 *pdb;//数据库句柄
    ret = sqlite3_open("stu.db", &pdb);//打开数据库
    if(ret != SQLITE_OK){
        //打印错误信息
        fprintf(stderr, "sqlite3_open error:%s\n",sqlite3_errmsg(pdb));
        return -1;
    }
    //创建新表,若存在就跳过
    char *psql = "create table if not exists class4 \
        (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,score REAL);";    
    ret = sqlite3_exec(pdb, psql,NULL,NULL,NULL);
    if(ret != SQLITE_OK){
        fprintf(stderr,"sqlite3_exec error:%s\n",sqlite3_errmsg(pdb));
    }
    
    char sql[512] = {0};
    char name[64] = {0};
    float score;
    
    while(1){
        scanf("%s",name);
        scanf("%f",&score);
        sprintf(sql, "insert into class4 values(NULL, \"%s\", %f);"
                ,name,score);

        ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
        if(ret != SQLITE_OK){
            fprintf(stderr, "sqlite3_exec error:%s\n",sqlite3_errmsg(pdb));
            sqlite3_close(pdb);
            return -1;
        }
    }

    sqlite3_close(pdb);//关闭数据库
    return 0;
}

2、查找

cpp 复制代码
int flag;
int callback(void *arg, int column, char **data, char **name)
{
    if(flag == 0){
        printf("column is %d\n",column);
        for(int i = 0; i < column; i++){
            printf("%s ",name[i]);
        }
        printf("\n");
        flag = 1;
    }
    for(int i = 0; i < column; i++){
        printf("%s ",data[i]);
    }
    printf("\n");

    return 0;
}

int main()
{
    int ret;
    sqlite3 *pdb;//数据库句柄
    ret = sqlite3_open("./stu.db", &pdb);
    if(ret != SQLITE_OK){
        fprintf(stderr, "sqlite3_open error:%s\n",sqlite3_errmsg(pdb));
        return -1;
    }

    char *psql = "select * from class2 where name=\"dog\";";

    ret = sqlite3_exec(pdb, psql, callback, NULL, NULL);
    if(ret != SQLITE_OK){
        fprintf(stderr, "sqlite3_exec error:%s\n",sqlite3_errmsg(pdb));
        sqlite3_close(pdb);
        return -1;
    }
    sqlite3_close(pdb);
 
    return 0;
}

结果: