为什么INNER JOIN有关键字?

时间:2017-02-13 21:45:10

标签: sql

我在这里跟随:

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;

我的问题是:为什么?

2 个答案:

答案 0 :(得分:3)

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子句;而你仍然需要格式化你的代码。但是,如果你做这些事情,那么随叫随到的支持人员诅咒你的名字的理由就会少得多。

答案 1 :(得分:0)