SQL编程语言的语法由ISO / IEC SC 32定义和维护,作为ISO / IEC 9075的一部分。该标准不是免费提供的。 尽管存在标准,但SQL代码在不经过调整的情况下不能在不同的数据库系统之间完全移植。
语言元素
SQL语言细分为几个语言元素,包括:
1、子句,是语句和查询的组成部分。
2、表达式,可以生成标量值,也可以生成由列和行数据组成的表。
3、谓词,指定可以评估为SQL三值逻辑(3VL)(真/假/未知)或布尔真值的条件,用于限制语句和查询的效果,或用于更改程序流。
4、查询,根据特定条件检索数据。这是SQL的一个重要元素。
语句可能对架构和数据产生持久影响,或者可能控制事务,程序流,连接,会话或诊断。
SQL语句还包括分号(“;”)语句终止符。虽然并非每个平台都需要,但它被定义为SQL语法的标准部分。在SQL语句和查询中通常会忽略无关紧要的空格,从而可以更轻松地格式化SQL代码以提高可读性。
操作
有时建议或实施其他运营商,例如天际线运营商(仅用于查找那些不比其他运营商“更糟糕”的记录)。
SQL具有case / when / then / else / end表达式,它是在SQL-92中引入的。 在其最常见的形式中,在SQL标准中称为“搜索案例”:
SQL测试条件按顺序出现在源中。 如果源未指定ELSE表达式,则SQL默认为ELSE NULL。 SQL标准镜像switch语句中的缩写语法 - 称为“简单大小写”:
此语法使用隐式相等比较,通常需要注意与NULL进行比较。特殊CASE表达式有两种简短形式:COALESCE和NULLIF。
COALESCE表达式返回通过从左到右工作找到的第一个非NULL操作数的值,如果所有操作数都等于NULL,则返回NULL。
相当于:
NULLIF表达式有两个操作数,如果操作数具有相同的值,则返回NULL,否则它具有第一个操作数的值。
相当于:
查询
SQL中最常见的操作(查询)使用声明性SELECT语句。 SELECT从一个或多个表或表达式中检索数据。标准SELECT语句对数据库没有持久影响。 SELECT的一些非标准实现可以具有持久性效果,例如某些数据库中提供的SELECT INTO语法。
查询允许用户描述所需的数据,让数据库管理系统(DBMS)执行计划,优化和执行生成所选结果所必需的物理操作。
查询包括要包含在最终结果中的列的列表,通常紧跟在SELECT关键字之后。星号(“*”)可用于指定查询应返回查询表的所有列。 SELECT是SQL中最复杂的语句,可选的关键字和子句包括:
FROM子句,指示从中检索数据的表。 FROM子句可以包含可选的JOIN子子句,以指定连接表的规则。
WHERE子句包含比较谓词,它限制查询返回的行。 WHERE子句从结果集中删除比较谓词未计算为True的所有行。
GROUP BY子句将具有公共值的行投影到较小的行集中。 GROUP BY通常与SQL聚合函数结合使用,或者从结果集中消除重复的行。 WHERE子句在GROUP BY子句之前应用。
HAVING子句包含用于过滤GROUP BY子句产生的行的谓词。因为它作用于GROUP BY子句的结果,所以可以在HAVING子句谓词中使用聚合函数。
ORDER BY子句标识用于对结果数据进行排序的列,以及对它们进行排序的方向(升序或降序)。如果没有ORDER BY子句,则SQL查询返回的行的顺序是未定义的。
DISTINCT关键字消除了重复数据。
LIMIT子句指定要返回的记录数。请注意,所有SQL数据库都不支持此子句。
查询的子句具有特定的执行顺序,由右侧的数字表示。它如下:
SELECT ......................................... 5
FROM
.............................................. 1WHERE <行上的谓词> ........................... 2
GROUP BY .......................................... 3
HAVING<关于群体的谓词> ....................... 4
ORDER BY ......................................... 6
以下SELECT查询示例返回昂贵的书籍列表。该查询从Book表中检索price列包含大于100.00的值的所有行。结果按标题按升序排序。选择列表中的星号(*)表示Book表的所有列都应包含在结果集中。
子查询
可以嵌套查询,以便可以通过关系运算符或聚合函数在另一个查询中使用一个查询的结果。 嵌套查询也称为子查询。 虽然连接和其他表操作在许多情况下提供计算上优越的(即更快的)替代方案,但子查询的使用在执行中引入了可能有用或必要的层次结构。 在以下示例中,聚合函数AVG接收子查询的结果作为输入:
子查询可以使用外部查询中的值,在这种情况下,它称为相关子查询。
自1999年以来,SQL标准允许子查询的WITH子句,即命名子查询,通常称为公共表表达式(也称为子查询因子分解)。 CTE也可以通过引用自己来递归;结果机制允许树或图遍历(当表示为关系时),更一般地说是固定点计算。
派生表
派生表是在FROM子句中引用SQL子查询的用法。实质上,派生表是可以从中选择或连接的子查询。派生表功能允许用户将子查询作为表引用。内联视图也称为内联视图或子选择。
在以下示例中,SQL语句涉及从初始“Book”表到派生表“sales”的连接。此派生表使用ISBN连接到“Book”表来捕获相关的图书销售信息。因此,派生表提供的结果集包含其他列(销售的商品数量和销售图书的公司):
数据操作
数据操作语言(DML)是用于添加,更新和删除数据的SQL的子集:
INSERT将行(正式元组)添加到现有表中,例如:
UPDATE修改一组现有的表行,例如:
DELETE从表中删除现有行,例如:
MERGE用于组合多个表的数据。它结合了INSERT和UPDATE元素。它在SQL:2003标准中定义;在此之前,一些数据库通过不同的语法提供了类似的功能,有时称为“upsert”。