SQLite3只是一个轻型的嵌入式数据库引擎,占用资源很是低,处理速度比Mysql还快,专门用于移动设备上进行适量的数据存取,它只是一个文件,不须要服务器进程。html
SQL语句是SQL操做的指令,咱们用C/C++访问数据库时,须要用char*即C字符串来保存SQL语句,而后调用相应sqlite3库的函数,传入C字符串,来执行SQL指令。程序员
经常使用术语:表(table)、字段(column,列,属性)、记录(row,record)。sql
转载并改编自:http://www.cnblogs.com/hankkk/p/5782321.html数据库
特色:不区分大小写,每条语句后加";"结尾。编程
关键字:select、insert、update、delete、from、creat、where、desc、order、by、group、table、alter、view、index等,数据库中不能使用关键字命名表和字段。缓存
数据定义语句(DDL:Data Definition Language)服务器
CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL); 多线程
DROP TABLE IF EXISTS t_person; 函数
数据操做语句(DML:Data Manipulation language)工具
INSERT INTO t_person (name, age) VALUES ('大明', 22);
UPDATE t_person SET name = '小明', age = 10; // 把表中name字段的值所有改为小明,age字段的值所有改为10。
UPDATE t_person SET age = 12 WHERE name = '小明'; // 把表中name字段值是小明的age值改成12。
DELETE FROM t_person; // 删除表中的全部记录。
DELETE FROM t_person WHERE age = 25; // 删除表中字段age等于25的这条记录。
DELETE FROM t_person WHERE age > 12 AND age < 15; // 删除表中年龄大于12且小于15的记录。
数据查询语句(DQL:Data Query Language)
SELECT name, age FROM t_person WHERE age < 80;
SELECT * FROM t_person WHERE age < 80;
SELECT name, age nianling FROM t_person ren WHERE ren.age > 80 AND nianling < 90;
SELECT count(name) FROM t_person ren WHERE ren.age > 80;
SELECT count(*) FROM t_person ren WHERE ren.age > 80;
SELECT * FROM t_person WHERE age < 100 ORDER BY age DESC, name ASC; // 先按年龄降序,再按名字升序。
SELECT * FROM t_person WHERE age < 100 ORDER BY age DESC, name ASC LIMIT 3, 5; // 先筛选,后排序,再分页。
SELECT * FROM t_person WHERE name like '%明%';
存储类型:integer(整型)、real(浮点型)、text(文本字符串)、blob(二进制数据)。
实际上SQLite是无类型的,建表时声明的类型是为了方便程序员之间的交流,是一种良好的编程规范。
字段约束:
CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL UNIQUE, age integer NOT NULL DEFAULT 30);
外键:利用外键约束能够用来创建表与表之间的联系,通常是一张表的某个字段,引用着另外一张表的主键的字段。
CREATE TABLE IF NOT EXISTS t_class (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL UNIQUE);
CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL, class_id integer NOT NULL, CONSTRAINT fk_student_class FOREIGN KEY (class_id) REFERENCES t_class(id));
SELECT t.name t_name, t.age t_age, tc.name c_name FROM t_student t, t_class tc WHERE t.class_id = tc.id; // 查询全部学生对应的班级
SELECT * FROM t_student WHERE class_id = (SELECT id FROM t_class WHERE name = '四班'); // 查询四班的全部学生
一、配置好C/C++项目环境:导入sqlite3.lib和sqlite3.dll,包含头文件#include <sqlite3.h>。(具体步骤此处不讲,可参考该网页)
二、打开或者建立数据库。
1 sqlite3 *sql = NULL; // 一个打开的数据库实例 2 const char * path = "..../test.db";//某个sql文件的路径 3 4 // 根据文件路径打开数据库链接。若是数据库不存在,则建立。 5 // 数据库文件的路径必须以C字符串传入。 6 int result = sqlite3_open_v2(path, &sql, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_SHAREDCACHE, NULL); 7 8 if (result == SQLITE_OK) { 9 std::clog << "打开数据库链接成功"; 10 } 11 else { 12 std::clog << "打开数据库链接失败"; 13 }
三、执行不返回数据的SQL语句(增、删、改)。
(执行更新、删除语句和执行创表、添加语句基本相似,只需更改sql语句便可。)
1 const char *sqlSentence = "INSERT INTO t_person(name, age) VALUES('夏明', 22); "; //SQL语句 2 sqlite3_stmt *stmt = NULL; //stmt语句句柄 3 4 //进行插入前的准备工做——检查语句合法性 5 //-1表明系统会自动计算SQL语句的长度 6 int result = sqlite3_prepare_v2(sql, sqlSentence, -1, &stmt, NULL); 7 8 if (result == SQLITE_OK) { 9 std::clog<< "添加数据语句OK"; 10 //执行该语句 11 sqlite3_step(stmt); 12 } 13 else { 14 std::clog << "添加数据语句有问题"; 15 } 16 //清理语句句柄,准备执行下一个语句 17 sqlite3_finalize(stmt);
四、执行返回数据的SQL语句(查)。
1 const char *sqlSentence = "SELECT name, age FROM t_person WHERE age < 30;"; //SQL语句 2 sqlite3_stmt *stmt = NULL; // stmt语句句柄 3 4 //进行查询前的准备工做——检查语句合法性 5 //-1表明系统会自动计算SQL语句的长度 6 int result = sqlite3_prepare_v2(sql, sqlSentence, -1, &stmt, NULL); 7 8 if (result == SQLITE_OK) { 9 std::clog << "查询语句OK"; 10 // 每调一次sqlite3_step()函数,stmt语句句柄就会指向下一条记录 11 while (sqlite3_step(stmt) == SQLITE_ROW) { 12 // 取出第0列字段的值 13 const unsigned char *name = sqlite3_column_text(stmt, 0); 14 // 取出第1列字段的值 15 int age = sqlite3_column_int(stmt, 1); 16 //输出相关查询的数据 17 std::clog << "name = " << name <<", age = "<< age; 18 } 19 } 20 else { 21 std::clog << "查询语句有问题"; 22 } 23 //清理语句句柄,准备执行下一个语句 24 sqlite3_finalize(stmt);
五、关闭数据库:sqlite3_close_v2(sqlite3* sql)
1 if (sql) { 2 sqlite3_close_v2(sql); 3 sql = nullptr; 4 }
1.打开数据库
int sqlite3_open_v2( const char *filename, // 数据库的文件路径 sqlite3 **ppDb, // 数据库实例 int flags, // 标志 const char *zVfs // 使用该数据库的虚拟机的名字,这里咱们不须要用,直接NULL );
其中:
flags参数有以下标志:
SQLITE_OPEN_NOMUTEX: 设置数据库链接运行在多线程模式(没有指定单线程模式的状况下)
SQLITE_OPEN_FULLMUTEX:设置数据库链接运行在串行模式。
SQLITE_OPEN_SHAREDCACHE:设置运行在共享缓存模式。
SQLITE_OPEN_PRIVATECACHE:设置运行在非共享缓存模式。
SQLITE_OPEN_READWRITE:指定数据库链接能够读写。
SQLITE_OPEN_CREATE:若是数据库不存在,则建立。
2.检查SQL语句的合法性(查询前的准备)
若语句合法即编译经过,则将语句产生的指令塞进stmt句柄(此时并未执行指令)
int sqlite3_prepare_v2( sqlite3 *db, // 数据库实例 const char *zSql, // 须要检查的SQL语句 int nByte, // SQL语句的最大字节长度 sqlite3_stmt **ppStmt, // stmt句柄,用来存储SQL stmt指令 const char **pzTail );
3.执行stmt句柄(执行存储在stmt句柄的指令)
若是指令能查询到下一行数据,就会返回SQLITE_ROW
若是指令(例如写入数据)不须要返还数据,就会返还SQLITE_DONE
int sqlite3_step( sqlite3_stmt* stmt //stmt句柄 );
4.利用stmt句柄得到第iCol字段的值(字段的下标从0开始)
//执行完查询句柄后,stmt就会指向查到的数据
//而后能够经过stmt获取相应数据
double sqlite3_column_double(sqlite3_stmt*, int iCol); // 浮点数据 int sqlite3_column_int(sqlite3_stmt*, int iCol); // 整型数据 sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); // 长整型数据 const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); // 二进制文本数据 const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); // 字符串数据
其余:
清理语句句柄(以便重复使用同一个stmt句柄)
int sqlite3_finalize( sqlite_stmt* stmt //stmt句柄 );
关闭数据库链接
int sqlite3_close_v2( sqlite3 * sql, // 数据库实例 );
直接编译并执行 SQL语句
(不推荐使用:一、没有SQL语法检查 二、每一句SQL语句即便彻底同样,也会从新编译执行,对批量指令来讲效率不高。)
int sqlite3_exec( sqlite3* sql, // 一个打开的数据库实例 const char * sqlSentence, // 须要执行的SQL语句 int (*callback)(void*,int,char**,char**), // SQL语句执行完毕后的回调 void *, // 回调函数的第1个参数 char **errmsg // 错误信息 );
SQLiteStudio是一个可视化的数据库管理工具。
经过可视化界面,它能够方便快捷地查看或操做数据库信息。
它是程序sqlite数据调试检查不可或缺的辅助工具。
(界面大概如图:)
SQLiteStudio 下载地址:https://sqlitestudio.pl/index.rvt?act=download