数据库管理系统是根据数据模型对数据进行存储和管理的系统。
数据库管理系统采用的数据模型主要有:层次模型、网状模型和关系模型。
本文主要介绍SQLite,它是一个开源的、内嵌式的关系型数据库,SQL 是一种专门用来与数据库通信的语言。
操作数据库
在终端输入sqlite3,可进入软件通过输入命令来操控SQL数据库,SQL数据库不区分大小写。
| 命令 | 功能 |
|---|---|
| .help | 查看所有命令 |
| .databases | 查看与数据库关联的文件名 |
| .tables | 查看数据表名 |
| .schema | 查看表的结构 |
| .headers on/off | 打开或关闭显示表头 |
| .mode column | 固定列宽 |
一、SQL语句
1.创建一个数据库
语法:sqlite3 数据文件名(以.db为结尾)。
eg:在终端命令行输入 sqlite3 stu.db,创建一个与数据库关联的文件名。
可用.databases查看数据库路径。
2.创建一张表 create table
语法:create table 表名称(列名称1 数据类型,列名称2 数据类型,... );
| 存储类 | 描述 |
|---|---|
| NULL | 值是一个 NULL 值。 |
| INTEGER(int) | 值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。 |
| REAL(float、double) | 值是一个浮点值,存储为 8 字节的 IEEE 浮点数字。 |
| TEXT | 值是一个文本字符串,使用数据库编码存储。 |
| BLOB | 值是一个 blob 数据,完全根据它的输入存储。 |
eg:在sqlite3中输入create table stu(name text,age int,score float);
可用.tables命令查看创建的表名,用.schema命令查看表的结构。
3.表内插入数据 insert into
语法:insert into 表名 values (列值1,列值2,... );
功能:给表里一行中的所有列值赋值。
eg:在sqlite3中输入 insert into stu values("zhangsan",18,99.5);
4.查询表内数据 select
语法:1、select * from 表名 【匹配条件】;(*表示选取所有列)
2、select 列名 1[, 列名 2, ...] from 表名 【匹配条件】;
5.匹配条件 where
1). in操作符
语法:where 列名 in (列值 1, 列值 2, ...)
eg :在sqlite3中输入select * from stu where age in (18,19);
2).or操作符
语法:where 列 1 = 值 1 [or 列 2 = 值 2 or ...]
eg :cselect * from stu where score > 90 or age > 19;
3).like操作符
语法:where 列名 like 列值
1、若列值为数字,相当于列名=列值。
2、若列值为字符串,可以用通配符"%"代表缺少的字符(若干个)。
eg :在sqlite3中输入select * from stu where name like '%zhang%';
4).order by排序
select * from 表名 order by 列名; ---- 升序
select * from 表名 order by 列名 desc; ---- 降序

6.修改表的列 alter
在已有的表中添加列以及修改表名。 (删除列-sqlite3 暂不支持)
语句:alter table 表名 add 列名 数据类型;
alter table 表名 rename to 新表名;
eg:在sqlite3中输入alter table stu add sno int;

7.修改表中数据 update
语法:update 表名 set 列1=值1 [, 列2=值2, ...] [匹配条件];
eg :在sqlite3中输入update stu set sno=111 where age==20;
8.删除表中数据 delete
语法: delete from 表名 [匹配条件];
注意: 当表中有多列、多行符合匹配条件时会删除相应的多行。
eg:在sqlite3中输入delete from stu where age==20;
9.删除表 drop
语法:drop table 表名称;

二、C编程
1. 打开数据库
语法:int sqlite3_open( const char *db_name, sqlite3 **db );
功能:打开一个数据库文件 。
参数:
- @db_name --- 数据库文件名
- @db --- 获得数据信息在内存的首地址
**返回值:**成功返回SQLITE_OK,失败返回非SQLITE_OK。
2. 关闭数据库
语法:int sqlite3_close( sqlite3 **db );
**功能:**关闭一个数据库文件 。
参数:
- @db --- 要关闭的数据库操作句柄
**返回值:**成功返回SQLITE_OK,失败返回非SQLITE_OK。
3. 执行SQL语句的函数(回调方式)

语法:int sqlite3_exec(sqlite3 *db, const char *sql,
exechandler_t callback, void *arg, char **errmsg);
功能:执行 sql 指向的 SQL 语句,若结果集不为空,函数会调用函数指针 callback 所指向的函数。
参数:
- @db --- 数据库的标识。
- @sql --- SQL 语句(一条或多条),以';'结尾。
- @callback --- 是回调函数指针,当select这条语句执行之后,sqlite3 会去调用你提供的这个函数。 @arg --- 当执行 sqlite3_exec 的时候传递给回调函数的参数。
- @errmsg --- 记录sqlite3_exec的错误信息 返回值: 成功 SQLITE_OK 失败 非SQLITE_OK
**返回值:**成功返回SQLITE_OK,失败返回非SQLITE_OK。
4. 回调函数
回调函数指针: typedef int callback (void *para, int n_column, char **pvalues, char **pname);
功能: 此函数由用户定义, 当 sqlite3_exec 函数执行 sql 语句后,结果集不为空时 sqlite3_exec 函数会自动调用此函数, 每次调用此函数时会把结果集的一行信息传给此函数。
参数:
- @para --- sqlite3_exec 传给此函数的参数,para 为任意数据类型的地址。
- @n_column --- 结果集的列数。
- @pvalue --- 指针数组的地址,其存放一行信息中各个列值的首地址。
- @pname --- 指针数组的地址,其存放一行信息中各个列值对应列名的首地址。
返回值: 若为非 0 值,则通知 sqlite3_exec 终止回调。
5. 执行SQL语句的函数(非回调方式)

语法: int sqlite3_get_table(sqlite3 *db, const char *sql, char ***resultp, int *nrow, int *ncolumn, char **errmsg );
功能: 执行 sql 指向的 SQL 语句,函数将结果集相关的数据的地址保存在函数的参数中。
参数:
- @db --- 数据库的标识。
- @sq --- SQL 语句(一条或多条),以';'结尾。
- @resultp --- 指针数组的地址, 指针数组的地址, 其记录了结果集的数据。 内存布局: 先依次存放各列的列名, 然后是每一行各列的值。 //char **
- @nrow --- 结果集的行数(不包含列名)。
- @ncolumn --- 结果集的列数。
- @errmsg --- 错误信息。
6. 释放resultp函数
语法:void sqlite3_free_table(char **resultp);
功能: 释放 sqlite3_get_table 分配的内存。
参数: 结果集数据的首地址。