Sqlite3 数据库基本操作

Sqlite3 数据库基本操作

    • 1、sqlite3命令
    • **2、sqlite3编程接口:**
    • 3、事务:一个或多个更改数据库的扩展
    • 4、like和glob子句:
    • 5、limit 和 offset
    • 6、having:
    • 7、distinct
    • 8、约束:
    • 9、内连接
    • 10、别名
    • 11、触发器
    • 12. 索引

1、sqlite3命令

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;

2、sqlite3编程接口:

头文件: 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:	在每个关键的磁盘操作后同步			安全但是很慢

3、事务:一个或多个更改数据库的扩展

命令: begin transaction:开始处理事务
			   commit transaction/end transaction:保存更改,
			   rollback transaction:回滚所做的更改
			   
		begin transaction:启动事务,直到遇到下一个commit或rollback,当数据库关闭或发生错误时,也会回滚。
		commit:把事务调用的更改保存到数据库中
		rollback:撤销尚未保存到数据库的事务命令,只能撤销上自次发出的commit或rollback命令以来的事务。

4、like和glob子句:

用于匹配通配符指定模式的文本,匹配成功返回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*';

5、limit 和 offset

例子:select *from company limit 3 offset 2; 从第三位提取三个记录

6、having:

having子句允许指定条件来过滤将出现在结果中的分组结果,having子句必须出现在group by 子句之后,order by之前。
		例子:select *from company group by name having count(age>20);	查找年纪大于20岁的记录

7、distinct

distinct:与select一起使用,消除重复记录,只获取唯一一次的记录。
		例子:select distinct name from company;

8、约束:

约束是在表的数据列上强制执行的规则。
		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 约束:确保某列中的所有值都满足一定条件

9、内连接

内连接:从两表之间找出相同值得行
		select * from foods inner join food_types on foods.id = food_types.id;
		select * from foods, food_types where foods.id = food_types.id;

10、别名

别名:在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;

11、触发器

触发器:是数据库的回调函数,他会在指定数据库事件发生时自动调用。
	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 

12. 索引

索引:加速数据检索
	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

你可能感兴趣的:(SQLite3,sqlite,数据库,sql)