[数据库] SQLite数据库

1539 0
Honkers 2025-3-8 08:35:39 | 显示全部楼层 |阅读模式

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

  1. int sqlite3_open(const char *filename, sqlite3 **ppDb );
  2. 功能:
  3. 打开一个数据库文件,存在直接打开 不存在 新建并打开
  4. 参数:
  5. filename 数据库文件名字
  6. ppdb 操作数据库的指针,句柄
  7. 返回值:
  8. 成功 SQLITE_OK
  9. 失败 error_code
复制代码

eg:

sqlite3 *sql_db = NULL;
int ret = sqlite3_open("NO1.db", &sql_db);

2.获取最后一次错误信息的函数—sqlite3_errmsg

  1. const char *sqlite3_errmsg(sqlite3* db);
  2. 功能:获取错误信息描述
复制代码

eg:

printf("错误信息[%s]\n", sqlite3_errmsg(sql_db));

3.执行sql语句的函数—sqlite3_exec

  1. int sqlite3_exec(sqlite3* db, const char *sql, int (*callback)(void*,int,char**,char**),void * arg, char **errmsg);
  2. 功能:
  3. 执行一条sql语句
  4. 参数:
  5. db 数据库的句柄指针
  6. sql 将要被执行sql语句
  7. callback 回调函数,只有在-查询语句-时,才给回调函数传参
  8. arg 为callback 传参的
  9. errmsg 错误信息的地址 如果使用了这个参数
  10. 需要用sqlite3_free() 函数释放空间!!!!!!!!!!
  11. 返回值:
  12. 成功 SQLITE_OK
  13. 出错 errcode 错误码
复制代码
注意:

&errstr → printf("errmsg[%s]\n", errstr);错误信息打印方式

eg:

  1. > IF NOT EXISTS 表不存在则创建 表存在则直接使用,而不是报错;引号里面sql语句后面不用加分号
  2. > char *errstr = NULL;
  3. > char buff[128] = "CREATE TABLE IF NOT EXISTS student(id INT PRIMARY KEY, name CHAR, score INT)";建表
  4. > ret = sqlite3_exec(sql_db, buff, NULL, NULL, &errstr);
  5. > if(ret != SQLITE_OK){
  6. printf("errcode[%d] errmsg[%s]\n", ret, errstr);
  7. exit(-1);
  8. }
  9. > sqlite3_free(errstr); 释放错误信息的空间 防止内存泄漏
复制代码
sqlite3_exec的回调函数—callback
  1. int (*callback)(void* arg ,int ncolumn ,char** f_value,char** f_name)
  2. 功能:
  3. 得到查询结果
  4. 参数:
  5. arg 为回调函数传递参数使用的 --传递多个参数,使用结构体传参
  6. ncolumn 记录中包含的字段的数目 --表的结构 字段数
  7. f_value 包含每个字段值的指针数组 --字段值
  8. f_name 包含每个字段名称的指针数组-字段名(表头)
  9. 返回值:
  10. 成功 0
  11. 出错 非0
复制代码

eg:

  1. > 1.回调函数
  2. > int callback(void* arg ,int ncolumn , char** f_value, char** f_name)
  3. > {
  4. 每查询到一条记录 这个函数就会被调用一次
  5. return 0;//必须写返回值 否则报错
  6. > }
  7. >2.执行sql语句
  8. > char sql_buff[256] = {0};
  9. > sprintf(sql_buff,"SELECT * FROM student");查询
  10. > sqlite3_exec(sql_db, sql_buff, callback, NULL, NULL);
复制代码

4.查询结果的函数—sqlite3_get_table

  1. int sqlite3_get_table(sqlite3 *db, const char *sql, char ***pazResult,int *pnRow, int *pnColumn, char **pzErrmsg);
  2. 功能:
  3. 查询数据库,它会创建一个新的内存区域来存放查询的结果信息
  4. 使用完之后要 释放 ,否则内存泄漏 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  5. 参数:
  6. db 数据库操作句柄
  7. sql 数据库的sql语句
  8. pazResult 查询的结果集
  9. nRow 行数(不包括表头)
  10. nColumn 列数
  11. pzErrmsg 错误消息
  12. 返回值:
  13. 成功 0
  14. 出错 errcode
复制代码

eg:

  1. char **result = NULL; 结果集
  2. int row = 0; 行数
  3. int column = 0; 列数
  4. 1.sqlite3_get_table 内部会将 查询的到的结果的 行数写到row的地址里
  5. 会将 查询的到的结果的 列数写到column的地址里
  6. 2.会让 result 指向 sqlite3_get_table 申请的结果集的内存空间
  7. int ret = sqlite3_get_table(sql_db, sql_buff, &result, &row, &column, NULL);
  8. if(ret != SQLITE_OK)
  9. {
  10. printf("查询失败 errcode[%d] errmsg[%s]\n", ret, sqlite3_errmsg(sql_db));
  11. return;
  12. }
复制代码

5.释放 sqlite3_get_table()函数产生的结果集—sqlite3_free_table

  1. void sqlite3_free_table(char **result);
复制代码

eg:

sqlite3_free_table(result); 释放 结果集result 防止内存泄漏

6.关闭数据库句柄—sqlite3_close

  1. int sqlite3_close(sqlite3* db);
  2. 功能:关闭一个数据库
复制代码

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数据库的学生管理系统学生管理系统

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2026 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行