前言
在 Linux C 语言开发中,经常需要对大批量数据做持久化的增删改查操作。如果直接操作文件实现数据管理,需要自己处理解析、索引、条件筛选等逻辑,开发工作量巨大。而数据库软件专门用来管理大批量数据,SQLite是一款轻量级关系型数据库,不需要独立的服务器进程,直接读写磁盘文件,非常适合嵌入式、Linux 小型 C 程序开发。
本文基于 Linux C 开发学习资料,整理 SQLite 基础概念、命令操作、SQL 语句,适合刚接触数据库的 C 语言开发者。
数据库主要分为两大类:关系型数据库 、非关系型数据库
- 关系型数据库:数据存储在磁盘文件,代表:
Oracle、MySQL、SQLite - 非关系型数据库:数据主要存放在内存,代表:
Redis、Nosql
一、SQLite 安装(Ubuntu 环境)
Ubuntu 下直接使用 apt 工具一键安装 sqlite3 工具:
sudo apt‑get install sqlite3
安装完成后终端输入sqlite3就可以进入 sqlite 交互式命令行。
二、SQLite 常用点命令
注意:sqlite 的点命令 不是 SQL 语句,不需要分号结尾;SQL 语句必须以分号
;结尾。
表格
| 命令 | 功能说明 |
|---|---|
.tables |
查看当前数据库中所有表名称 |
.databases |
列出已经附加打开的数据库文件 |
.headers on/off |
开启 / 关闭查询结果的列名显示 |
.mode |
设置数据输出显示格式 |
.schema ?TABLE? |
查看指定表的建表语句,不加表名查看全部 |
.width |
设置输出列的显示宽度,优化打印排版 |
使用示例
# 打开/创建mydb.db数据库文件,文件不存在则自动创建
sqlite3 mydb.db
.tables # 查看所有表
.headers on # 打开表头显示
.schema student # 查看student表的创建语句
三、核心 SQL 语句(重点)
SQL 语句大小写不敏感,建议关键字大写方便阅读,每条语句末尾必须写分号;。 SQLite 支持的数据类型:
INTEGER:整型数字REAL:浮点数字TEXT:字符串文本BLOB:二进制原始字节(图片、文件二进制数据)
1. create table 创建表
语法:
create table 表名 (列名1 数据类型1, 列名2 数据类型2, ...);
示例:创建学生信息表 student,包含 id、姓名、性别、年龄、分数
create table student (
id integer,
name text,
sex text,
age integer,
score integer
);
2. insert into 插入数据
方式 1:给全部列插入,按建表顺序填写全部值
insert into student values (1, "张三", "男", 18, 90);
方式 2:指定部分列插入,未指定列填 NULL
insert into student values (3, "王二", NULL, NULL, NULL);
-- 只给id、name、sex三列赋值
insert into student (id, name, sex) values (4, "赵五", "男");
NULL 代表该字段无数据。
3. select 查询数据
查询整张表全部列数据
select * from student;
查询指定的几列
select name,score from student;
where 子句:条件过滤查询
where 后面写匹配条件,支持运算符: =等于、<>不等于、>大于、<小于、>=大于等于、<=小于等于、BETWEEN范围、LIKE模糊匹配。
-- 查询分数大于等于90分的学生姓名分数
select name,score from student where score >= 90;
-- 模糊查询,%代表任意字符,查询名字以赵开头
select name,score from student where name like "赵%";
-- 多条件 and 同时满足
select name,score from student where name like "赵%" and score > 95;
4. update 更新修改表中数据
⚠️重要:不加 where 条件会修改整张表所有行! 语法:
update 表名 set 列名 = 新值 where 列名 = 匹配条件;
示例:修改赵五的分数为 91
update student set score=91 where name="赵五";
5. delete 删除表中记录
⚠️重要:不加 where 条件会删除整张表全部数据! 语法:
delete from 表名 where 列名称 = 值;
示例:删除名字为王二的记录
delete from student where name = "王二";
6. order by 排序查询结果
-
asc:升序(从小到大,默认) -
desc:降序(从大到小)-- 查询男生信息,按照分数降序排列
select name,score from student where sex="男" order by score desc;
7. drop table 删除整张表
会把表结构 + 表内全部数据一起删掉,谨慎操作。
drop table student;
四、多表联合查询
实际业务经常需要多张表关联查询,常见交叉连接cross join、内连接inner join、外连接outer join。
1. cross join 交叉连接
笛卡尔积,第一张表每一行和第二张表每一行全部组合,一般很少单独用。
select 学生信息.姓名 as 姓名, 课程信息.名称 as 课程, 课程信息.学分 as 学分
from 学生信息 cross join 课程信息;
2. inner join 内连接(最常用)
只查询两张表中匹配条件相等的数据。
-- 查询学生姓名和对应成绩
select 学生信息.姓名 as 姓名, 成绩信息.成绩 as 成绩
from 学生信息 inner join 成绩信息
on 学生信息.ID = 成绩信息.学生ID;
-- 三表联合:学生、成绩、课程
select 学生信息.姓名 as 姓名, 课程信息.名称 as 课程, 成绩信息.成绩 as 成绩
from 学生信息
inner join 成绩信息 on 学生信息.ID = 成绩信息.学生ID
inner join 课程信息 on 成绩信息.课程ID = 课程信息.ID;
3. outer join 外连接(left outer join 左外连接)
以左边表全部数据为基准,右边表匹配不到的填 NULL。
select 学生信息.姓名 as 姓名,成绩信息.成绩 as 成绩
from 学生信息 left outer join 成绩信息
on 学生信息.ID = 成绩信息.学生ID;
五、SQLite 在 C 语言开发中的使用说明
- SQLite 本身是文件数据库,数据库就是一个普通磁盘文件,不需要启动后台服务进程,非常适合嵌入式 Linux 开发。
- C 语言操作 SQLite 需要调用
sqlite3库提供的 API,编译程序的时候需要链接库-lsqlite3。 - 不要直接拼接字符串生成 SQL 语句,防止 SQL 注入风险,推荐使用预处理接口。
- 小数据量场景优先选择 SQLite;并发访问量大的业务场景选择 MySQL。
六、踩坑总结
- sqlite 点命令不要加分号,SQL 语句必须带分号;
- update、delete 忘记写 where 条件,会全表修改 / 删除,操作前建议备份数据库文件;
- 字符串字段的值,需要使用双引号
""包裹; - 模糊查询
like语法,%代表任意多个字符; - 多表查询一定要写
on关联条件,否则产生大量无效笛卡尔积数据。
小结
SQLite 上手简单,掌握建表create、插入insert、查询select、更新update、删除delete五大基础语句,就可以完成绝大多数简单的数据持久化需求。后续可以继续学习 C 语言调用 sqlite3 的 API,在 Linux C 代码里面直接操作数据库文件。