sqlite3 关系型数据库,体积小。
特性:轻量级数据库,体积小,占用资源少,无需安装和管理配置。
缺点:不会进行严格的类型检查
多表联合查询:https://www.jianshu.com/p/053488e520e7
sqlite3基本命令:
创建数据库:sqlite3 student.db
(参考原文:https://blog.csdn.net/sinat_36184075/article/details/80587796 )
eg:
创建一个公司员工信息表company,
列包含:ID、姓名、年龄、地址、薪资
sqlite> CREATE TABLE company(
...> id INT PRIMARY KEY NOT NULL,
...> name TEXT NOT NULL,
...> age INT NOT NULL,
...> address TEXT,
...> salary REAL NOT NULL);
sqlite> .table ---> ' .table ' // 查看表的名字 .ta
company
sqlite> .schema ---> ' .schema ' // 查看创建表详细信息 .sc
CREATE TABLE company(
id INT PRIMARY KEY NOT NULL,
name TEXT NOT NULL,
age INT NOT NULL,
address TEXT,
salary REAL NOT NULL);
'[约束]':
PRIMARY KEY // 主键约束,数据唯一,并且可以加快数据访问
NOT NULL // 非空,限制插入数据不能为空
'类型关键字':
INT 整型
TEXT 文本字符串
REAL 浮点数
以下参考原文:https://www.bilibili.com/video/av35056774/
1- 系统命令
以 ‘ . ’开头的命令
.help 帮助
.quit 退出
.exit 退出
.schema 查看表结构
.databases 查看打开的数据库
.table 查看数据库中的表
2- sql命令
基本sql命令不以 ' . ' 开头 , 以 ; 结尾
创建一张数据库表: create table 表名 (字段 类型) ;
create table stu(id Integer, name char, score Integer) ;
插入一条记录: insert into 表名 values(数据)
insert into stu values (1001, 'zhangsan', 80) ; //全字段对应插入
insert into stu (id, name)values(1002, 'wangwu') ; //部分字段插入
查询记录: select 字段 from 表名 where 限制条件 ;
select * from stu; //查询表中所有字段的结果
select name, score from stu; //查询表中部分字段的结果
select * from stu where score = 80;
select * from stu where score = 80 and name = 'zhangsan' ;
select * from stu where score = 80 or name = 'wangwu' ;
删除一条记录:delete from 表名 where 条件限制 ;
delete from stu where score = 80 ;
更新一条记录:update 表名 set 修改的字段 = 修改后的值 where 条件限制 ;
update stu set name = 'lisi' where id = 1001 ;
update stu set name = 'wangwu', score = 88 where id = 1002 ;
插入一列:alter table 表名 add column 字段名 类型 ;
alter table stu add column address char ;
删除一列
sqlite3 不支持直接删除一列,采用以下步骤
1-- 创建一张新表: create table 新表名 as select 字段 from 旧表名 ;
create table stu1 as select id, name, score from stu ;
2-- 删除旧表: drop table 表名 ;
drop table stu ;
3-- 将新表名改为原有的旧表名:alter table 表名 rename to 新表名 ;
alter table stu1 rename stu ;
查询数据库时,也可以将多个表的内容放在一起进行查询
select student.name from student, score where student.id = score.id and score.score < 60;
上述语句中,from关键字后出现了两个表名student和score,表示对这两个表进行联合查询。
可以使用表的别名以避免多次输入较长的表名,使代码更清晰
select A.name from student A, score B where A.id = B.id and B.score < 60;
上述语句中,from关键字后的表名都指定了一个别名。
注意:别名只在当前语句中有效。
sqlite3 API 接口
int sqlite3_open (char *path, sqlite **db);
功能:打开sqlite数据库
参数: path:数据库路径
db:指向数据库的句柄
返回值:成功返回SQLITE_OK,失败返回错误码
int sqlite3_close (sqlite *db);
功能:关闭sqlite数据库
返回值:成功返回SQLITE_OK,失败返回错误码
const char *sqlite3_errmg (sqlite3 *db);
功能:通过db获取返回的错误信息
返回值:错误信息的首地址
int sqlite3_exec(sqlite *db, const char *sql, int (*callback)(void *arg, char **, char **), void *arg, char **errmg);
功能:执行一条sql语句
参数: db 数据库操作句柄
sql 一条sql语句
callback 回调函数(只有sql为查询语句的时候才执行此语句)
arg 表示给回调函数传参
errmsg 错误消息
int (*callback)(void *para, int f_num, char **f_values, char **f_name)
功能:每找到一条记录自动执行一次回调函数
参数: para:传递给回调函数的参数
f_num:记录中包含的字段数目
f_values:包含每个字段值的指针数组
f_name:包含每个字段名称的指针数组
返回值:成功返回SQLITE_OK,失败返回-1
int sqlite3_get_table(sqlite3 *db, const char *sql, char ***resultp, int *nrow, int *ncolumn, char **errmsg)
参数: db:句柄
sql:sql语句
resultp:存储查询到的结果,格式:全部字段名紧跟着每个为字段的值
nrow :查询出多少记录,即行的数目
ncolumn:字段数目,即列的数目
errmsg:错误信息指针地址
返回值:成功返回0,失败返回失败码
简单的sqlite3数据库操作程序(编译时链接库 -lsqlite3)
#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>
#define DATABASE "sqlite_test.db"
int callback(void *para, int f_num, char **f_values, char **f_name)
{
int i;
for(i = 0; i < f_num; i++)
{
printf("%s:%-11s", f_name[i], f_values[i]);
}
printf("\n");
return 0;
}
int do_insert(sqlite3 *db)
{
int id;
char name[32] = {};
int score;
char sql[128] = {};
char *errmsg;
printf("Input id:");
scanf("%d", &id);
getchar();
printf("Input name:");
scanf("%s", name);
getchar();
printf("Input score:");
scanf("%d", &score);
getchar();
sprintf(sql, "insert into stu values(%d, '%s', %d);", id, name, score);
if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("%s\n", errmsg);
}
else
{
printf("insert done\n");
}
return 0;
}
int do_delete(sqlite3 *db)
{
int id;
char sql[128];
char *errmsg;
printf("Input id:");
scanf("%d", &id);
getchar();
sprintf(sql, "delete from stu where id = %d;", id);
if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("%s\n", errmsg);
}
else
{
printf("delete done\n");
}
return 0;
}
int do_update(sqlite3 *db)
{
int id;
int score;
char sql[128];
char *errmsg;
printf("input id:");
scanf("%d", &id);
getchar();
printf("input score:");
scanf("%d", &score);
getchar();
sprintf(sql, "update stu set score = %d where id = %d;", score, id);
if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("%s\n", errmsg);
}
else
{
printf("update done\n");
}
}
/*
int do_query(sqlite3 *db)
{
char sql[128] = {};
char *errmsg;
sprintf(sql, "select * from stu");
if(sqlite3_exec(db, sql, callback, NULL, &errmsg) != SQLITE_OK)
{
printf("%s\n", errmsg);
}
return 0;
}
*/
int do_query(sqlite3 *db)
{
char sql[128] = {};
char **resultp;
int nrow;
int ncolumn;
char *errmsg;
int i, j, k;
sprintf(sql, "select id from stu");
if(sqlite3_get_table(db, sql, &resultp, &nrow, &ncolumn, &errmsg) != SQLITE_OK)
{
printf("%s\n", errmsg);
}
for(i = 0; i < ncolumn; i++)
{
printf("%s\t", resultp[i]);
}
printf("\n");
j = nrow;
k = 1;
while(j-- > 0)
{
for(i = k * ncolumn; i < (k + 1) * ncolumn; i++)
{
printf("%s\t", resultp[i]);
}
printf("\n");
k++;
}
}
int main()
{
sqlite3 *db;
char *sql;
char *errmsg;
int cmd;
if(sqlite3_open(DATABASE, &db) != SQLITE_OK)
{
printf("%s\n", sqlite3_errmsg(db));
return -1;
}
else
{
printf("Open DATABASE success\n");
}
if(sqlite3_exec(db, "create table stu (id Int Primary key, name Text, score Int);", NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("%s\n", errmsg);
}
else
{
printf("create or open success\n");
}
while(1)
{
printf("******************\n");
printf("1:insert 2.delete 3.query 4.update 5.exit\n");
printf("******************\n");
printf("input CMD:");
scanf("%d", &cmd);
getchar();
switch(cmd)
{
case 1:
do_insert(db);
break;
case 2:
do_delete(db);
break;
case 3:
do_query(db);
break;
case 4:
do_update(db);
break;
case 5:
sqlite3_close(db);
exit(0);
default:
printf("input Error\n");
}
}
return 0;
}