偶尔会使用sqlite数据库,不是经常用,但用的时候,总是想不全命令,所以写下这篇算是笔记吧!以后方便复习和使用sqlite数据库。
sqlite可视化相关软件参考地址:
https://blog.csdn.net/qq_27248989/article/details/80279585
- 在线安装:sudo apt-get install sqlite3
- 如果在编程时,错误提示找不到sqlite3.h文件,则需安装库文件:sudo apt-get install libsqlite3 - dev
- 安装库工具Sqlite database browser<以表格形式显示库,便于查看与操作>:sudo apt-get install sqlitebrowser
- 编程中编译需要连接库:-lsqliite3
1、 .sql -> .db
//在终端输入“sqlite3 数据库名.db”进入sqlite3命令行;
//执行sql语句生成db文件:
sqlite> .read 数据库名.sql
sqlite> .exit
2、 .db -> .sql
//在终端输入“sqlite3 数据库名.db”进入sqlite3命令行;
//执行sql语句生成sql文件:
sqlite> .output 数据库名.sql
sqlite> .dump //导出整个数据库
//sqlite> .dump tb1 //导处tb1表
sqlite> .exit
一、系统命令(以“.”开头的命令)
二、sqlite命令
(一)、创建或打开一个数据库
sqlite3 wangl.db //创建并打开wangl.db数据库
(二)、创建数据库表
create table stu(nu integer,name char,score float);//创建stu表
create table stu(nu integer primary key,name char,score float);//将nu作为主键不能插入相同的数据
(三)插入数据
insert into stu values(1,"wangliang",99);
insert int stu(nu,score) values(2,45);
insert into stu(name) values("xiaoming");
(四)、查询数据
select *from stu;
select nu from stu;
select nu,name from stu;
select *from stu where nu=1;
select *from stu where name="wangliang";//查询name="wangl"的数据
select nu,name from stu where score<60;
select *from stu where score>60 and nu<4;
select *from stu where score>60 or nu=2;
SELECT *FROM stu order by name asc //如果是字符按字母顺序,如果是数值按大小(升序)
select * from stu where nu >=10 and nu<=15 order by nu desc//降序
LIKE 运算符是用来匹配通配符指定模式的文本值。如果搜索表达式与模式表达式匹配,LIKE 运算符将返回真(true),也就是 1。这里有两个通配符与 LIKE 运算符一起使用:
/**************************
1|xiaoming|99.0
2|xiaohong|97.0
3|xiaofang|93.0
4|xiaoxia|88.0
5|xiaowang|80.0
**************************/
select *from stu where name like 'xiao%';
select *from stu where name like '%g';
select *from stu where name like '%h%';
select *from stu where name like 'xiao_ing';
(五)删除表
drop table stu;
delete from stu;
delete from stu where nu=3;
不支持直接删除一列,但可以间接删除
create table stu1 as select nu,name from stu;//赋值stu表中指定列到stu1表
drop table stu;//删除原表stu
alter table stu1 rename to stu;//将新表名改为原表名
(六)修改表
update stu set name="xiaohong" where nu=1;
update stu set Id=Id-1 where Id>2
(七)、增加表的内容
alter table stu add QQ integer;
alter table stu add weixin text;
(八)、查看数据库中是否包含某个表
sqlite会自动维护一个系统表sqlite_master,该表存储了我们所创建的各个table, view, trigger等等信息。
sqlite_master表结构如下:
CREATE TABLE sqlite_master (
type TEXT, //类型取值一般为table
name TEXT, //表名
tbl_name TEXT, //表名
rootpage INTEGER,
sql TEXT //创建表或者视图的sql语句,可以从该sql语句中判断某字段是否存在
);
查询某个表是否存在命令:
SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='查询的表名';//value(0).toBool()//第一个有值就有此表
查询sqlite中所有表:
select name from sqlite_master where type='table' order by name;
一、打开sqlite数据库
int sqlite3_open(char *path,sqlite3 **db);
path --- 路径/库文件
db --- 指向sqlite句柄指针
返回值:0 --- 成功
失败返回错误码
ret = sqlite3_open("my.db", &db);
if (ret != SQLITE_OK)
{
fprintf(stderr, "open : %s\n", sqlite3_errmsg(db));
return -1;
}
二、关闭sqlite数据库
int sqlite3_close(sqlite3 *db)
(一)sqlite3_exec()
int sqlite3_exec(sqlite3 *db,const char *sql,sqlite3_callback callback,void *,char **errmsg)
db --- 数据库句柄
sql --- SQL语句
callback --- 回调函数
errmsg --- 错误信息指针的地址
int callback(void *para, int f_num, char **f_value, char **f_name) //
{
int i;
for (i = 0; i < f_num; i++)
printf("%s : %s\n", f_name[i], f_value[i]);//f_name为数据库数据名、f_value为数据库数据值
return 0;
}para --- 传递给回调函数的参数
f_num --- 记录包含字段数(列数)
f_value --- 包含每个字段值得指针数组
f_name --- 包含每个字段名称的指针数组
(二)sqlite3_get_table()
int sqlite3_get_table(sqlite3 *db,const char *sql,char ***resultp,int *nrow,int *ncolumn,char **errmsg)
db --- 数据库句柄
sql --- SQL语句
nrow --- 行
ncolumn --- 列
errmsg --- 错误信息指针的地址
(三)程序实现
#include
#include
#include
#include
/*
* 何时调用callback函数:表中要要查询的数据的时候;
* 查询到有几条,函数调用几次;
*/
int callback(void *para, int f_num, char **f_value, char **f_name)
{
int i;
for (i = 0; i < f_num; i++)
printf("%s : %s\n", f_name[i], f_value[i]);
return 0;
}
int main()
{
int ret;
sqlite3 *db;
char *errmsg;
char sql[128];
/* 打开数据库文件 */
ret = sqlite3_open("wl.db", &db);
if (ret != SQLITE_OK) {
fprintf(stderr, "open : %s\n", sqlite3_errmsg(db));
return -1;
}
/* 创建表 */
sprintf(sql, "create table stu(nu Integer primary key, name char, score float)");
ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
if (ret != SQLITE_OK) {
fprintf(stderr, "create fail : %s\n", errmsg);
return -1;
}
/* 插入数据 */
int nu = 1;
char name[20] = "xiai";
float score = 89;
sprintf(sql, "insert into stu values(%d, '%s', %f)", nu, name, score);
ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
if (ret != SQLITE_OK) {
fprintf(stderr, "create fail : %s\n", errmsg);
return -1;
}
/* 修改数据 */
nu = 1;
strcpy(name, "xiaowang");
sprintf(sql, "update stu set name='%s' where nu='%d'", name, nu);
ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
if (ret != SQLITE_OK) {
fprintf(stderr, "create fail : %s\n", errmsg);
return -1;
}
/* 查询数据 */
#if 0
char test[20];
sprintf(sql, "select * from stu");
ret = sqlite3_exec(db, sql, callback, test, &errmsg);
if (ret != SQLITE_OK) {
fprintf(stderr, "create fail : %s\n", errmsg);
return -1;
}
#else
char **result;
int row;
int column;
sprintf(sql, "select * from stu");
ret = sqlite3_get_table(db, sql, &result, &row, &column, &errmsg);
if(ret != SQLITE_OK) {
fprintf(stderr, "select fail : %s\n", errmsg);
return -1;
}
printf("row = %d, column = %d\n", row, column);
int i;
int j;
result += column;
for (i = 0; i < row; i++) {
for (j = 0; j< column; j++) {
printf("%s ", *result++);
}
printf("\n");
}
#endif
sqlite3_close(db);
}
除了一些基本的数据类型,还可以存储下列类型: