ここまで、問い合わせは一度に一つのテーブルのみにアクセスするだけで した。しかし、問い合わせは一度に複数のテーブルにアクセスすることが できますし、またテーブルの複数行が同時に処理されている場合において は同じテーブルにアクセスすることもできます。一回に同じもしくは異な るテーブルの複数行にアクセスする問い合わせは結合問い合わせと呼ばれ ます。例として、他のレコードの温度範囲にあるすべてのレコードを探し たいとします。実際にはすべての WEATHER テーブルの行の temp_lo と temp_hi カラムにともう一つの WEATHER テーブルの行の temp_lo と temp_hi カラムを比較する必要があります。
Note: これは概念モデルだけです。実際の結合はより効率的な方法において実 行されるかもしれませんが、これはユーザには見えません。
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 | +--------------+-----+------+---------------+-----+------+
Note: このような結合の意味論は、条件は問い合わせで指示したテーブルの直 積のために定義された式であるということです。条件が真である直積に に含まれる行に対して、Postgres はターゲットリストで指定される値 を計算して返します。Postgres SQL はこのような式において値が重複されること はありません。これはPostgres時々同じ ターゲットリストに数回のを再計算を行うからです。Boolean 演算子が 「or」と組み合わされるときしばしばこれが起こります。重複を取り除 くにはSELECT DISTINCT 文を使用しなければいけ ません。
この場合、W1とW2のテーブルは weather テーブルの行とテーブルのすべての行を越えた両方の範囲の代わ りをするものです。(大部分のデータベースシステムの用語においては、 W1 と W2 は範囲変 数として知られています。)問い合わせは、任意の多くのテー ブル名と代理名を記述することができます。