|SQLite3简介
SQLite3只是一个轻型的嵌入式数据库引擎,占用资源非常低,处理速度比Mysql还快,专门用于移动设备上进行适量的数据存取,它只是一个文件,不需要服务器进程。
SQL语句是SQL操作的指令,我们用C/C++访问数据库时,需要用char*即C字符串来保存SQL语句,然后调用相应sqlite3库的函数,传入C字符串,来执行SQL指令。
常用术语:表(table)、字段(column,列,属性)、记录(row,record)。
|SQL(structured query language)语句
特点:不区分大小写,每条语句后加";"结尾。
关键字:select、insert、update、delete、from、creat、where、desc、order、by、group、table、alter、view、index等,数据库中不能使用关键字命名表和字段。
数据定义语句(DDL:Data Definition Language)
- 新建表 ⟹ create:create table 表名 (字段名1 字段类型1,字段名2 字段类型2,。。。); create table if not exists 表名 (字段名1 字段类型1,字段名2 字段类型2,。。。);
?
1 |
|
- 删除表 ⟹ drop:dorp table 表名;drop table if exists 表名;
?
1 |
|
数据操作语句(DML:Data Manipulation language)
- 添加表中的数据 ⟹ insert:insert into 表名 (字段1,字段2,。。。) values (字段1的值,字段2的值);字符串内容用单引号。
?
1 |
|
- 修改表中的数据 ⟹ update:update 表名 set 字段1 = 字段1的值,字段2 = 字段2的值,。。。;
?
1 2 3 4 5 |
|
- 删除表中的数据 ⟹ delete:delete from 表名;delete from 表名 where 字段 = 字段值。
?
1 2 3 4 5 6 7 8 |
|
数据查询语句(DQL:Data Query Language)
- select:select 字段1, 字段2, 。。。 from 表名;select 字段1, 字段2, 。。。 from 表名 where 字段 = 某值;select * from 表名;(查询所有的字段)
- 表别名:select 字段1 别名, 字段2 别名,。。。from 表名 别名;select 字段1 别名, 字段2 as 别名,。。。from 表名 as 别名;select 别名.字段1,别名.字段2,。。。from 表名 别名;
?
1 2 3 4 5 |
|
- 计算记录条数:select count(字段或者*) from 表名;
?
1 2 3 |
|
- where:where 字段 = 某值;where 字段 is 某值;where 字段 != 某值;where 字段 is not 某值;where 字段 > 某值;where 字段1 = 某值1 and 字段2 < 某值2;where 字段1 = 某值1 or 字段2 > 某值2;
- order by:select * from 表名 order by 字段(默认升序);select * from 表名 order by 字段 desc(降序);select * from 表名 order by 字段 asc(升序);select * from 表名 order by 字段1 asc(先按字段1升序),字段2 desc(再按字段2降序);
?
1 2 |
|
- limit:select * from 表名 limit 数值1,数值2;分页查询,数值1表示跳过前面多少条,数值2表示取出之后多少条。select * from 表名 limit 数值2;(跳过前面0条,相当于select * from 表名 limit 0,数值2,表示最前面多少条数据)
?
1 2 |
|
- like:模糊查询,select 字段1, 字段2, 。。。 from 表名 where 字段 like %某值%;
?
1 |
|
存储类型:integer(整型)、real(浮点型)、text(文本字符串)、blob(二进制数据)。
实际上SQLite是无类型的,建表时声明的类型是为了方便程序员之间的交流,是一种良好的编程规范。
字段约束:
- not null:字段的值不能为空。
- unique:字段的值必需唯一。
- default:指定字段的默认值。
- primary key:主键,用来唯一的标识某条记录,相当于记录的身份证。主键可以是一个或多个字段,应由计算机自动生成和管理。主键字段默认包含了not null和unique两个约束。
- autoincrement:当主键是integer类型时,应该增加autoincrement约束,能实现主键值的自动增长。
?
1 |
|
外键:利用外键约束可以用来建立表与表之间的联系,一般是一张表的某个字段,引用着另一张表的主键的字段。
- 创建一个表:
?
1 |
|
- 创建一个带外键的表:t_student表中有一个叫做fk_student_class的外键,这个外键的作用是让t_student表中的class_id字段引用t_class表中的id字段。
?
1 |
|
- 利用外键来查询多张表中的数据:
?
1 2 3 4 5 |
|
|C/C++上使用SQLite3
1、配置好C/C++项目环境:导入sqlite3.lib和sqlite3.dll,包含头文件#include <sqlite3.h>。(具体步骤此处不讲,可参考该网页)
2、打开或者创建数据库。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
3、执行不返回数据的SQL语句(增、删、改)。
(执行更新、删除语句和执行创表、添加语句基本类似,只需更改sql语句即可。)
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
4、执行返回数据的SQL语句(查)。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
5、关闭数据库:sqlite3_close_v2(sqlite3* sql)
?
1 2 3 4 |
|
|SQLite3 库函数 总结
1.打开数据库
?
1 2 3 4 5 6 |
|
其中
flags参数有如下标志:
?
1 2 3 4 5 6 |
|
2.检查SQL语句的合法性(查询前的准备)
若语句合法即编译通过,则将语句产生的指令塞进stmt句柄(此时并未执行指令)
?
1 2 3 4 5 6 7 |
|
3.执行stmt句柄(执行存储在stmt句柄的指令)
如果指令能查询到下一行数据,就会返回SQLITE_ROW
如果指令(例如写入数据)不需要返还数据,就会返还SQLITE_DONE
?
1 2 3 |
|
4.利用stmt句柄获得第iCol字段的值(字段的下标从0开始)
//执行完查询句柄后,stmt就会指向查到的数据
//然后可以通过stmt获取相应数据
?
1 2 3 4 5 |
|
其他:
清理语句句柄(以便重复使用同一个stmt句柄)
?
1 2 3 |
|
关闭数据库连接
?
1 2 3 |
|
直接编译并执行 SQL语句
(不推荐使用:1、没有SQL语法检查 2、每一句SQL语句即使完全一样,也会重新编译执行,对批量指令来说效率不高。)
?
1 2 3 4 5 6 7 |
|
利用事务(BEGIN;COMMIT;)批量操作
如果要进行大量的操作,比如要插入10000条数据,如果逐条执行SQL语句,则消耗的时间非常长。采用事务的方式批量处理,可以极大程度提升操作速度(我用1000条记录实验了一下,速度提高了500倍以上)。sqlite3_exec可以执行任何sql语句,包括事务(“BEGIN TRANSACTION”)、回滚(“ROLLBACK”)和提交(“COMMIT”)等等
Eg1:
//插入条数据(在Begin和Commit之间批量操作,可以大幅度提高效率)
result =sqlite3_exec(db, "BEGIN;",0, 0, 0);
for (int i=0; i<10000; i++)
{
//插入一条数据
result = sqlite3_exec(db,
"INSERT INTOMyTable (MyText, MyDate, MyTime, MyFloat) VALUES ('---上班好远!', '2012-03-23', '9:00:00', 1000);",
0, 0, 0);
}
result =sqlite3_exec(db, "COMMIT;",0, 0, 0); .
Eg.2
string strSql;
strSql+="begin;\n";
for (int i=0;i<100;i++)
{
strSql+="insert into MyTable values(null,'heh');\n";
}
strSql+="commit;";
//cout<<strSql<<endl;
nResult = sqlite3_exec(db,strSql.c_str(),NULL,NULL,&errmsg);