至少有几个问题:
- 该标准有很多版本:1986、1989、1992(一些工作大约在 1996 年左右)、1999、2003、2008 和 2011 版本。
- 如今,该标准有多个部分。有 SQL/Foundation(核心 SQL),还有很多可选的扩展。
- 每个 DBMS 都有自己对 SQL 标准的扩展,它们也都省略了标准的某些方面。
您可以在此处找到某些版本的标准的 BNF(Backus-Naur 格式)语法。这些是高度超链接的 HTML。然而,标准不仅仅是 SQL 语法;在标准的其余部分中,关于何时何地允许什么(通常没有太多解释为什么)有很多(很多很多)规则。该标准有时几乎不可能不透明。
下面是一个来自 ISO/IEC 9075-2:2003 (E) 的简单示例——这是 SQL-2003 的 SQL/Foundation:
10.7<collate clause>
功能
指定默认排序规则。
格式
<collate clause> ::= COLLATE <collation name>
语法规则
1) 令 C<collation name>
包含在<collate clause>
. 由显式或隐式限定符标识的模式<collation name>
应包括 C 的描述符。
访问规则
1) 案例:
a) 如果在 中包含,没有指定 SQL SECURITY INVOKER<collate clause>
的干预,则拥有包含模式的适用权限
应包括 C 上的 USAGE。<SQL routine spec>
<SQL schema statement>
<authorization identifier>
b) 否则,当前权限应包括 C 上的 USAGE。
注 228——“适用特权”和“当前特权”在子条款 12.3,“<code><privileges>”中定义。
一般规则
没有任何。
一致性规则
1) 如果没有 Feature F690,“Collation support”,符合的 SQL 语言不得包含<collate clause>
.
一个不太平淡的例子是<cast specification>
有 16 页的 gobbledygook 描述它。这是从大约 2/3 开始。这是“一般规则”第 16 条(共 20 条):
16) 如果 TD 是日期时间数据类型 TIME WITH TIME ZONE,则令 TSP<time precision>
为 TD 的。
案子:
a) 如果 SD 是字符串,则 SV 替换为:
TRIM ( BOTH ' ' FROM VE )
案子:
i) 如果第 5.3 节“<code><literal>”中的 for<literal>
或 for规则<unquoted time string>
可应用于 SV 以确定数据类型 TD 的有效值,则令 TV 为该值。
ii) 如果第 5.3 节“<code><literal>”中的规则 for<literal>
或 for<unquoted time string>
可应用于 SV 以确定数据类型 TIME(TSP) WITHOUT TIME ZONE 的有效值,则令 TV1 为该值,并且让 TV 的值是:
CAST ( TV1 AS TIME(TSP) WITH TIME ZONE )
iii) 如果 a<datetime value>
不符合公历日期或时间的自然规则,则引发异常条件:数据异常 — 无效的日期时间格式。
iv) 否则,引发异常条件:数据异常 — 强制转换的无效字符值。
b) 如果 SD 是 TIME WITH TIME ZONE,则 TV 是 SV,必要时使用实现定义的舍入或截断。
c) 如果 SD 是 TIME WITHOUT TIME ZONE,则 TV 的 UTC 分量为 SV – STZD,以 24 小时为模计算,必要时进行实现定义的舍入或截断,TV 的时区分量为 STZD。
d) 如果 SD 是 TIMESTAMP WITH TIME ZONE,则 TV 的 UTC 分量是 SV 的时、分、秒<primary datetime field>
,必要时进行实现定义的舍入或截断,TV 的时区分量是时区位移SV 的。
e) 如果 SD 是 TIMESTAMP WITHOUT TIME ZONE,那么 TV 是:
CAST ( CAST ( SV AS TIMESTAMP(TSP) WITH TIME ZONE )
AS TIME(TSP) WITH TIME ZONE )
标准中的缩进稍微好一点,并且您会对某些名称(例如 TV、SV、SD 等)有更多的上下文,但使用的语言确实是那么夸张。