1.打开数据库: sqlite3 <*.db>
2.系统命令: 以’.'开头
.quit : 退出sqlite3
.help : 查看帮助文档
.database: 显示当前打开的数据库
.tables : 查看所有的表
.schema :查看表结构
.indices :查看表索引
查看系统目录
.mode col
.headers on
sqlite> select type, name, tbl_name, sql from sqlite_master order by type;
查看查询计划:
explain query plan + 正常sql语句,该命令对于长时间查询有很大作用
explain query plan select * from stu;
3.数据导入导出
将表test数据导出到test.csv文件中
.output test.csv
.separator ,
select * from test;
将test.csv文件导入到test2表中(test与test2表格式一样)
.import test.csv test2
4.SQL命令: 以’;'结尾
1、创建表
CREATE TABLE stu (id int, name text, score real);
表名 字段名 整型 字符串 小数
CREATE TABLE stu (id int primary key, name text, score real);
注:把id字段设置为主键(在表中唯一)
创建插入式:
create table foods2 as select *from foods; 创建表foods2 并将foods表中数据插入
缺点:源表中得任何约束都不会定义在新表中(自增长字段、索引、UNIOUE约束),如果定义为UNIOUE的字段中插入重复的值,sqlite会报错停止。
2、删除表
drop table ;
3、向表中添加记录
insert into values(value1, value2, ....);
insert into stu values(1, 'ZhangSan', 89.9); //插入整条数据
insert into stu(id, name) values(5, 'XiaoMing'); //只插入部分字段
insert into device_hw_param_renzheng value(1,0,5,50,'1');
多行插入:
insert into foods2 select * from foods; //将foods表所有数据插入到表foods2中,表foods2 和foods 格式保证一样
4、查询
1)查询表中所有记录
select * from ;
格式显示查找记录
.mode col
.headers on
select *from ;
2)按条件查询
select * from stu where name='LiSi';
select * from stu where name='root' and passwd='123456'; //同时满足条件1和2
select * from stu where name='LiSi' or id=3; //同时满足条件1或者2
select score from stu where name='LiSi' or id=3; //满足条件的某列
select name,score from stu where name='LiSi' or id=3;
限定和排序查询
select * from stu limit n offset m; //只查询前n条记录 从m+1开始
select * from stu order by id desc; //按id从大到小进行排序 desc降序 asc升序
3)删除
delete from stu where id=4; //按条件删除记录
delete from stu; //删除表中所有记录
5、更新:当有约束时会停止更新报错:PRIMARY KEY must be unique
update stu set id=4,score=99.9 where id=5;(不加where所有行都会被更新)
6、增加字段:
alter table stu add column <字段名> <类型>; //增加一个无初始值字段
alter table stu add column <字段名> <类型> default value; //增加一个有初始值字段
alter table rename to 修改表名
7、删除字段
1)create table stu as select no, name, score from student;
2) drop table student;
3) alter table stu rename to student;
头文件: sqlite3.h
编译时: -lsqlite3
1、sqlite3_open:打开数据库
int sqlite3_open(char *path, sqlite3 **db);
参数:
path: 数据库文件路径
db: 指向sqlite句柄的指针
返回值:成功返回0,失败返回错误码(非零值)
2、sqlite3_close:关闭sqlite数据库
int sqlite3_close(sqlite3 *db);
返回值:成功返回0,失败返回错误码
3、sqlite3_errmsg: 获取错误信息
const char *sqlite3_errmsg(sqlite3 *db);
返回值:返回错误信息
4、sqlite3_exec: 执行SQL操作
int sqlite3_exec(sqlite3 *db, const char *sql,
sqlite3_callback callback, void *, char **errmsg);
参数:
db:数据库句柄
sql:SQL语句
callback:回调函数
errmsg:错误信息指针的地址
返回值:成功返回0,失败返回错误码
typedef int (*sqlite3_callback)(void *para, int f_num, \
char **f_value, char **f_name);
功能:每找到一条记录自动执行一次回调函数
参数:
para:传递给回调函数的参数
f_num:记录中包含的字段数目
f_value:包含每个字段值的指针数组
f_name:包含每个字段名称的指针数组
返回值:成功返回0,失败返回-1
5、不使用回调函数执行SQL语句
int sqlite3_get_table(sqlite3 *db, const char *sql, \
char ***resultp, int*nrow, int *ncolumn, char **errmsg);
功能:执行SQL操作
参数:
db:数据库句柄
sql:SQL语句
resultp:用来指向sql执行结果的指针
nrow:满足条件的记录的数目(行)
ncolumn:每条记录包含的字段数目(列)
errmsg:错误信息指针的地址
返回值:成功返回0,失败返回错误码
6、准备语句:准备语句(prepared statement)对象一个代表一个简单SQL语句对象的实例,这个对象通常被称为“准备语句”或者“编译好的SQL语句”或者就直接称为“语句”。 语句对象的生命周期经历这样的过程:
l 使用sqlite3_prepare_v2或相关的函数创建这个对象
2 使用sqlite3_bind_*()给宿主参数(host parameters)绑定值
sqlite3_bind_int(sqlite3_stmt*,int,int);
sqlite3_bind_double(sqlite3_stmt*,int,double);
sqlite3_bind_text(sqlite3_stmt*,int,const char*,int,void(*)(void *));
参数:sqlite3_stmt*:准备语句变量指针。
int:sqlite3_stmt变量参数的序号索引值,规定最左侧的sql参数的索引值为1,也就是说参数索引值从1开始。
第三个参数:要给第二个参数指向的变量的实际值,第二个参数可以指向不同的索引值。
第四个参数:第三个参数的长度。
第五个参数:一般为NULL。
3 通过调用sqlite3_step一次或多次来执行这个sql
4 使用sqlite3——reset()重置这个语句,然后回到第2步,这个过程做0次或多次
5 使用sqlite3_finalize()销毁这个对象
int sqlite3_prepare(sqlite3 *db, const char *zSql, int nByte, sqlite3_stmt **ppStmt, const char **pzTail);
功能:这个函数将sql文本转换成一个准备语句(prepared statement)对象,同时返回这个对象的指针。
这个接口需要一个数据库连接指针以及一个要准备的包含SQL语句的文本。它实际上并不执行(evaluate)这个SQL语句,它仅仅为执行准备这个sql语句
参数:db:数据指针
zSql:sql语句,使用UTF-8编码
nByte:如果nByte小于0,则函数取出zSql中从开始到第一个0终止符的内容;如果nByte不是负的,那么它就是这个函数能从zSql中读取的字节数的最大值。如果nBytes非负,zSql在第一次遇见’/000/或’u000’的时候终止
pzTail:上面提到zSql在遇见终止符或者是达到设定的nByte之后结束,假如zSql还有剩余的内容,那么这些剩余的内容被存放到pZTail中,不包括终止符
ppStmt:能够使用sqlite3_step()执行的编译好的准备语句的指针,如果错误发生,它被置为NULL,如假如输入的文本不包括sql语句。调用过程必须负责在编译好的sql语句完成使用后使用sqlite3_finalize()删除它。
返回值:如果执行成功,则返回SQLITE_OK,否则返回一个错误码。
7、 PRAGMA synchronous:获取或设置当前磁盘的同步模式,该模式控制积极的sqlite如何将数据写入物理存储
PRAGMA值:0或OFF: 不进行同步 很快,但是可能会导致数据库损坏,定期备份并且少量数据丢失可接受,选择off
1或NORMAL:在关键的磁盘操作的每个序列后同步 较快但是有概率导致数据库损坏
2或FULL: 在每个关键的磁盘操作后同步 安全但是很慢
命令: begin transaction:开始处理事务
commit transaction/end transaction:保存更改,
rollback transaction:回滚所做的更改
begin transaction:启动事务,直到遇到下一个commit或rollback,当数据库关闭或发生错误时,也会回滚。
commit:把事务调用的更改保存到数据库中
rollback:撤销尚未保存到数据库的事务命令,只能撤销上自次发出的commit或rollback命令以来的事务。
用于匹配通配符指定模式的文本,匹配成功返回true,glob区分大小写
like: % _
where salary like '200%' 查找以200开头的任意值
where salary like '%200%' 查找任意位置包含200的任意值
where salary like '_00%' 查找第二位和第三位为00的任意值
where salary like '2_%_%' 查找以2开头、且长度至少为3个字符的任意值
where salary like '%2' 以2结尾的任意值
where salary like '_2%3' 查找第二位为2,且以3结尾的任意值
where salary like '2___3' 查找长度为5,且以2开头以3结尾的任意值。
例子:select * from company where age Like '2%';
glob: * ?
where salary glob '200*' 查找以200开头的任意值
where salary glob '*200*' 查找任意位置包含200的任意值
where salary glob '?00*' 查找第二位和第三位为00的任意值
where salary glob '2??' 查找以2开头、且长度至少为3个字符的任意值
where salary glob '*2' 以2结尾的任意值
where salary glob '?2*3' 查找第二位为2,且以3结尾的任意值
where salary glob '2???3' 查找长度为5,且以2开头以3结尾的任意值。
例子:select * from company where age glob '2*';
例子:select *from company limit 3 offset 2; 从第三位提取三个记录
having子句允许指定条件来过滤将出现在结果中的分组结果,having子句必须出现在group by 子句之后,order by之前。
例子:select *from company group by name having count(age>20); 查找年纪大于20岁的记录
distinct:与select一起使用,消除重复记录,只获取唯一一次的记录。
例子:select distinct name from company;
约束是在表的数据列上强制执行的规则。
NOT NULL 约束:确保某列不能有NULL 值
例子:create table company(id int primary key not null,name text not null,age int not null,address char(50),salary real);
创建新表,其中id、name、age 不为空。
DEFAULT 约束:当某列中没有指定值时,为该列提供默认值
UNIQUE 约束:确保某列值是不同的
PRIMARY KEY 约束:主键,唯一标识 "integer primary key"创建的主键确保值是唯一的
"integer primary key autoincrement"创建的主键新插入数据值会比当前值大,达到最大值时返回SQLITE_FULL.
CHECK 约束:确保某列中的所有值都满足一定条件
内连接:从两表之间找出相同值得行
select * from foods inner join food_types on foods.id = food_types.id;
select * from foods, food_types where foods.id = food_types.id;
别名:在from子句中对表得重命名
select foods.name, food_types.name from foods, food_types where foods.type_id = food_types.id limit 10;
select f.name, t.name from foods f, food_types t where f.type_id = t.id limit 10;
触发器:是数据库的回调函数,他会在指定数据库事件发生时自动调用。
1. 触发器可以指定在特定数据库表发生delete、insert、update时触发,或在一个或多个表的列发生变化时更新触发。
2. WHEN子句和触发器动作可能使用表单 NEW.col-name和OLD.col-name的引用插入、删除、更新的行元素,col-name是与触发器关联表的列名称。
3. 如果有WHEN语句,则只针对WHEN子句为真的指定执行SQL语句,如果没用WHEN语句,则针对所有执行SQL语句。
4. before和after关键字决定何时执行触发器动作,决定在关联行的插入、修改、删除之前或者之后触发触发器。
当 record_f_num > 12000时候,删除checkin_f 表中时间最早的一条记录
CREATE TRIGGER checkin_max_12K after update on log WHEN new.key='record_f_num' AND new.value>12000
BEGIN delete from checkin_f where check_in_time in (select check_in_time from checkin_f order by check_in_time limit 1 offset 0); END
索引:加速数据检索
1. 基本语法:CREATE INDEX checkin_f_query on checkin_f;
2. 单例索引:基于一个表上一个列的索引。CREATE INDEX checkin_f_query on checkin_f (userid);
3. 唯一索引:不允许重复的值插入表中。CREATE UNIQUE INDEX checkin_f_query on checkin_f (userid, check_in_time);
4. 删除索引:DROP INDEX checkin_f_query