.help 打开帮助手册 .exit 退出数据库程序 .quit 数据库程序 或者 .q 也可以 .open 打开数据库文件 .schema 查看当前数据库文件中的建表语句(表的结构) .tables 查看当前数据库文件中有哪些表 .headers on/off 查询的结果是否显示表头1.2 sql语句
不同的数据库,sql语句都是通用的(在sqlite3中会用了,其他数据库也一样)
sql语句不能以 . 开头 结尾必须要有分号 ;
sql语句不区分大小写,但是一般 关键字 我们都是用大写
1.建表语句 CREATE TABLE 表名(字段名1 类型1,字段名2 类型2); //类型 //整数类型 INT 或者 INTEGER //字符串 CHAR 或者 TXT //例如 CREATE TABLE student(id INT, name CHAR, score INTEGER); 2.插入数据 INSERT INTO student VALUES(1001, '小明', 98); //这种方式需要从左到右给每一个字段赋值 //注意 如果sql语句里出现 字符串,需要用单引号或者双引号引起来 INSERT INTO student(id, name) VALUES(1002, "张三"); //这种方式可以选中要给哪几个字段赋值 3.查询数据 SELECt * FROM student; //查询student表中所有记录的所有字段 // * 表示 要查询所有字段 SELECt id,score FROM student;//只查询 id 和 score 字段 SELECt * FROM student WHERe score=98;//查询成绩为 98 的学员的所有字段 SELECt * FROM student WHERe score=98 AND name="小明"; //查询成绩为 98 且名字叫 小明 的学员的所有字段 SELECt * FROM student WHERe score=98 OR score=100; //查询成绩为 98 或者 100 的学员的所有字段 SELECt * FROM student ORDER BY score ASC/DESC; //将查询的结果根据 score 字段排序 //ASC 升序 DESC 降序 //默认不写是 升序 4、更新记录 //将 id 为1001 的学员信息的成绩更新成100分 UPDATe student SET score=100 WHERe id=1001; //将 赵六 的学号改为 1005 成绩改为 90 UPDATE student SET id=1005,score=90 WHERe name='赵六'; 5、删除记录 //删除所有 score = 100 的学员 DELETE FROM student WHERe score=100; //删除所有 score=100 并且 name="小明"的学员 DELETe FROM student WHERe score=100 AND name='小明'; 6、删除数据表 DROp TABLE 表名; 注意:表的结构一般是在设计阶段就设计好的 一般情况下不会中途修改表的结构 7、删除一列 sqlite3 不允许直接删除一列 1)先创建一张新表 CREATE TABLE temp AS SELECT id,name FROM student; 2)删除原来的旧表 DROp TABLE student; 3)对新表重命名 ALTER TABLE temp RENAME TO student; 8、添加一列 //在表student中添加一个字段 sex 类型为 CHAR ALTER TABLE student ADD COLUMN sex CHAR; 9、主键 ----重点PRIMARY KEY 建表时将某个字段设置成 主键 表示后续插入操作不允许主键冲突 CREATE TABLE student(id INT PRIMARY KEY, name CHAR, score INTEGER);1.3 sqlite3常用的API接口
1.打开数据库文件的函数 int sqlite3_open( const char *filename, sqlite3 **ppDb ); 功能:打开一个数据库 参数:filename 数据库名字 ppdb 操作数据库的句柄。 返回值: 成功 SQLITE_OK 失败 error_code 2.获取错误信息描述 const char *sqlite3_errmsg(sqlite3* db); 功能:获取最后一次的出错信息 参数:db 数据库句柄 返回值:指向错误信息字符串的指针 3.执行sql语句的函数 int sqlite3_exec(sqlite3* db, const char *sql, int (*callback)(void*,int,char**,char**), void * arg, char **errmsg); 功能:执行一条sql语句 参数: db 数据库的句柄指针 sql 将要被执行sql语句 callback 回调函数, 只要查询语句会用到回调函数 arg 为callback 传参的,只有在查询语句时,才给回调函数传参 errmsg 错误信息的地址 如果使用了errmsg参数,需要调用 sqlite3_free 来释放空间 返回值: 成功 SQLITE_OK 出错 errcode ------------------------------------- sqlite3_exec 的回调函数 int (*callback)(void* arg ,int ncolumn , char** f_value, char** f_name) 功能: 得到查询结果 参数: arg 为回调函数传递参数使用的 不传参可以置NULL ncolumn 记录中包含的字段的数目 f_value 包含每个字段值的指针数组 f_name 包含每个字段名称的指针数组 返回值: 成功 0 出错 非0 4.关闭数据库句柄 int sqlite3_close(sqlite3* db); 5.sqlite3_get_table函数 int sqlite3_get_table( sqlite3 *db, const char *zSql, char ***pazResult, int *pnRow, int *pnColumn, char **pzErrmsg); 功能: 查询数据库,它会创建一个新的内存区域来存放查询的结果信息 参数: db 数据库操作句柄 sql 数据库的sql语句 azResult 查询的结果 nRow 行数 nColumn 列数 errmsg 错误消息 返回值: 成功 SQLITE_OK 出错 errcode 6.释放由sqlite3_get_table产生的结果集 void sqlite3_free_table(char **result);1.4 关于sqlite3_exec函数的回调函数的结果集
在此代码中这个两个主要是用来查找操作,具体怎么操作在下面的代码中都有展现。
1.4.1以表结构及记录如下图为例第一次调用callback
第二次调用callback
1.4.2 关于sqlite3_get_table获得的结果集
1.5代码说明
#include#define DATABASE "tudent.db" int flag=0; void print_menu() { printf("-------------------------------------------n"); printf("| 1.添加 2.修改 3.查找 4.删除 5.退出 |n"); printf("-------------------------------------------n"); printf("input your choose : "); } sqlite3 *proc_init() { sqlite3 *my_db=NULL; int ret=0; ret=sqlite3_open(DATABASE,&my_db); if(SQLITE_OK!=ret){ printf("errcode:[%d] errstr:[%s]n",ret,sqlite3_errmsg(my_db)); exit(-1); } printf("打开数据文件[%s]成功n",DATABASE); char *errstr=NULL; char sqlstr[128]="create table if not exists stu(id int primary key,name char,score int)"; if(SQLITE_OK!=(ret=sqlite3_exec(my_db,sqlstr,NULL,NULL,&errstr))){ printf("errcode=[%d] errstr:[%s]n",ret,errstr); exit(-1); } printf("建表完成n"); sqlite3_free(errstr); return my_db; } int add_student(sqlite3 *my_db) { int input_id=0; char input_name[32]={0}; int input_score=0; printf("请输入要添加的学员的信息(学号 姓名 成绩):"); scanf("%d%s%d",&input_id,input_name,&input_score); char sqlstr[128]={0}; sprintf(sqlstr,"insert into stu values(%d,'%s',%d)",input_id,input_name,input_score); int ret=0; if(SQLITE_OK!=(ret=sqlite3_exec(my_db,sqlstr,NULL,NULL,NULL))){ printf("errcode:[%d] errstr:[%s]n",ret,sqlite3_errmsg(my_db)); exit(-1); } printf("学员信息插入成功n"); return 0; } int modify_stuent(sqlite3 *my_db) { int modify_id=0; char new_name[32]={0}; int new_score=0; printf("请输入你要修改的学员的id:"); scanf("%d",&modify_id); printf("请输入新的名字和成绩 name score:"); scanf("%s%d",new_name,&new_score); char sqlstr[128]={0}; sprintf(sqlstr,"update stu set name='%s',score=%d where id=%d",new_name,new_score,modify_id); int ret=0; if(SQLITE_OK!=(ret=sqlite3_exec(my_db,sqlstr,NULL,NULL,NULL))){ printf("errcode:[%d] errstr[%s]n",ret,sqlite3_errmsg(my_db)); exit(-1); } printf("学员信息修改成功n"); return 0; } int delete_student(sqlite3 *my_db) { int delete_id=0; printf("请输入你要删除的学员id:"); scanf("%d",&delete_id); char sqlstr[128]={0}; sprintf(sqlstr,"delete from stu where id=%d",delete_id); int ret=0; if(SQLITE_OK!=(ret=sqlite3_exec(my_db,sqlstr,NULL,NULL,NULL))){ printf("errcode:[%d] errstr:[%s]n",ret,sqlite3_errmsg(my_db)); exit(-1); } printf("学员被删除n"); return 0; } int callback(void *arg,int column,char **f_value,char **f_name) { int i=0; if(0==flag){ for(i=0;i



