默认隐式参数SQL

时间:2018-11-08 10:52:28

标签: sql postgresql

考虑到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中默认和可选参数(在我们的示例中为隐式联接)的概念背后的原因吗?

2 个答案:

答案 0 :(得分:1)

此语法由SQL标准委员会明智地设计。

没有人可以指责SQL过于简洁,但是我想在某些情况下可以认为缩写语法的选项是适当的(想到的另一种情况是CREATE TEMP[ORARY] TABLE)。

您提到了可读性问题,我认为这是一个有效的问题。我们可能会同意,非常简洁的语法会影响可读性,但过于冗长的语法也会如此。

我认为这主要是编写标准的人的品味和判断力问题。

答案 1 :(得分:1)

您的问题有点难以理解。 INNEROUTER不是参数。它们是关键字。语法图没有对此进行明确说明,但是SQL支持以下JOIN运算符:

  • JOIN
  • INNER JOIN
  • LEFT JOIN
  • LEFT OUTER JOIN
  • RIGHT JOIN
  • RIGHT OUTER JOIN
  • FULL JOIN
  • FULL OUTER JOIN
  • CROSS JOIN

这些是成对的,除了CROSS JOIN之外。换句话说,INNEROUTER是可选的。

为什么会这样?我认为在设置SQL标准方面几乎没有“智慧”。标准委员会(主要)由行业代表组成,他们通常是已经实施了该功能的公司。然后,这些标准将其“兼容地”整合在一起。因此,一些成员想要显式的INNEROUTER。其他人没有。 “妥协”是要允许两者。

对于您的问题,这些查询是等效的。但是表达逻辑的正确方法避免了ON子句:

SELECT * 
FROM T1 CROSS JOIN T2;