MySQL 自然左外连接与左外连接
MySQL NATURAL LEFT OUTER JOIN vs LEFT OUTER JOIN
如果我有以下情况:
**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
版本有错别字,你比较的是:
SELECT * FROM table1 NATURAL LEFT OUTER JOIN table2;
SELECT * FROM table1 LEFT OUTER JOIN table2 USING ( person );
首先,我希望两者的结果相等。**
其次,在您的案例中,我看不到非 NATURAL
/USING
版本的任何意义,因为您只有一列是共同的,并且它们的名称一致。
** 我打算用 "relationally speaking" 来限定(例如列顺序和行顺序不相关)但是 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 );
如果我有以下情况:
**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
版本有错别字,你比较的是:
SELECT * FROM table1 NATURAL LEFT OUTER JOIN table2;
SELECT * FROM table1 LEFT OUTER JOIN table2 USING ( person );
首先,我希望两者的结果相等。**
其次,在您的案例中,我看不到非 NATURAL
/USING
版本的任何意义,因为您只有一列是共同的,并且它们的名称一致。
** 我打算用 "relationally speaking" 来限定(例如列顺序和行顺序不相关)但是 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 );