SQLite
在Ubuntu安装sqlite数据库
在线安装:sudo apt-get install sqlite3 libsqlite3-dev
打开数据文件:
sqlite3 filename.db (数据库文件名一般是以 .db 结尾)
系统命令
.help 打开帮助文档
.open 打开数据库文件
.quit 退出数据库 .q 也可以
.exit 退出数据库
.tables 查看当前数据库文件中有哪些数据表
.schema 查看建表语句(表的结构)
.headers on|off 是否显示表头信息
SQL语句
1. 建表
CREATE TABLE 表名(字段名1 字段的类型1, ..., 字段n 字段类型n);
字段类型 :
整型 INT 或者 INTEGER
字符串 CHAR 或者 TEXT
eg:
CREATE TABLE student(id INT, name CHAR, score INTEGER);
2. 向表中插入数据
- INSERT INTO 表名 VALUES(逗号分隔的字段的值);必须从左到右给每个字段赋值
INSERT INTO student VALUES(1001, "张三", 99);
- INSERT INTO 表名(字段名) VALUES(字段的值);可以只给几个字段赋值
INSERT INTO student(id,name) VALUES(1002, "李四");
注意 : 如果是字符串要用 单引号 或者 双引号 引起来
3. 查询表中的记录
SELECT * FROM student; * 表示查询表中所有字段
SELECT id,name FROM student; 只查询 id 和 name
SELECT * FROM student WHERE score=98; 只查询 score 为 98 的记录
SELECT * FROM student WHERE name="李四"; 字符串要加 引号
SELECT * FROM student WHERE score=99 AND id=1001; 查询score是99并且 id是1001 的记录
SELECT * FROM student WHERE score=99 OR name="李四";查询score是99 或者 name是李四 的记录
对查询到的结果进行排序 ,ORDER BY 根据哪个字段排序
默认是 升序 ASC升序 DESC 降序
SELECT * FROM student ORDER BY score DESC;
4. 修改(更新)记录的内容
将student表中 id 为1001 的记录中的 名字改成 小小 成绩改成 0 分
UPDATE student SET name="小小",score=0 WHERE id=1001;
5.删除记录
DELETE FROM student WHERE id=1001;将id为1001的记录在 student 表中删除
6.删除表
DROP TABLE 表名;
7.添加一列
ALTER TABLE student ADD COLUMN sex text;在student表中添加一个字段 sex
8.删除一列
sqlite3 不允许直接删除一列
1)先创建一张新
create table stu1 as select id,name from stu;少了score列
2)删除原来的旧表
drop table stu;
3)对新表重命名
alter table stu1 rename to stu;
9.表的主键
如果设置了某个字段为主键,那么该字段就不允许重复
CREATE TABLE student(id INT PRIMARY KEY, name TEXT, score INT);
SQLite数据库常用的API接口函数
sqlite3 函数的头文件 sqlite3.h
编译是要链接 sqlite3 的库 -lsqlite3
1.打开一个数据库文件—sqlite3_open
- int sqlite3_open(const char *filename, sqlite3 **ppDb );
- 功能:
- 打开一个数据库文件,存在直接打开 不存在 新建并打开
- 参数:
- filename 数据库文件名字
- ppdb 操作数据库的指针,句柄
- 返回值:
- 成功 SQLITE_OK
- 失败 error_code
复制代码
eg:
sqlite3 *sql_db = NULL;
int ret = sqlite3_open("NO1.db", &sql_db);
2.获取最后一次错误信息的函数—sqlite3_errmsg
- const char *sqlite3_errmsg(sqlite3* db);
- 功能:获取错误信息描述
复制代码
eg:
printf("错误信息[%s]\n", sqlite3_errmsg(sql_db));
3.执行sql语句的函数—sqlite3_exec
- 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 错误信息的地址 如果使用了这个参数
- 需要用sqlite3_free() 函数释放空间!!!!!!!!!!
- 返回值:
- 成功 SQLITE_OK
- 出错 errcode 错误码
复制代码
注意:
&errstr → printf("errmsg[%s]\n", errstr);错误信息打印方式
eg:
- > IF NOT EXISTS 表不存在则创建 表存在则直接使用,而不是报错;引号里面sql语句后面不用加分号
- > char *errstr = NULL;
- > char buff[128] = "CREATE TABLE IF NOT EXISTS student(id INT PRIMARY KEY, name CHAR, score INT)";建表
- > ret = sqlite3_exec(sql_db, buff, NULL, NULL, &errstr);
- > if(ret != SQLITE_OK){
- printf("errcode[%d] errmsg[%s]\n", ret, errstr);
- exit(-1);
- }
- > sqlite3_free(errstr); 释放错误信息的空间 防止内存泄漏
复制代码
sqlite3_exec的回调函数—callback
- int (*callback)(void* arg ,int ncolumn ,char** f_value,char** f_name)
- 功能:
- 得到查询结果
- 参数:
- arg 为回调函数传递参数使用的 --传递多个参数,使用结构体传参
- ncolumn 记录中包含的字段的数目 --表的结构 字段数
- f_value 包含每个字段值的指针数组 --字段值
- f_name 包含每个字段名称的指针数组-字段名(表头)
- 返回值:
- 成功 0
- 出错 非0
复制代码
eg:
- > 1.回调函数
- > int callback(void* arg ,int ncolumn , char** f_value, char** f_name)
- > {
- 每查询到一条记录 这个函数就会被调用一次
- return 0;//必须写返回值 否则报错
- > }
- >2.执行sql语句
- > char sql_buff[256] = {0};
- > sprintf(sql_buff,"SELECT * FROM student");查询
- > sqlite3_exec(sql_db, sql_buff, callback, NULL, NULL);
复制代码
4.查询结果的函数—sqlite3_get_table
- int sqlite3_get_table(sqlite3 *db, const char *sql, char ***pazResult,int *pnRow, int *pnColumn, char **pzErrmsg);
- 功能:
- 查询数据库,它会创建一个新的内存区域来存放查询的结果信息
- 使用完之后要 释放 ,否则内存泄漏 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- 参数:
- db 数据库操作句柄
- sql 数据库的sql语句
- pazResult 查询的结果集
- nRow 行数(不包括表头)
- nColumn 列数
- pzErrmsg 错误消息
- 返回值:
- 成功 0
- 出错 errcode
复制代码
eg:
- char **result = NULL; 结果集
- int row = 0; 行数
- int column = 0; 列数
- 1.sqlite3_get_table 内部会将 查询的到的结果的 行数写到row的地址里
- 会将 查询的到的结果的 列数写到column的地址里
- 2.会让 result 指向 sqlite3_get_table 申请的结果集的内存空间
- int ret = sqlite3_get_table(sql_db, sql_buff, &result, &row, &column, NULL);
- if(ret != SQLITE_OK)
- {
- printf("查询失败 errcode[%d] errmsg[%s]\n", ret, sqlite3_errmsg(sql_db));
- return;
- }
复制代码
5.释放 sqlite3_get_table()函数产生的结果集—sqlite3_free_table
- void sqlite3_free_table(char **result);
复制代码
eg:
sqlite3_free_table(result); 释放 结果集result 防止内存泄漏
6.关闭数据库句柄—sqlite3_close
- int sqlite3_close(sqlite3* db);
- 功能:关闭一个数据库
复制代码
eg:
sqlite3_close(sql_db);关闭sqlite3 句柄
注意:
1. 错误信息打印方式
sqlite3_exec(sql_db, buff, NULL, NULL, &errstr) → printf("errmsg[%s]\n", errstr)
sqlite3_free(errstr);释放错误信息errstr的空间 防止内存泄漏
sqlite3_exec(sql_db, buff, NULL, NULL, NULL) → printf("errmsg[%s]\n",sqlite3_errmsg(sql_db))
实例
基于SQLite数据库的学生管理系统 : 学生管理系统