我在这里跟随:
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;
我的问题是:为什么?
答案 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)