SQLite 基础教程:增删改查与常用查询技巧

陆遥
陆遥
发布时间:2026-10-15 | 4人浏览过
原创

掌握 SQLite 的增删改查(CRUD)是构建轻量级应用的基础。本文详细解析 INSERT INTO、UPDATE、DELETE 的数据维护语句,并深入讲解 SELECT 的高级用法,包括条件过滤、通配符匹配、数值区间判断、结果排序与分组聚合。通过具体的建表、导入数据及查询命令示例,帮助你快速上手 SQLite 数据处理。

一、 准备测试环境与数据

在开始具体操作前,先创建测试用的数据表并写入初始样本数据。这能确保后续的增删改查有迹可循。

首先创建一张名为 Teachers 的教师表,设定主键、名称非空约束及年龄大于 22 的限制:

$ sqlite3 test.db
sqlite> CREATE TABLE Teachers(
...>   Id integer PRIMARY KEY,
...>   Name text NOT NULL,
...>   Age integer CHECK(Age>22),
...>   Country text DEFAULT 'USA');
sqlite>

向表中插入几行数据,验证约束是否生效:

sqlite> INSERT INTO Teachers VALUES(1,'Alice',25,'CHN');
sqlite> INSERT INTO Teachers VALUES(2,'Bob',25,'BRA');
sqlite> INSERT INTO Teachers(Name,Age,Country) VALUES('John',43,'USA');
sqlite>

二、 插入数据 INSERT INTO

INSERT INTO 用于向现有表中添加新记录。根据需求不同,可以指定全部字段或仅插入部分字段。

如果提供完整的列值列表,可以省略列名:

sqlite> INSERT INTO Teachers VALUES(3,'Charls',33,'USA');

若只指定部分字段,未指定的字段将使用默认值(如上面的 Country),若默认值不存在且允许为空则留空;若不允许为空且无默认值则会报错:

sqlite> INSERT INTO Teachers(Id,Name,Age,Country) VALUES(3,'Charls',33,'USA');
sqlite> INSERT INTO Teachers(Name,Age) VALUES('Jhon',43);

插入后可以通过 SELECT 查看结果:

sqlite> SELECT * FROM Teachers;
Id  Name        Age           Country
--  --------------  --------------  ----------------
1   Alice       25            CHN
2   Bob         25            BRA
3   Charls      33            USA
4   Jhon        43            USA

三、 更新数据 UPDATE

UPDATE 语句用于修改表中的数据。若不加 WHERE 子句,所有行的该列将被更新,因此务必谨慎操作。

1. 无条件的全表更新:

sqlite> UPDATE Teachers SET Country='China';
-- 此时所有人的国家都变成了 China

2. 带条件的精准更新:

使用 WHERE 限定目标行。例如只修改 ID 为 3 的记录:

sqlite> UPDATE Teachers SET Country='America' WHERE Id=3;

可以使用复杂的逻辑条件,例如更新年龄小于 30 岁的记录:

sqlite> UPDATE Teachers SET Country='India' WHERE Age<30;
-- Alice (25岁) 和 Bob (25岁) 的国家被更改为 India

四、 删除数据 DELETE

DELETE 语句用于移除表中的记录。同样需要警惕不带 WHERE 的情况,那会清空整个表!建议在删除前先运行一次同等条件的 SELECT 以预览将要删除的数据。

1. 有条件删除:

sqlite> SELECT * FROM Teachers; -- 假设当前数据如上
sqlite> DELETE FROM Teachers WHERE Age>30;
-- 年龄大于30的 Charls (33岁) 和 John (43岁) 被移除

2. 清空全表:

sqlite> DELETE FROM Teachers;
sqlite> SELECT * FROM Teachers;
-- 结果为空,所有记录已被删除

五、 读取数据 SELECT(基础与进阶)

SELECT 是最常用的 SQL 语句,功能极其丰富。为了演示后面的高级查询,我们需要建立两组关联数据(汽车表 Cars 和订单表 Orders):

创建并导入以下结构的 data.sql 文件到数据库中:

CREATE TABLE Cars(Id integer PRIMARY KEY, Name text, Cost integer);
INSERT INTO Cars VALUES(1,'Audi',52642);
INSERT INTO Cars VALUES(2,'Mercedes',57127);
INSERT INTO Cars VALUES(3,'Skoda',9000);
INSERT INTO Cars VALUES(4,'Volvo',29000);
INSERT INTO Cars VALUES(5,'Bentley',350000);
INSERT INTO Cars VALUES(6,'Citroen',21000);
INSERT INTO Cars VALUES(7,'Hummer',41400);
INSERT INTO Cars VALUES(8,'Volkswagen',21600);

