一、引言
SQL(Structured Query Language,结构化查询语言)是关系型数据库系统的核心语言,自 1986 年成为 ANSI 和 ISO 标准以来,经历了多次版本演进,不断增强语义表达能力以适应复杂的企业数据需求。
随着数据库技术的不断发展,各大数据库厂商(如 Oracle、SQL Server、PostgreSQL、MySQL 等)在实现标准的基础上扩展了大量方言语法,使得掌握 SQL 的标准语法版本成为数据库设计与系统集成的基石。
本文将系统梳理 SQL 常用标准版本的核心语法与新增特性,并分析各主流数据库对标准语法的支持情况,帮助开发者与架构师更好地编写可移植、高质量的 SQL 查询语句。
二、SQL 标准版本简史
版本代号 | 发布年份 | 主要特性概览 |
---|---|---|
SQL-86 / SQL-87 | 1986/1987 | 最初标准,支持基本 SELECT、INSERT、UPDATE、DELETE |
SQL-89 | 1989 | 增加数据完整性约束(如主键、唯一约束) |
SQL-92(SQL-2) | 1992 | 标准化 JOIN、子查询、视图、数据类型,成为后续实现基础 |
SQL:1999(SQL-3) | 1999 | 引入对象关系模型、递归查询(CTE)、触发器 |
SQL:2003 | 2003 | 增加窗口函数、MERGE 语句、XML 支持 |
SQL:2006 | 2006 | 强化 XML 查询(如 XMLQUERY) |
SQL:2008 | 2008 | 改进 MERGE 、增加 TRUNCATE 、增强排序与分页支持 |
SQL:2011 | 2011 | 时间点语义(系统时间、业务时间),历史表 |
SQL:2016 | 2016 | 原生 JSON 支持、MATCH_RECOGNIZE 行匹配语法 |
SQL:2019 | 2019 | 扩展 JSON 函数、增强分析查询能力 |
三、常用 SQL 标准语法精讲
1. SQL-92:奠定基础的通用语法
SQL-92 是目前兼容性最广的标准,大多数数据库系统均支持其核心语法。
示例语法:标准 SELECT + JOIN
SELECT c.name, o.order_date
FROM customer c
INNER JOIN orders o ON c.id = o.customer_id
WHERE o.status = 'PAID';
关键点:
明确的
JOIN
类型(INNER、LEFT、RIGHT)子查询、别名、聚合函数等正式进入标准
CHECK
约束与UNION
操作首次标准化
2. SQL:1999:递归与对象化
新增特性:
公共表表达式(CTE)
递归查询
触发器(
CREATE TRIGGER
)
示例:递归 CTE 查询组织结构
WITH RECURSIVE org_hierarchy AS (
SELECT id, name, manager_id FROM employee WHERE manager_id IS NULL
UNION ALL
SELECT e.id, e.name, e.manager_id
FROM employee e
JOIN org_hierarchy o ON e.manager_id = o.id
)
SELECT * FROM org_hierarchy;
3. SQL:2003:窗口函数与 MERGE 语句
窗口函数(Window Functions)
SELECT
employee_id,
salary,
RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS dept_rank
FROM employees;
MERGE 语句:标准化 UPSERT 操作
MERGE INTO target t
USING source s ON t.id = s.id
WHEN MATCHED THEN UPDATE SET t.name = s.name
WHEN NOT MATCHED THEN INSERT (id, name) VALUES (s.id, s.name);
4. SQL:2011:时间点语义支持
支持系统版本表(System-Versioned Tables)与应用时间表(Application Time Tables),用于审计和时间线数据分析。
示例:定义带时间线的表
CREATE TABLE contract (
id INT PRIMARY KEY,
valid_from DATE,
valid_to DATE,
PERIOD FOR application_time (valid_from, valid_to)
);
5. SQL:2016:JSON 支持与模式匹配
JSON 支持函数:
SELECT JSON_VALUE('{"name":"Ada","age":30}', '$.name'); -- 结果: Ada
SELECT JSON_QUERY('{"a": [1,2,3]}', '$.a'); -- 结果: [1,2,3]
JSON_TABLE 示例:
SELECT *
FROM JSON_TABLE(
'[{"id":1,"name":"Ada"},{"id":2,"name":"Bob"}]',
'$[*]'
COLUMNS (
id INT PATH '$.id',
name VARCHAR(50) PATH '$.name'
)
) AS jt;
行模式匹配(MATCH_RECOGNIZE):用于复杂事件处理与时间序列分析
SELECT * FROM trades
MATCH_RECOGNIZE (
PARTITION BY symbol
ORDER BY trade_time
MEASURES STRT.trade_time AS start_time, LAST(DOWN.trade_time) AS end_time
PATTERN (STRT DOWN+ UP)
DEFINE
DOWN AS price < PREV(price),
UP AS price > PREV(price)
);
四、各数据库支持情况对比(按标准)
特性 | Oracle | PostgreSQL | SQL Server | MySQL | SQLite |
---|---|---|---|---|---|
SQL-92 基础语法 | ✅ | ✅ | ✅ | ✅ | ✅ |
递归 CTE(SQL:1999) | ✅ | ✅ | ✅ | ✅8.0+ | ❌ |
窗口函数(SQL:2003) | ✅ | ✅ | ✅ | ✅8.0+ | ✅3.25+ |
JSON 支持(SQL:2016) | ✅ | ✅ | ✅ | ✅5.7+ | ✅扩展 |
JSON_TABLE | ✅ | ✅(函数) | ❌ | ❌ | ❌ |
行匹配(MATCH) | ✅ | ❌ | ❌ | ❌ | ❌ |
五、应用建议
跨数据库开发建议:尽量使用 SQL-92 或 SQL:2003 的标准语法,避免数据库方言。
SaaS 多租户系统:统一语法封装,隔离数据库特性,提升可移植性。
大数据/数据湖平台:利用 SQL:2016 的 JSON、窗口函数、行匹配等特性,提升分析表达能力。
代码生成工具设计:应基于标准抽象语法树构建生成模板,减少重复适配。
六、结语
SQL 语言标准是关系型数据库可移植性与可维护性的基础。随着业务复杂性与数据异构性的不断上升,深入理解 SQL 各版本标准语法及其数据库支持状况,对于构建稳定、灵活、可扩展的数据库架构具有关键意义。