联接表

到此为止,我们一次只能对一个表进行查询.我们可以同时查询多个表,或者同时处理一个表的多个记录.一个同时访问一个或多个表的多个记录的查询叫连接查询.比如,我们想找出所有温度范围在其他记录的温度范围之内的记录.实际上,我们需要拿每个 EMP 记录的 temp_lo 和 temp_hi 字段和所有其他 EMP 记录的相应字段作比较.
注意:这只是一个概念上的模型.实际的联合查询可以一种更有效的方式进行,但却是用户不可见的.
我们可以用下面的查询:
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, weather W2
    WHERE W1.temp_lo < W2.temp_lo
    AND W1.temp_hi > W2.temp_hi;

+--------------+-----+------+---------------+-----+------+
|city          | low | high | city          | low | high |
+--------------+-----+------+---------------+-----+------+
|San Francisco | 43  | 57   | San Francisco | 46  | 50   |
+--------------+-----+------+---------------+-----+------+
|San Francisco | 37  | 54   | San Francisco | 46  | 50   |
+--------------+-----+------+---------------+-----+------+
注意: 此连接查询的语意是要从查询里声明的表的笛卡儿乘积里面找出符合查询条件的所有记录。对笛卡儿乘积里面资格条件为真的记录, Postgres 计算并返回目标列表的所有值. PostgresSQL 并不对表达式中的重复值赋予任何特殊含义,这就意味着Postgres 有时候会若干次重复计算同一目标列表;这种情况在布尔表达式包含"or"时尤甚,为了避免重复,你应该使用 select distinct 语句.
在本例中,W1 和 W2 都是表 weather 的别名,都具有weather表的所有记录.在大多数数据库术语里 W1 和 W2 被看作是范围变量(range variables.) 一个查询可以包含任意数量的表名和别名.