【问题标题】:MySQL NATURAL LEFT OUTER JOIN vs LEFT OUTER JOINMySQL 自然左外连接与左外连接
【发布时间】:2016-11-02 01:27:22
【问题描述】:

如果我有以下情况:

**table 1
person| money
    A | 2
    B | 10
-------------


**table 2 
person| cars
    A | 3
    C | 10

---------------

两者有什么区别?

SELECT * FROM table1 NATURAL LEFT OUTER JOIN table2;

产生:

person| money |cars
    A | 2     |3
    B | 10    |NULL
---------------

SELECT * FROM table1 LEFT OUTER JOIN table 2 ON person

【问题讨论】:

  • 自然连接会推断连接列,并从结果集中移除重复的连接列。
  • 我不认为你的非NATURAL 版本是有效的语法。您的意思是使用USING 而不是ON?例如SELECT * FROM table1 LEFT OUTER JOIN table2 USING ( person ) ? table 2 中的空格也似乎是一个错字。
  • @TimBiegeleisen:我不同意它是重复的:例如如果不使用范围变量,您将无法回答其他问题(这有点像自然连接点,顺便说一句),而 OP 在这个问题中没有使用范围变量。

标签: mysql database outer-join natural-join


【解决方案1】:

我认为您的非NATURAL 版本中有拼写错误,您要比较的是:

SELECT * FROM table1 NATURAL LEFT OUTER JOIN table2;

SELECT * FROM table1 LEFT OUTER JOIN table2 USING ( person );

首先,我希望两者的结果相等。**

其次,在您的情况下,我在非NATURAL/USING 版本中看不到任何意义,因为您只有一列共有,并且它们的名称一致。

** 我打算用“关系而言”来限定(例如,列顺序和行顺序不相关),但 OUTER JOIN 明确设计用于生成空值,这在关系模型中没有位置!因此,我建议您完全避免 OUTER JOIN 并采取另一种方法,例如对于在table2 中没有条目的人,使用0(汽车)作为默认值似乎是完全合理的:

SELECT person, money, cars 
  FROM table1 
       NATURAL JOIN table2
UNION
SELECT person, money, 0 AS cars 
  FROM table1 
 WHERE person NOT IN ( SELECT person FROM table2 );

【讨论】:

    猜你喜欢
    • 2011-10-01
    • 2017-12-07
    • 2021-09-02
    • 1970-01-01
    • 2016-10-02
    • 2011-09-10
    • 2018-09-04
    • 2014-06-17
    相关资源
    最近更新 更多