自从发布 SQL:2023 标准以来,ISO SQL 标准工作组(WG3)仍在不断致力于 SQL 以及 GQL 标准的更新。
该组织于 2026年 6 月在瑞典斯德哥尔摩召开会议,多项备受关注的新功能正式进入 SQL:202y 草案。
以下是相关特性的简单介绍。
QUALIFY 子句
QUALIFY 子句用于对窗口函数(Window Function)的结果进行过滤,相当于窗口函数版的 WHERE 或 HAVING。
例如,为了找出价格高于所属分类平均价格的商品,我们需要这样实现:
SELECT*FROM(SELECT*,avg(price)OVER(PARTITIONBYcategory)ASavg_priceFROMproducts)tWHEREprice>avg_price;为了筛选窗口函数计算结果,通常需要额外嵌套一层子查询。因为 WHERE 在窗口函数之前执行,窗口函数结果不能直接出现在 WHERE 子句中。
新的 QUALIFY 子句可以直接在同一查询中完成筛选:
SELECT*FROMproducts QUALIFY price>avg(price)OVER(PARTITIONBYcategory);一些数据仓库(例如 Snowflake、BigQuery 等)支持类似语法,但一直不是标准 SQL。如今被正式写入标准后,未来数据库产品跟进的可能性大大增加。
INSERT BY NAME
新标准接纳了 INSERT … BY NAME 语法,允许插入数据时按照列名匹配。例如:
INSERTINTOusers(name,age)BYNAMESELECTage,nameFROMtmp_users;与此同时,传统按照字段顺序匹配的方式可以使用 SELECT … BY POSITION 显式指定。
SELECT * EXCLUDE
这是近些年来 SQL 标准最热门的需求之一,可以指定查询结果中排除的字段,极大地方便我们编写 SQL 查询。
例如,为了查询用户表中除了 password 字段之外的其他字段,我们需要依次编写字段名称:
SELECTid,name,email,phone,created_at,updated_at...FROMusers;这种方式不但效率低下,增加字段时也需要同步修改查询语句。
新的语法则可以简化我们的工作:
SELECT*(EXCLUDE(password))FROMusers;新语法不仅支持字段排除,还可以进行替换和重命名。例如:
SELECT*(EXCLUDE(a,b)REPLACE(cWITHx+y,dWITHz*2)RENAME(eASee,fASfoo))FROMt...JOIN TO ONE
JOIN TO ONE 语法可以帮助我们发现 JOIN 编写错误,确保左表每行最多只能匹配右表一行;如果某一行匹配出多条记录,则抛出异常。
例如:
SELECTro.room_number,ro.room_type,ro.price,re.guest_nameFROMreservations reINNERJOINTOONE rooms roONro.room_number=re.room_numberWHEREre.id=16354;如果我们在以上 JOIN 查询的关联条件中错写成 ro.room_number = ro.room_number,查询可能返回大量重复记录,此时 JOIN TO ONE 会发现这个问题并返回错误。
基于外键的连接检查
这是一个尚在讨论中的特性,还没有通过提案。
它的目标比 JOIN TO ONE 更进一步,不是运行时检查,而是在语义层面验证 JOIN 是否与外键约束一致。
可能的实现如下:
SELECTro.room_number,ro.room_type,ro.price,re.guest_nameFROMreservationsASreJOINroomsASroFORKEY(room_number)<-re(room_number)WHEREre.reservation_id=16354;此时,数据库会验证 reservations 表中以下定义是否存在:
FOREIGNKEY(room_number)REFERENCESrooms(room_number)如果没有这样的外键定义,数据库会返回错误。
总结
SQL 已经诞生超过半个世纪,很多程序员都以为 SQL 标准早就定型了。但实际上,ISO 标准委员会仍在持续进化这门语言;而这一次的方向则是提高查询语义表达能力,减少用户犯错的机会。
原计划 2027 年中发布新的 SQL 标准版本,不过目前还存在一些变化因素。