到此为止,我们一次只能对一个表进行查询.我们可以同时查询多个表, 或者同时处理一个表的多个记录. 一个同时访问一个或多个表的多个记录的查询叫连接查询. 比如,我们想找出所有温度范围在其他记录的温度范围之内的记录. 实际上, 我们需要拿每个 WEATHER 记录的 temp_lo 和 temp_hi 字段和 所有其他 WEATHER 记录的相应字段作比较.
注意: 这只是一个概念上的模型.实际的联合查询可能以一种更有效的方式进行, 但却是用户不可见的.
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 计算并返回目标列表的所有值. Postgres SQL 并不对表达式中的重复值赋予任何特殊含义,这就意味着 Postgres 有时候会若干次重复计算同一目标列表;这种情况在布尔表达式包含"or"时尤甚, 为了避免重复,你应该使用 SELECT DISTINCT 语句.
在本例中,W1 和 W2 都是表 weather 中一行的别名,都具有weather表的所有记录. (在大多数数据库术语里 W1 和 W2 被看作是范围变量(range variables).) 一个查询可以包含任意数量的表名和别名.