首页 / SQLite 入门教程 / SQL 语言一分钟概览

SQLite 入门教程

SQL 语言一分钟概览

本教程共 50 篇 · 第 7 篇 · 更新于 2026-07-31

sqliteSQLDDLDMLDQL

07. SQL 语言一分钟概览

本节目标:学完本章你能说清 SQL 是什么、把常用语句正确归到 DDL / DML / DQL(以及事务控制)类别,并知道 SQLite 对标准 SQL 支持到什么程度、刻意缺了哪些东西。

SQL 是 Structured Query Language(结构化查询语言)的缩写,它是我们用来和”关系型数据库”对话的唯一通用语言。无论是查一条数据、改一个值、还是建一张表,本质都是你写一句 SQL、数据库去执行。无论底层是 SQLite、MySQL 还是 PostgreSQL,大家说的都是同一门 SQL,区别只在于各家”口音”(支持的子集)略有不同。所以先把 SQL 的整体框架搞清楚,后面每一章都是在往这个框架里填具体的语句。

为了好记,我们把 SQL 类比成”和图书馆管理员的沟通方式”:有的指令是”盖新的库房、摆书架”(定义结构),有的指令是”上架新书、下架旧书”(操作数据),有的指令是”帮我找某本书”(查询数据)。对应到 SQL 里,就是 DDL、DML、DQL 三大类。下面逐个看。

DDL(Data Definition Language,数据定义语言) 负责”定义数据库的结构”,也就是建什么、改什么、删什么。常见的 DDL 语句有:CREATE TABLE(建表)、ALTER TABLE(改表结构)、DROP TABLE(删表)、CREATE INDEX / DROP INDEX(建/删索引)、CREATE VIEW / DROP VIEW(建/删视图)、CREATE TRIGGER / DROP TRIGGER(建/删触发器)、CREATE VIRTUAL TABLE(建虚拟表,如全文检索)。在 SQLite 里,ALTER TABLE 的能力比 MySQL 弱一些——早期版本主要支持“重命名表”和“增加列”,改列类型、删除列能力后来才补齐(3.35.0 起支持 DROP COLUMN 删除列,3.25.0 起支持重命名列,且均有约束),这在后面的“改表结构”章节会专门讲。

DML(Data Manipulation Language,数据操纵语言) 负责”对数据本身做增删改”。就三条核心:INSERT(插入)、UPDATE(更新)、DELETE(删除)。注意 DML 是会改变数据的,所以执行时要格外小心——尤其是 UPDATEDELETE,一旦忘了带 WHERE 条件,可能把整张表的数据都改掉或清掉。这一点在”更新数据""删除数据”章节会反复强调。

DQL(Data Query Language,数据查询语言) 专门用来”读取数据”,核心只有一条:SELECT。我们平时写的 WHEREORDER BYGROUP BYJOINLIMIT 等等,其实都是 SELECT 语句里的”子句”,它们依附在 SELECT 之上,本身不改变任何数据。把 SELECT 单独拎成一类,是因为它只读不写,是最安全的一类操作——你随便查,不会搞坏库。

除了上面三大类,还有一类在 SQLite 里也很重要,叫 TCL(Transaction Control Language,事务控制语言)BEGIN(开启事务)、COMMIT(提交)、ROLLBACK(回滚)、SAVEPOINT / RELEASE(保存点)。它保证一组操作”要么全部成功、要么全部不做”。可以类比成”寄快递打包”:你把所有要寄的东西先放进取件袋(BEGIN),封口前还能反悔重放(ROLLBACK),一旦贴上单子投进箱子(COMMIT),就不可撤回了。事务与并发锁我们会在后面的专门章节展开。

有一类在 MySQL/PostgreSQL 里常见、但 SQLite 里根本没有的,是 DCL(Data Control Language,权限控制语言),比如 GRANTREVOKE。这又和 SQLite 的”无服务进程”特性连上了——

常见坑

别把 MySQL/PostgreSQL 的”权限控制”思维套到 SQLite 上。SQLite 没有 GRANT/REVOKE 这类 DCL 语句,也没有”用户""角色”这种多账号概念——它的”访问权限”就是操作系统对你那个 .db 文件的读/写权限。换句话说,谁能打开这个文件、谁就能读写里面的全部数据。同样,SQLite 也不支持存储过程(stored procedures),内置函数之外要扩展只能用 C 语言写扩展注册。如果你的安全模型依赖”不同用户不同权限”,SQLite 本身不提供,需要你在应用层自己实现。

