跳至主要內容

2.6 连接表

LiuSongLing大约 2 分钟pgsqlpgsql

SELECT 语句查询可以一次查询多个表,也可以以同时处理表的多个行的方式访问同一个表。

一次访问多个表(或同一表的多个实例)的查询称为联接查询。它们将一个表中的行与第二个表中的行组合在一起,并使用一个表达式指定要配对的行。

例如,若要返回所有天气记录以及关联城市的位置,数据库需要将 weather 表的每一行的 city 列与 cities 表中所有行的 name 列进行比较,并选择这些值匹配的行对。

这将通过以下查询来实现:

SELECT * FROM weather JOIN cities ON city = name;

在联接查询中限定所有列名被广泛认为是一种很好的样式,这样,即使两张表存在重复的列名,查询也不会失败。

SELECT weather.city, weather.temp_lo, weather.temp_hi,
       weather.prcp, weather.date, cities.location
    FROM weather JOIN cities ON weather.city = cities.name;







以下查询称为左外部联接,因为 join 运算符左侧提到的表在输出中至少有一次其每一行,而右侧的表将仅具有与左表的某一行匹配的行输出。输出没有右表匹配的左表行时,空 (null) 值将替换为右表列。

SELECT *
    FROM weather LEFT OUTER JOIN cities ON weather.city = cities.name;

我们也可以 join 一个 table 对着自己。这称为自联接。例如,假设我们希望查找其他天气记录的温度范围内的所有天气记录。因此,我们需要将每个 weather 行的 temp_lo 列和 temp_hi 列与所有其他 weather 行的 temp_lo 列和 temp_hi 列进行比较。我们可以使用以下查询来执行此操作:

SELECT w1.city, w1.temp_lo AS low, w1.temp_hi AS high,
       w2.city, w2.temp_lo AS low, w2.temp_hi AS high
    FROM weather w1 JOIN weather w2
        ON w1.temp_lo < w2.temp_lo AND w1.temp_hi > w2.temp_hi;

为了节省输入,我们为表取了 简易的别名 w1、w2。

实际使用中,我们常常使用此缩写风格。