Days 39 Linux C 开发之 SQLite 数据库完整学习笔记

前言

在 Linux C 语言开发中,经常需要对大批量数据做持久化的增删改查操作。如果直接操作文件实现数据管理,需要自己处理解析、索引、条件筛选等逻辑,开发工作量巨大。而数据库软件专门用来管理大批量数据,SQLite是一款轻量级关系型数据库,不需要独立的服务器进程,直接读写磁盘文件,非常适合嵌入式、Linux 小型 C 程序开发。

本文基于 Linux C 开发学习资料,整理 SQLite 基础概念、命令操作、SQL 语句,适合刚接触数据库的 C 语言开发者。

数据库主要分为两大类:关系型数据库非关系型数据库

  1. 关系型数据库:数据存储在磁盘文件,代表:OracleMySQLSQLite
  2. 非关系型数据库:数据主要存放在内存,代表: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 语言开发中的使用说明

  1. SQLite 本身是文件数据库,数据库就是一个普通磁盘文件,不需要启动后台服务进程,非常适合嵌入式 Linux 开发。
  2. C 语言操作 SQLite 需要调用sqlite3库提供的 API,编译程序的时候需要链接库 -lsqlite3
  3. 不要直接拼接字符串生成 SQL 语句,防止 SQL 注入风险,推荐使用预处理接口。
  4. 小数据量场景优先选择 SQLite;并发访问量大的业务场景选择 MySQL。

六、踩坑总结

  1. sqlite 点命令不要加分号,SQL 语句必须带分号;
  2. update、delete 忘记写 where 条件,会全表修改 / 删除,操作前建议备份数据库文件;
  3. 字符串字段的值,需要使用双引号""包裹;
  4. 模糊查询like语法,%代表任意多个字符;
  5. 多表查询一定要写on关联条件,否则产生大量无效笛卡尔积数据。

小结

SQLite 上手简单,掌握建表create、插入insert、查询select、更新update、删除delete五大基础语句,就可以完成绝大多数简单的数据持久化需求。后续可以继续学习 C 语言调用 sqlite3 的 API,在 Linux C 代码里面直接操作数据库文件。

相关推荐
笑梦无境43 分钟前
mysql的安装及配置(3)
数据库·mysql·adb
电商API_1800790524744 分钟前
跨境1688代采商家,如何借助API打通供应链,实现效率跃迁
大数据·数据库·网络爬虫
小雪崩1 小时前
嵌入式学习 day40:数据库
数据库·学习
Aloudata1 小时前
语义层 vs MCP 工具层:Agent 调用数据时,语义应该放在哪一层
数据库·数据分析·chatbi·data agent·语义层
zcmodeltech1 小时前
源网荷储一体化沙盘模型多场景控制系统设计——基于STM32与Modbus RTU的源网荷储、多能互补、冷热电三联供全场景联动方案,服务范围覆盖全国
数据库·人工智能·stm32·单片机·嵌入式硬件
数智启示录1 小时前
PostgreSQL 执行计划实战(第 9 篇):SQL 和索引没变,计划为什么突然慢一百倍
数据库·经验分享·sql·postgresql·面试
Gent_倪1 小时前
MySQL分库、分表、分区详解
数据库·mysql
额额额对了1 小时前
Linux 数据库开发实战:使用 C 语言与 SQLite3 构建轻量级终端词典
linux·数据库·oracle
爱笑鱼2 小时前
Android 系统启动机制(六):Zygote 创建 App 为什么走 Socket?哪些是源码事实,哪些是架构解释?
android·linux