如何在SQL中使用多个联接?

时间:2019-07-12 07:09:22

标签: sql

处理多个联接时,我无法理解其工作原理。

我正在使用左联接和右联接编写多个联接。

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;

左联接和右联接得到相同的结果。我不明白它是如何工作的。

4 个答案:

答案 0 :(得分:1)

您的languagescountries表可能具有相同的记录,请检查两个表中的记录,否则,我认为这种方法没有任何问题。

答案 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表获得匹配的记录(语言)。

因此,LEFTlanguages可能具有相同的记录可能导致相同的结果。

答案 3 :(得分:0)

写时:

FROM cities ci LEFT JOIN
     countries co
     ON ci.country_code = co.code LEFT JOIN
     languages l
     ON co.code = l.code

您在说:

  • 保留城市中的所有行。期间。
  • 国家/地区中不匹配的行的值为NULL。
  • 语言中不匹配的行将具有NULL值。

写时:

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

  1. 从认知上讲,遵循“保留第一个表中的所有内容(我已经知道)”比“保留最后一个表中的所有内容[[我不知道在阅读查询时还不知道什么]”要容易得多。 !]“
  2. SQL按照声明表的顺序隐式添加括号,因此“ A JOIN B JOIN C”被解释为(A JOIN B) JOIN C。这就是LEFT JOINRIGHT JOIN版本总是 (但在大多数情况下它们是相同的)的原因。

此外,使用表别名并限定所有列引用。