CREATE TABLE Orders(Id integer PRIMARY KEY, OrderPrice integer CHECK(OrderPrice>0), Customer text);
INSERT INTO Orders(OrderPrice, Customer) VALUES(1200, 'Williamson');
INSERT INTO Orders(OrderPrice, Customer) VALUES(200, 'Robertson');
INSERT INTO Orders(OrderPrice, Customer) VALUES(40, 'Robertson');
INSERT INTO Orders(OrderPrice, Customer) VALUES(1640, 'Smith');
INSERT INTO Orders(OrderPrice, Customer) VALUES(100, 'Robertson');
INSERT INTO Orders(OrderPrice, Customer) VALUES(50, 'Williamson');
INSERT INTO Orders(OrderPrice, Customer) VALUES(150, 'Smith');
INSERT INTO Orders(OrderPrice, Customer) VALUES(250, 'Smith');
INSERT INTO Orders(OrderPrice, Customer) VALUES(840, 'Brown');
INSERT INTO Orders(OrderPrice, Customer) VALUES(440, 'Black');
INSERT INTO Orders(OrderPrice, Customer) VALUES(20, 'Brown');

在命令行执行 .read data.sql 即可将数据加载。

1. 限制数量与偏移 LIMIT 与 OFFSET

当数据量过大时,通常只需返回部分数据。

限制数量: 仅返回前 4 辆车。

sqlite> SELECT * FROM Cars LIMIT 4;

分页查询: 跳过前 2 条,从第 3 条开始返回 4 条数据(常用于实现“上一页/下一页”)。注意索引是从 0 开始的。

sqlite> SELECT * FROM Cars LIMIT 4 OFFSET 2;

2. 列别名 AS

改变输出结果的标题,使报表更易读:

sqlite> SELECT Name , Cost AS 'Price Of Car' FROM Cars;

3. 条件查询 WHERE

(1) 字符串模糊匹配 LIKE 和 GLOB

  • LIKE:不区分大小写。使用 _ 匹配单个字符,% 匹配任意多个字符。
-- 查找名称恰好为 4 个字母的汽车(Audi)
sqlite> SELECT * FROM Cars WHERE Name LIKE '____';

-- 查找名称以 en 结尾的汽车(Citroen, Volkswagen)
sqlite> SELECT * FROM Cars WHERE Name LIKE '%en';
-- 即使输入 %EN 也能查出同样结果,因为不区分大小写
  • GLOB:区分大小写。使用 ? 匹配单字符,* 匹配多字符。

(2) 范围判断 BETWEEN

找出价格在 20000 到 55000 之间的汽车:

sqlite> SELECT * FROM Cars WHERE Cost BETWEEN 20000 AND 55000;

(3) 集合匹配 IN

找出特定的品牌:

sqlite> SELECT * FROM Cars WHERE Name IN ('Audi','Hummer');

4. 排序 ORDER BY

按特定列排序,默认升序 ASC,降序使用 DESC:

sqlite> SELECT Name, Cost FROM Cars ORDER BY Cost DESC;
-- 从昂贵的 Bentley 排到便宜的 Skoda

5. 去重 DISTINCT

在订单中,同一个客户下了多次订单。要获取下单客户的唯一名单,可使用 DISTINCT:

sqlite> SELECT DISTINCT Customer FROM Orders;
-- 返回: Black, Brown, Robertson, Smith, Williamson

6. 分组统计 GROUP BY 与 HAVING

GROUP BY 用于将数据按某列分类,常配合聚合函数(如 SUM, COUNT, AVG)使用。

计算每位客户的总消费金额:

sqlite> SELECT sum(OrderPrice) AS Total, Customer FROM Orders GROUP BY Customer;

HAVING 用于对分组后的结果进行二次筛选(类似针对聚合数据的 WHERE):

只找出总支出超过 1000 的客户:

sqlite> SELECT sum(OrderPrice) AS Total, Customer FROM Orders 
   ...>   GROUP BY Customer HAVING sum(OrderPrice)>1000;

六、 综合示例与注意事项

在实际开发中,经常需要将上述运算符组合使用。SQLite 支持标准的逻辑运算符 AND、OR、NOT 来构建复杂的检索条件。同时请记住:

  • 在涉及大量删除 (DELETE) 或覆盖性更新 (UPDATE) 前,务必备份数据库文件或使用事务保护。
  • 理解 WHERE、GROUP BY 和 HAVING 的作用顺序是避免报错的关键(先过滤行,再分组,最后过滤组)。

以上就是 SQLite 增删改查(INSERT/UPDATE/DELETE/SELECT)的详细内容,更多关于 SQLite 进阶优化与实战的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表