2.6 连接表
大约 2 分钟
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。
实际使用中,我们常常使用此缩写风格。