对于SQL,何时开始使用单词"Inner Join"而不是隐式连接?

nop*_*ole 5 mysql sql join inner-join outer-join

对于SQL,什么时候开始需要始终使用单词"Inner Join"而不是通过以下方式隐式加入:

select * from t1, t2 where t1.ID = t2.ID;
Run Code Online (Sandbox Code Playgroud)

?它只是为了风格或区分外部联接还是有其他原因吗?

Tho*_*mas 3

INNER 和 OUTER JOIN 语法在 SQL-92 规范中得到了形式化。在许多数据库产品(例如 MySQL 和 SQL Server)中,您可以省略内连接中的“INNER”一词,而仅使用“JOIN”。同样,许多数据库产品允许您省略“OUTER”一词,而仅使用“LEFT JOIN”或“RIGHT JOIN”进行外连接。旧的外连接语法*=or=*在许多情况下会产生歧义。许多产品已经或很快将停止支持旧的外连接语法。

在 SQL-92 规范之前,供应商各自使用自己的语法来表示外连接。即,*=不是通用的(我似乎记得有人使用?=)。此外,他们没有以通用的方式实现外连接。举个例子:

Table1
Col1    Col2
1       Alice
2       Bob

Table2
Col1    Col2
1           1
2           2
3           3
4           4

Select 
From Table1, Table2
Where Table2.Col1 *= Table1.Col1
Run Code Online (Sandbox Code Playgroud)

上述查询通常会产生:

1   1   1       Alice
2   2   2       Bob
3   3   Null    Null
4   4   Null    Null
Run Code Online (Sandbox Code Playgroud)

现在尝试:

Select 
From Table1, Table2
Where Table2.Col1 *= Table1.Col1
    And Table2.Name = 'Alice'
Run Code Online (Sandbox Code Playgroud)

在某些数据库产品上,您将得到:

1   1   1       Alice
Run Code Online (Sandbox Code Playgroud)

在其他方面你会得到:

1   1   1       Alice
2   2   Null    Null
3   3   Null    Null
4   4   Null    Null
Run Code Online (Sandbox Code Playgroud)

简而言之,对于未保留表的过滤应该在连接之前还是之后应用是不明确的。