那么 SQLite 到底支持标准 SQL 的哪一部分?可以放心地说:SQLite 实现了绝大多数 SQL-92 标准的核心,日常用到的 SELECT/INSERT/UPDATE/DELETE、各种 JOINGROUP BY、子查询、CTEWITH)、窗口函数、触发器、索引、事务它全都支持。但它也刻意不做一些”企业级”特性,知道缺口能少踩很多坑:

  • 连接(JOIN):支持 INNER JOINLEFT JOINCROSS JOIN;但原生不支持 RIGHT JOINFULL OUTER JOIN。需要右连接时,把两张表换个位置用 LEFT JOIN 即可实现同样效果。
  • UPSERT:3.24 起支持 INSERT ... ON CONFLICT ... DO UPDATE / NOTHING,也就是”存在就更新、不存在就插入”,无需存储过程。
  • 窗口函数:3.25 起支持,做排名、累计求和很方便。
  • 没有的:没有存储过程、没有用户/权限体系、没有真正的布尔类型(用整数 0/1 表示)、没有专有的日期类型(见第 08 章)、外键约束默认关闭(见第 13 章)。
  • 类型系统:这是 SQLite 最有特色也最容易误解的地方——它是”动态类型 + 类型亲和性”,而不是静态类型。具体内容第 08 章专门纠偏。

SQL 与 SQLite 支持的子集:动手对照

光说”支持一部分”太抽象,下面用教程统一的 users / orders 两张表,把最常被问到的几类 SQL 在 SQLite 里”能不能用”落到实处。

多表连接(JOIN)。内连接、左连接、交叉连接都没问题;唯一原生缺席的是右连接 RIGHT JOIN 和全外连接 FULL OUTER JOIN。好消息是右连接只是”把两张表换个位置”,用左连接就能等价实现:比如你想以 orders 为主查出每笔订单对应的用户名,别的库可能写 orders RIGHT JOIN users ...,在 SQLite 里改写成 users LEFT JOIN orders ...(交换 FROMJOIN 两边即可),结果完全一致。全外连接 SQLite 没有内建语法,真要”左右两边各自独有的行也都要”,得用两个 LEFT JOIN 配合 UNION 拼出来,稍繁琐但语义能覆盖。

权限与过程化语句。一如前面 WARNING 强调的,GRANT / REVOKE 这类 DCL 在 SQLite 里不存在,权限就是操作系统对 .db 文件的读写权限;同时也不支持存储过程(stored procedure)。但触发器(TRIGGER)和视图(VIEW)都完整支持,自动记账、自动更新统计这类需求用触发器就够了。

放心用的常用特性CHECK 约束、DEFAULT 默认值、自增主键、UPSERT(3.24 起 INSERT ... ON CONFLICT)、窗口函数(3.25 起)、CTE(WITH,含递归)一概可用,和主流库基本一致。

一句话总结:SQLite 刻意砍掉的是”企业级服务端特性”(多用户权限、存储过程、右/全外连接),把”单机嵌入式用得到”的查询与 DDL/DML 能力几乎全做了。记住这条分界线,你就不会在缺的功能上白费力气,也能放心把日常 SQL 直接搬过来用。

重点提示

记住这个归类口诀:DDL 改”结构”要谨慎(生产环境改表有风险,最好先备份),DML 改”数据”务必带 WHERE(不然容易误改全表),DQL 的 SELECT 最安全(只读不写,放心查)。写语句时分清它属于哪一类,就知道该有多小心。

实用技巧

写 SQL 时关键字不区分大小写——SELECTselectSelect 效果完全一样。但行业约定是:关键字全大写(SELECTFROMWHERE),表名和列名用小写,这样一眼就能区分”命令”和”数据”,可读性更好。唯一要注意的例外是 GLOB 操作符大小写敏感、而 LIKE 默认不敏感,别在这上面栽跟头。

最后做个类比小结:如果把数据库比作一个仓库,DDL 是”盖厂房、搭货架”(动结构,动静大),DML 是”进货、移货、清货”(动库存,要核对),DQL 是”拿清单去盘点查看”(只记录、不动手),TCL 是”这一批操作打包成一个不可分割的动作”。理解了这四类职责的轻重,你写每一条 SQL 时心里都会有数:这条语句到底会不会动我的数据、动得有多大。下一章我们就钻进最容易被误解的”数据类型”里,彻底讲清 SQLite 的动态类型与类型亲和性。