1.数据库的操作
1.1系统命令
.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 <head.h>
#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<column;i++){
printf("%10s",f_name[i]);
}
printf("\n");
flag=1;
}
for(i=0;i<column;i++){
printf("%10s",f_value[i]);
}
printf("\n");
return 0;
}
int search_student_1(sqlite3 *my_db)
{
char sqlstr[128]="select * from stu";
int ret=0;
if(SQLITE_OK!=(ret=sqlite3_exec(my_db,sqlstr,callback,NULL,NULL))){
printf("errcode:[%d] errstr:[%s]\n",ret,sqlite3_errmsg(my_db));
exit(-1);
}
flag=0;
printf("查询所有成员信息成功\n");
return 0;
}
int search_student_2(sqlite3 *my_db)
{
char sqlstr[128]="select * from stu";
char **result=NULL;
int row=0;
int column=0;
int ret=0;
if(SQLITE_OK!=(ret=sqlite3_get_table(my_db,sqlstr,&result,&row,&column,NULL))){
printf("errcode:[%d] errstr:[%s]\n",ret,sqlite3_errmsg(my_db));
exit(-1);
}
int i=0;
for(i=0;i<column;i++){
printf("%10s",result[i]);
}
printf("\n");
int j=0;
int index=i;
for(i=0;i<row;i++){
for(j=0;j<column;j++){
printf("%10s",result[index++]);
}
}
printf("\n");
sqlite3_free_table(result);
return 0;
}
int main(int argc, char const *argv[])
{
sqlite3 *my_db=proc_init();
int choose=0;
while(1){
print_menu();
scanf("%d",&choose);
switch(choose){
case 1:
add_student(my_db);
break;
case 2:
modify_stuent(my_db);
break;
case 3:
// search_student_1(my_db);
search_student_2(my_db);
break;
case 4:
delete_student(my_db);
case 5:
printf("欢迎下次光临\n");
break;
}
if(choose==5){
break;
}
}
return 0;
}
版权归原作者 lhb2998658795 所有, 如有侵权,请联系我们删除。