SQL标准最新进展,哪些是你期待的功能?

📅 2026/7/4 20:55:12
SQL标准最新进展,哪些是你期待的功能?
自从发布 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)tWHEREpriceavg_price;为了筛选窗口函数计算结果通常需要额外嵌套一层子查询。因为 WHERE 在窗口函数之前执行窗口函数结果不能直接出现在 WHERE 子句中。新的 QUALIFY 子句可以直接在同一查询中完成筛选SELECT*FROMproducts QUALIFY priceavg(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(cWITHxy,dWITHz*2)RENAME(eASee,fASfoo))FROMt...JOIN TO ONEJOIN TO ONE 语法可以帮助我们发现 JOIN 编写错误确保左表每行最多只能匹配右表一行如果某一行匹配出多条记录则抛出异常。例如SELECTro.room_number,ro.room_type,ro.price,re.guest_nameFROMreservations reINNERJOINTOONE rooms roONro.room_numberre.room_numberWHEREre.id16354;如果我们在以上 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_id16354;此时数据库会验证 reservations 表中以下定义是否存在FOREIGNKEY(room_number)REFERENCESrooms(room_number)如果没有这样的外键定义数据库会返回错误。总结SQL 已经诞生超过半个世纪很多程序员都以为 SQL 标准早就定型了。但实际上ISO 标准委员会仍在持续进化这门语言而这一次的方向则是提高查询语义表达能力减少用户犯错的机会。原计划 2027 年中发布新的 SQL 标准版本不过目前还存在一些变化因素。