什么是 SQL 子句?

Ksh*_*rma 9 sql-standard

这听起来像是一个过于简单的问题,但我发现找到正确的答案并不容易。

关于“什么是 sql 子句?”的问题 互联网上的大多数资源只是提供了一个条款列表并解释了它们的作用。

但我试图抽象地理解它是如何定义的。就像一个通用符号,它捕获了可以编写的所有类型的查询以及子句在其中的适应方式。

是否存在所有子句共有的属性?为什么 UNION 被称为运算符而 HAVING 是一个子句?

RDF*_*ozz 9

一般而言,子句只是 SQL 语句的逻辑块 - 通常是(理论上)可选的块。

我是一个 SQL Server 人,所以我会考虑这些方面。

SELECT GETDATE()是有效的 SQL ServerSELECT语句。它将返回当前日期和时间。

如果我添加一个FROM条款:

SELECT GETDATE()
  FROM sys.objects
Run Code Online (Sandbox Code Playgroud)

我将取回n行(其中nsys.objects表中的行数),每一行都有相同的(未命名)列,显示当前日期和时间。

您可以添加一个WHERE子句来限制您带回的行数;一个GROUP BY子句,用于对您的数据进行重复数据删除,或允许您将聚合值放入SELECT列表中;一个 HAVING 子句(通常用于消除基于聚合数据的行);一个ORDER BY对数据进行排序的子句 - 但是,这些都不必在那里。

您会注意到我SELECT在提到返回的列列表时说的是“列表”。我从未听说过将其称为子句 - 大概是因为它确实必须存在。

另一方面,运算符用于组合或比较两个完整的项目。就像+运算符可以组合数字 ( 1 + 2) 或字符串 ( [firstname] + ' ' + [lastname]) 一样UNIONEXCEPTDIFFERENCE、 和INTERSECT运算符可以组合两个 SQL 语句。

我可能过于简单化了,但是从这些方面考虑至少应该使您朝着正确的方向前进。