一、启动与退出
- 启动 SQLite3:
- 使用命令
sqlite3 xxx.db
可以打开一个名称为xxx.db
的本地数据库。出现sqlite>
提示符表明数据库管理系统启动。 - 例如:
sqlite3 test.db
。
- 使用命令
- 退出数据库:
- 使用
.q
命令退出。如果一直出现...>
符号,则写;
结束当前输入后再使用.q
命令退出。
- 使用
二、数据库创建与维护
- 创建一个数据库:
- 方法一:使用
touch xxx.db
创建一个空文件,然后使用sqlite3 xxx.db
启动数据库管理系统并关联该文件。 - 方法二:直接使用
sqlite3 xxx.db
,如果文件不存在,会自动创建一个新的数据库文件。
- 方法一:使用
- 系统维护命令:
.help
:列出所有相关的系统维护命令,都是以 “.” 开头。.database
:列出当前库和系统中哪个文件在关联。.tables
:列出当期数据库中的所有表。.schema xxx
:列出当前指定的xxx
表结构。- 数据导出:
sqlite3 test.db.dump > 123.sql
,将数据库名称为test
的数据库整体导出到脚本中。 - 数据导入:
sqlite3 xxx.db < test.sql
,将脚本中的数据导入到数据库xxx.db
中。
这里的 > :表示输出重定向 < :表示输入重定向。
三、标准 SQL 语句
-
创建表:
- 语法:
create table 表名(表字段 1 类型,表字段 2 类型,...)
。 - 支持的数据类型有
int
(整数)、text
(无大小限制)、real
(小数)、blob
(二进制数据),默认是text
类型。 - 例如:
create table user(id int,name char,age int)
。
- 语法:
-
删除表:
- 语法:
drop table 表名
。 - 例如:
drop table user
。
- 语法:
-
向表中增加数据:
- 语法一:
insert into 表名 (字段名称) values (值名称)
。 - 例如:
insert into user (id,age) values (1,10)
。 - 语法二:
insert into 表名 values(值 1,值 2,...)
。 - 例如:
insert into user values(3,"wang",11)
。
- 语法一:
-
查询表中的数据:
- 语法:
select 列名 from 表名 [条件]
,条件不是必须。 - 例如:
select * from user
(查看所有列)。select id from user
。select id,name from user where age<25
。where name like '三一'
(%
和_
为通配符)。select * from user where age>20 or age<50 order by age desc limit 2
。
- 语法:
-
修改表中数据:
- 语法:
update 表名 set 表字段 = 值 [满足条件]
。 - 例如:
update user set id = 1 where name = 'li'
。update user set id = 1 where name = "li" and passwd = "123"
。update user set id = 2 where name = "li" or name = "zhao"
。
- 语法:
-
删除表中数据:
- 语法:
delete from 表名 [满足条件]
。 - 例如:
delete from user
(删除表中所有数据)。delete from user where id = 1
(删除id=1
的数据)。delete from user where id =1 and name = "zhang"
。delete from user where id = 1 or id = 2
。
- 语法:
四、补充内容
- 时间列的处理:
- 可以在表中添加时间列,例如
CREATE TABLE user1(id int,name char,age int,dt datetime)
。 - 插入时间值可以使用
datetime('now','+8 hours')
获取当前时间加上 8 小时的时间值。 - 例如:
insert into user1 values (2,'张三',23,datetime('now','+8 hours'))
。
- 可以在表中添加时间列,例如
- 自动增长列:
- 创建表时可以将一个整数列设置为主键并指定自增长属性,例如
CREATE TABLE user3(id INTEGER PRIMARY KEY ASC,name char,age int,dt datetime)
。 - 插入数据时可以使用
NULL
作为该列的值,数据库会自动分配一个自增长的值。例如:insert into user3 (NULL,'李四',23,datetime('now'))
。
- 创建表时可以将一个整数列设置为主键并指定自增长属性,例如
数据库编程
一、sqlite3_open
int sqlite3_open(const char *filename, sqlite3 **ppDb);
- 功能:这个函数用于打开一个 SQLite 数据库文件。如果数据库文件不存在,SQLite 可能会根据具体情况创建一个新的数据库文件。
- 参数:
filename
:指向要打开的数据库文件名的字符串。可以是相对路径或绝对路径。ppDb
:是一个指向sqlite3
结构体指针的指针。函数成功执行后,这个指针将指向一个打开的数据库连接。
- 返回值:
- 如果成功打开数据库,函数返回
SQLITE_OK
(0)。 - 如果发生错误,返回一个错误码。
- 如果成功打开数据库,函数返回
二、sqlite3_exec
int sqlite3_exec(sqlite3*, const char *sql, int (*callback)(void*,int,char**,char**), void *, char **errmsg );
- 功能:用于执行一条或多条 SQL 语句。可以执行各种 SQL 操作,如创建表、插入数据、查询数据、更新数据、删除数据等。
- 参数:
sqlite3*
:一个打开的数据库连接指针。sql
:要执行的 SQL 语句字符串。可以是单个 SQL 语句或多个 SQL 语句的序列,以分号分隔。callback
:一个回调函数,每当执行一个查询语句并返回结果时,这个回调函数会被调用。如果不需要处理查询结果,可以设置为NULL
。void *
:一个用户提供的指针,可以在回调函数中使用,通常用于传递上下文信息。errmsg
:如果发生错误,这个指针将被设置为指向一个包含错误信息的字符串。
- 返回值:
- 如果成功执行 SQL 语句,函数返回
SQLITE_OK
(0)。 - 如果发生错误,返回一个错误码。
- 如果成功执行 SQL 语句,函数返回
三、sqlite3_close
int sqlite3_close(sqlite3*);
- 功能:用于关闭一个之前打开的 SQLite 数据库连接。
- 参数:
sqlite3*
:要关闭的数据库连接指针。
- 返回值:
- 如果成功关闭数据库连接,函数返回
SQLITE_OK
(0)。 - 如果发生错误,返回一个错误码。
- 如果成功关闭数据库连接,函数返回
代码示例
#include <stdio.h>
#include <sqlite3.h>
// 定义回调函数 show,用于处理查询结果
int show(void* arg, int col, char** result, char** title)
{
// static 变量 flag,用于标记是否是第一次调用该函数
static int flag = 0;
int i;
// 如果是第一次调用
if (flag == 0)
{
// 遍历列数
for (i = 0; i < col; i++)
{
// 打印列名
printf("%s\t", title[i]);
}
// 换行
printf("\n");
// 将 flag 置为 1,表示不是第一次调用了
flag = 1;
}
// 遍历列数
for (i = 0; i < col; i++)
{
// 打印查询结果中的每一项
printf("%s\t", result[i]);
}
// 换行
printf("\n");
// 返回 0,表示继续处理下一行结果(如果有)
return 0;
}
int main()
{
sqlite3* db;
// 尝试打开数据库文件 /home/linux/Desktop/0904/aaa.db,并将数据库连接指针存储在 db 中
int ret = sqlite3_open("/home/linux/Desktop/0904/aaa.db", &db);
if (ret!= SQLITE_OK)
{
// 如果打开失败,打印错误信息
fprintf(stderr, "sqlite3_open error,%s\n", sqlite3_errstr(ret));
// 关闭数据库连接
sqlite3_close(db);
return 1;
}
char *errmsg;
// 定义 SQL 查询语句,这里是查询表 user 中的所有数据
char sqlite3_cmd[] = "select * from user;";
// 执行 SQL 查询语句,将查询结果通过回调函数 show 进行处理,参数 NULL 表示没有额外的用户数据传递给回调函数,errmsg 用于存储错误信息
ret = sqlite3_exec(db, sqlite3_cmd, show, NULL, &errmsg);
if (ret!= SQLITE_OK)
{
// 如果执行查询失败,打印错误信息
fprintf(stderr, "exec error,%s\n", errmsg);
// 释放错误信息占用的内存
sqlite3_free(errmsg);
// 关闭数据库连接
sqlite3_close(db);
return 1;
}
// 关闭数据库连接
sqlite3_close(db);
// 打印 "Hello World!"
printf("Hello World!\n");
return 0;
}