如果我遇到以下情况:
**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
---------------
VS
SELECT * FROM table1 LEFT OUTER JOIN table 2 ON person
答案 0 :(得分: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
并采取其他方法,例如将0
(汽车)用作table2
中没有条目的人的默认值似乎是完全合理的:
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 );