考虑到SQL是一种声明性语言,我似乎无法弄清楚在SQL中具有默认隐式参数的意义(请参见下面的示例)。强制参数不是确保更多可读性的一种方法吗?毕竟,代码只能被编写一次并被人类读取多次(或至少一次)。
例如,在PostgreSQL中,我们有following syntax:
T1 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2 ON boolean_expression
以下查询:
SELECT *
FROM T1 JOIN T2
ON true;
表示内部联接,表示它等于以下查询:
SELECT *
FROM T1 INNER JOIN T2
ON true;
有人可以向我解释SQL中默认和可选参数(在我们的示例中为隐式联接)的概念背后的原因吗?
答案 0 :(得分:1)
此语法由SQL标准委员会明智地设计。
没有人可以指责SQL过于简洁,但是我想在某些情况下可以认为缩写语法的选项是适当的(想到的另一种情况是CREATE TEMP[ORARY] TABLE
)。
您提到了可读性问题,我认为这是一个有效的问题。我们可能会同意,非常简洁的语法会影响可读性,但过于冗长的语法也会如此。
我认为这主要是编写标准的人的品味和判断力问题。
答案 1 :(得分:1)
您的问题有点难以理解。 INNER
和OUTER
不是参数。它们是关键字。语法图没有对此进行明确说明,但是SQL支持以下JOIN
运算符:
JOIN
INNER JOIN
LEFT JOIN
LEFT OUTER JOIN
RIGHT JOIN
RIGHT OUTER JOIN
FULL JOIN
FULL OUTER JOIN
CROSS JOIN
这些是成对的,除了CROSS JOIN
之外。换句话说,INNER
和OUTER
是可选的。
为什么会这样?我认为在设置SQL标准方面几乎没有“智慧”。标准委员会(主要)由行业代表组成,他们通常是已经实施了该功能的公司。然后,这些标准将其“兼容地”整合在一起。因此,一些成员想要显式的INNER
和OUTER
。其他人没有。 “妥协”是要允许两者。
对于您的问题,这些查询是等效的。但是表达逻辑的正确方法避免了ON
子句:
SELECT *
FROM T1 CROSS JOIN T2;