一、基本概念
数据:能够输入计算机并能被计算机程序识别和处理的信息集合
数据库:长期存储在计算机内、有组织的、可共享的大量数据的集合
DBMS:位于用户与操作系统之间的一层数据管理软件,用于操纵和管理数据库
二、安装
在线安装:
sudo apt-get install sqlite3 安装数据库软件
sudo apt-get install libsqlite 安装数据库的函数库
离线安装:
sudo dpkg -i sqlite3_3.22.0-1ubuntu0.4_amd64.deb 离线安装数据库软件
sudo dpkg -i libsqlite3-dev_3.22.0-1ubuntu0.4_amd64.deb 离线安装数据库的函数库
- 注:离线安装包可以从官网获取 https://www.sqlite.org/
验证是否安装好:
输入sqlite3,进入下面的界面说明安好了
三、使用
(一)系统命令
不同的数据库的系统命令不一样,取决于数据库的开发者
.help 查看帮助手册
.exit 退出数据库程序
.quit 退出数据库程序 使用 .q 也可以
.open 打开数据库文件
.tables 列出数据库中所有的数据表
.schema 查看表结构(建表语句)
.headers on|off 查询的结果是否显示表头信息 on 显示 off 不显示
注意:sqlite3数据库需要先打开数据库文件再操作,否则所有的操作都是在内存上的,数据不会被保存在硬盘,当数据库程序退出时,数据就丢了。
打开数据库文件的方式:
方式1:先使用sqlite3
命令进入到sqlite3数据库的终端
然后在终端上使用.open 数据库文件名
的方式打开数据库文件
方式2:也可以直接使用 sqlite3 数据库文件名
的方式打开数据库文件并进入数据库的终端
数据库文件名只要符合命名规范即可,但是一般我们书写时都以.db
结尾方便识别。
(二)关系型数据库表
- 一个数据库文件中,可以有多个数据表,且每个数据表的结构可以不一样
(三)sql语句
- 只要是关系型数据库,sql语句都通用
- sql语句不能以 “
.
” 开头,结尾要加 “;
” - sql语句中关键字不区分大小写,但是一般写成大写,方便区分
- sql语句中的字符串需要用单引号或者双引号引起来
1. 建表语句
新创建的数据库文件中是没有数据表的,需要自己创建
//注意:新创建的数据库文件中是没有数据表的 需要我们自己创建
CREATE TABLE 表名(字段名1 字段类型1, 字段名2 字段类型2, ...);
字段类型:
整形 INT 或者 INTEGER
字符串 CHAR 或者 TEXT
例如:
CREATE TABLE student(id INT, name CHAR, score INTEGER);
2. 插入语句
//sql语句中的字符串需要用 单引号 或者 双引号 引起来
//这种插入方式必须从左到右给每个字段都赋值
INSERT INTO student VALUES(1001, "zhangsan", 98);
//如果只想给指定的字段赋值 可以用下面的用法
INSERT INTO student(id, name) VALUES(1003, "wangwu");
3. 查询语句
//查询所有记录的所有字段的内容
//其中 * 表示 所有字段
SELECT * FROM student;
//查询表中所有记录的 name 和 score 字段
SELECT name,score FROM student;
//查询表中所有name='zhangsan' 的记录的所有字段
SELECT * FROM student WHERE name='zhangsan';
//多个条件 可使用 AND 或者 OR 连接
// AND 并且 OR 或者
//查询表中所有 name='zhangsan'并且score=98 的记录的所有字段
SELECT * FROM student WHERE name='zhangsan' AND score=98;
//查询表中所有name="zhangsan"的记录的 id 字段
SELECT id FROM student WHERE name="zhangsan";
//对查询结果可以排序
// ORDER BY 字段名 根据哪个字段排序
// ASC 升序 DESC 降序 不写时 默认是升序
//查询表中所有name="zhangsan"的记录的所有字段 且结果根据成绩降序排序
SELECT * FROM student WHERE name="zhangsan" ORDER BY score DESC;
4. 更新语句
//把所有id=1005的记录的 score 字段的值都改成100
UPDATE student SET score=100 WHERE id=1005;
//一次该多个字段时 中间用 逗号 分隔
UPDATE student SET score=80,name='lihua' WHERE id=1007;
//注意:即使没有满足条件的记录 语句执行也不会报错 只不过没有现象发生
- 注:即使没有满足条件的记录,语句执行也不会报错,只不过没有现象发生
5. 删除语句
//删除表中所有 name="zhangsan" 或者 id=1003 的所有记录
DELETE FROM student WHERE name='zhangsan' OR id=1003;
//注意:即使没有满足条件的记录 语句执行也不会报错 只不过没有现象发生
- 注:即使没有满足条件的记录,语句执行也不会报错,只不过没有现象发生
6. 删除表
DROP TABLE 表名;
7. 对列的操作(一般不会用到)
添加一列
ALTER TABLE student ADD COLUMN sex CHAR;
删除一列
sqlite3 不允许直接删除一列
1)先创建一张新表
CREATE TABLE temp AS SELECT id,name FROM student;
2)删除原来的旧表
DROP TABLE student;
3)对新表重命名
ALTER TABLE temp RENAME TO student;
8. 主键
主键 PRIMARY KEY
在建表时可以自定某一个字段为 主键 然后在后插入的过程中
CREATE TABLE student(id INT PRIMARY KEY, name TEXT, score INT);
- 注:主键必须保持唯一, 如果插入重复主键的记录 会报错:主键冲突
四、常用的API接口函数
使用sqlite3数据的函数 编码时 需要加头文件 #include <sqlite3.h>
编译时,需要连接sqlite3数据库的库 -lsqlite3
(一)API接口函数
1. 打开和关闭数据库文件
int sqlite3_open(const char *filename,/* Database filename (UTF-8) */
sqlite3 **ppdb /* OUT: SQLite db handle */ );
功能:
打开一个数据库 存在就直接打开 不存在就新建并打开
参数:
filename 数据库文件的路径和名字
ppdb 操作数据库的指针,句柄。
返回值:
成功 SQLITE_OK
失败 error_code
int sqlite3_close(sqlite3 *db);
功能:关闭一个数据库
2. 获取错误信息描述
const char *sqlite3_errmsg(sqlite3 *db);
功能:获取数据库句柄db对应的最后一次错误信息描述
3. 执行sql语句
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 错误码
补充:
释放sqlite3_exec第五个参数占用的空间
void sqlite3_free(void *p);
sqlite3_exec 函数的回调函数 callback
int callback(void *arg, int ncolumn, char **f_value, char **f_name)
功能:
得到查询结果
参数:
arg 为回调函数传递参数使用的
ncolumn 记录中包含的字段的数目
f_value 包含每个字段值的指针数组
f_name 包含每个字段名称的指针数组
返回值:
成功 0
出错 非0
- 注:
- 程序中写sql语句,结尾无需加分号,因为字符串结尾有\0来标识字符串结束。
IF NO EXISTS
标识如果存在就使用,不报错;
CREATE TABLE IF NOT EXISTS student(id INT PRIMARY KEY, name CHAR, score INT)
4. 查询数据库的函数
查询数据库的函数
int sqlite3_get_table(sqlite3 *db, const char *zSql,
char ***pazResult, int *pnRow,
int *pnColumn, char **pzErrmsg);
功能:
查询数据库,它会创建一个新的内存区域来存放查询的结果信息
参数:
db 数据库操作句柄
sql 数据库的sql语句
pazResult 查询的结果
nRow 行数--不包含字段名
nColumn 列数
errmsg 错误消息
//和前面一样 如果使用了 要记得使用 sqlite3_free 释放空间
返回值:
成功 0
出错 errcode
释放 sqlite3_get_table 函数产生的结果集
void sqlite3_free_table(char **result)