为什么INNER JOIN有一个关键字



我在这里跟随:

https://www.tutorialspoint.com/sql/sql-using-joins.htm

笛卡尔连接是由一个select语句指定的,没有特殊的表示法。这是合理的,因为您从SELECT语句中取出了所有可能的有序n元组组合。SELECT就是这么做的。

SELECT table1.column1, table2.column2...
FROM  table1, table2;

如果你想强加条件,你可以使用WHERE来要求它们。所以我希望INNER JOIN没有特殊的关键字,因为您可以只使用笛卡尔连接,然后限制为WHERE table1.column1=table2.column2

相反,符号是这样存在的:

SELECT table1.column1, table2.column2...
FROM table1
INNER JOIN table2
ON table1.common_field = table2.common_field;

我的问题是:为什么?

FROM子句中列出表并在WHERE子句中放置所有筛选器(包括联接条件)是旧的方法。曾经这种方法(带有一些扩展语法)甚至用于外部联接(至少在Oracle上)。

但现在的标准方法是使用显式联接。那为什么呢?

当您有多个联接,并且可能筛选不属于任何联接的条件时,使用显式联接语法更具可读性。

考虑:

SELECT emp.ID, mgr.ID, dept.NAME, asset.TAG_NO
FROM employee emp, employee mgr, department dept, asset
WHERE emp.HIRE_DT > :grandfather_date
AND emp.MGR_ID = mgr.ID
AND dept.NAME != 'IT'
AND asset.EMP_ID = mgr.ID
AND asset.TYPE_CD == 'D'

现在,在解决这个查询的问题时,您可能需要快速评估以下内容:我是否正确地联接了所有表?如果一行显示员工a和经理B,则该行的资产分配给谁?谁必须在IT部门才能被排除在报告之外?

仔细组织查询中的代码可以帮助您更快、更可靠地回答这些问题。(当我们深入研究时,这是一个相当适中的查询;查询越大,这就越重要。)

好吧,当前的标准连接语法强加了一些你应该想要的合理结构:

SELECT emp.ID, mgr.ID, dept.NAME, asset.TAG_NO
FROM            employee emp
INNER JOIN employee mgr
ON emp.MGR_ID = mgr.ID
INNER JOIN department dept
-- OOPS! This was missing above!
ON emp.DEPT_ID = dept.ID
INNER JOIN asset
ON asset.EMP_ID = mgr.ID
WHERE emp.HIRE_DT > :grandfather_date
AND dept.NAME != 'IT'
AND asset.TYPE_CD == 'D'

谓词是或不是联接条件这一事实现在是明确的。你知道哪个联接受到给定谓词的约束,所以你知道你是否对所有联接都有约束(事实上,除非你特别使用CROSS JOIN语法,否则你必须……因为这几乎总是正确的)。如果您需要知道"我们谈论的是谁的资产(员工或经理)",您可以直接进入asset表的联接条件进行检查。

如果你有很多不加入的条件,你可能仍然需要考虑组织你的where子句;你仍然需要格式化你的代码。但如果你做了这些事情,随叫随到的支持人员诅咒你的名字的理由就会少得多。

我认为您只需要了解什么是隐式连接和显式连接以及它们之间的区别。

下面提到的链接将对您有所帮助。

http://sql-plsql.blogspot.in/2011/02/explicit-implicit-sql-joins.html

显式与隐式SQL联接

http://chase-seibert.github.io/blog/2009/04/17/mixing-and-matching-implicit-and-explicit-joins.html

最新更新