这听起来像是一个过于简单的问题,但我发现找到正确答案并不容易。
对于“什么是 sql 子句?”这个问题。互联网上的大多数资源只是提供了一个条款列表并解释了它们的作用。
但我试图用抽象的术语来理解它是如何定义的。就像一个通用表示法,它捕获可以编写的各种查询以及子句如何适合其中。
所有子句都有共同的属性吗?为什么 UNION 称为运算符,而 HAVING 是子句?
这听起来像是一个过于简单的问题,但我发现找到正确答案并不容易。
对于“什么是 sql 子句?”这个问题。互联网上的大多数资源只是提供了一个条款列表并解释了它们的作用。
但我试图用抽象的术语来理解它是如何定义的。就像一个通用表示法,它捕获可以编写的各种查询以及子句如何适合其中。
所有子句都有共同的属性吗?为什么 UNION 称为运算符,而 HAVING 是子句?
一般而言,子句只是 SQL 语句的逻辑块 - 通常是(理论上)可选的块。
我是一个 SQL Server 人,所以我会从这些方面考虑。
SELECT GETDATE()
是有效的 SQL ServerSELECT
语句。它将返回当前日期和时间。如果我添加一个
FROM
子句:我将返回n行(其中n是
sys.objects
表中的行数),每行都将具有相同的(未命名的)列,显示当前日期和时间。您可以添加一个
WHERE
子句来限制您带回的行数;GROUP BY
删除重复数据或允许您将汇总值放入列表中的子句SELECT
;HAVING 子句(通常用于根据聚合数据消除行);一个ORDER BY
对数据进行排序的子句 - 但是,这些都不是必须存在的。您会注意到,
SELECT
当提到返回的列列表时,我说的是“列表”。我从来没有听说过这被称为条款——大概是因为它必须在那里。另一方面,运算符用于组合或比较两个完整的项目。就像
+
运算符可以让您组合数字 (1 + 2
) 或字符串 ([firstname] + ' ' + [lastname]
)一样UNION
,EXCEPT
、DIFFERENCE
、 和INTERSECT
运算符可以让您组合两个 SQL 语句。我可能过于简单化了,但从这些方面思考至少应该让你朝着正确的方向前进。
您可以看到Oracle 提供的清单:
(其中一些不是 100% SQL 标准)。
我将一个子句称为“SQL 语句中定义明确的部分,通常是可选的”。从语法中得到提示(其中一个从句被定义为“可以表达一个完整命题的最小语法单位”),每个从句都是有意义的。它也有特定的语法。
一个语句(在某种程度上等同于语法中的一个句子)可以由一个子句 (
SELECT something
) 或其中几个子句 (SELECT something
..FROM a_table
...WHERE a_condition_is_met
...GROUP BY some_column
...HAVING some_property
...ORDER BY some_criteria
)组成你可以找到一个很好的参考:ANSI SQL-1992
SQL语言的第二个标准化。