前回
14. 結合
- 結合()は別のテーブルから列を持ってきて「列を増やす」操作である。
- 結合の基本は内部結合と外部結合である。
- 結合演算は必ず標準の構文で書くようにする。
14.1 結合とは
結合()は別のテーブルから列を持ってきて「列を増やす」操作で、「双方のテーブルに属する列を橋渡しの“橋”に用いて片方のみに属する列動詞を一緒の結果に含めること」である。欲しいデータが1つのテーブルからのみでは選択できない場合に用いる。
14.2 内部結合 INNER JOIN
まずは内部結合を扱う。
句に句を追加することで複数のテーブルを選択する。そして句で両者の橋渡しに用いる列(結合キー)を等号でつなぐ*1。
内部結合では双方のテーブルの結合キーに共通して存在する行のみが選択される。
-- INNER JOIN: ID列が双方に共通するものだと仮定する。 SELECT A1.ID, A1.a, A1.b, A2.c, A2.d FROM ABC1 AS A1 INNER JOIN ABC2 AS A2 ON A1.ID = A2.ID WHERE A1.ID BETWEEN 'abc100' AND 'abc900'
14.3 外部結合 OUTER JOIN
外部結合では、内部結合と同じように、句に句を追加することで複数のテーブルを選択する。そして句で両者の橋渡しに用いる列(結合キー)を等号でつなぐ*2。
内部結合では双方のテーブルの結合キーに共通して存在する行のみが選択される一方で、外部結合では少なくとも一方のテーブルに存在する行がすべて選択される。
どちらのテーブルを主にするかを決めたい場合には、の代わりに(先に(=FROM側で)宣言したテーブルを主としたい場合)または(後に(=JOIN側で)宣言したテーブルを主としたい場合)を用いる。どちらを用いても問題ない*3。
-- INNER JOIN: ID列が双方に共通するものだと仮定する。 SELECT A1.ID, A1.a, A1.b, A2.c, A2.d FROM ABC1 AS A1 OUTER JOIN ABC2 AS A2 ON A1.ID = A2.ID WHERE A1.ID BETWEEN 'abc100' AND 'abc900'
14.4 複数テーブルの結合
結合するテーブルの数に制限はない。
14.5 クロス結合 CROSS JOIN
結合したテーブルのレコードについて、すべての組み合わせを作る結合をという。
これは結果の使い道が僅少なこと、結果が非常に多くなり時間とマシンパワーを浪費するため、実務上、めったに使わない。ただし上記のの基礎になるものであるから触れておく。
14.6 結合の方言と古い構文
結合には未だに方言や古い構文が扱われている場合があり、他人の書いたクエリを見るのに知っておいた方が良い。
-- 以下は古い構文で未だに有効だが、「問題がある」 -- (1) INNER JOINなのかOUTER JOINなのかが不明 -- (2) どこが結合条件で、どこがレコードの制限条件なのかが不明 -- (3) この構文がいつ無効になるかが分からない SELECT A1.ID, A1.a, A1.b, A2.c, A2.d FROM ABC1 A1, ABC2 A2 WHERE A1.ID = A2.ID AND A1.ID BETWEEN 'abc100' AND 'abc900'