处理多个联接时,我无法理解其工作原理。
我正在使用左联接和右联接编写多个联接。
SELECT cities.name AS city
, urbanarea_pop
, countries.name AS country
, indep_year
, languages.name AS language
, percent
FROM cities
LEFT JOIN countries
ON cities.country_code = countries.code
LEFT JOIN languages
ON countries.code = languages.code
ORDER BY city, language;
SELECT cities.name AS city
, urbanarea_pop
, countries.name AS country
, indep_year
, languages.name AS language
, percent
FROM languages
RIGHT JOIN countries
ON languages.code = countries.code
RIGHT JOIN cities
ON countries.code = cities.country_code
ORDER BY city, language;
左联接和右联接得到相同的结果。我不明白它是如何工作的。
答案 0 :(得分:1)
您的languages
和countries
表可能具有相同的记录,请检查两个表中的记录,否则,我认为这种方法没有任何问题。
答案 1 :(得分:0)
左连接返回左表中的每个记录,并返回右表中的匹配记录(基于您的连接条件)。出现在左侧但不在右侧的记录将把空值放在原本来自右表的列中。
右联接与之类似,不同之处在于它返回右表中的每个记录,并且只返回左表中的匹配记录。再次,左侧不存在的记录将返回为空。
请考虑以下两个表。...
表A
id
-
1
2
和表B
id
-
1
3
如果您运行
select a.*, b.*
from a LEFT outer join b on
a.id = b.id
您将得到:
a.id b.id
1 1
2 NULL
类似地,右外部联接将返回以下内容:
a.id b.id
1 1
NULL 3
作为参考,FULL OUTER JOIN将返回以下内容:
a.id b.id
1 1
2 NULL
NULL 3
由于无论外部联接的“方向”如何,您都将获得相同的结果,这意味着左表中的所有“键”值都与右表中的“键”值对齐。
答案 2 :(得分:0)
如果使用LEFT JOIN
关键字,将从LEFT
表(城市)中获取所有记录,并从RIGHT
表中获得匹配的记录(在您的情况下,{ {1}}和countries
)。
然后,如果您使用languages
关键字,则会从正确的表(在您的情况下为国家和城市)获得所有记录,并从RIGHT JOIN
表获得匹配的记录(语言)。
因此,LEFT
和languages
可能具有相同的记录可能导致相同的结果。
答案 3 :(得分:0)
写时:
FROM cities ci LEFT JOIN
countries co
ON ci.country_code = co.code LEFT JOIN
languages l
ON co.code = l.code
您在说:
写时:
FROM languages l RIGHT JOIN
countries co
ON l.code = co.code RIGHT JOIN
cities ci
ON co.code = ci.country_code
您在说:
countries
中的所有行,即使languages
中没有匹配的行。cities
中没有匹配的行,也请保留countries
中的所有行。在大多数情况下,这是同一回事。在某些情况下,您的国家/地区使用语言而不是城市,但是格式正确的数据模型不会出现此问题。
出于两个原因,我强烈建议您使用LEFT JOIN
:
(A JOIN B) JOIN C
。这就是LEFT JOIN
和RIGHT JOIN
版本总是 (但在大多数情况下它们是相同的)的原因。此外,使用表别名并限定所有列引用。