SQL の 基本 JOIN で複数のテーブル結合に挑戦!
SQL の中でも、複数のテーブルを結合 JOIN する方法は、 基本 中の基本です。ただ、結合の種類も複数あるので、それぞれの結合の種類を理解し、適切に使わなければ、意図した結果になりません。結合の入り口である、単純結合を紹介します。単純と言っても癖があるので、じっくり理解しましょう。
結合方法の種類
結合 JOIN(ジョイン)といってもいくつか種類が存在します。
- 直積結合(横方向積算結合) ⇐ 今回説明
- 和集合(縦方向結合) ⇐ 今回説明
- 内部結合
- 外部結合
を覚えればある程度の結合処理はできると思います。
以下に各結合の説明を進めます。
直接結合(CROSS JOIN クロスジョイン)
SELECT * FROM テーブルA CROSS JOIN テーブルB;
意味:Aというテーブルと、Bというテーブルを、積算結合したものを、抽出する。
積算結合というのは、テーブルAの一行(レコード)に対して、テーブルBの全行(レコード)をかけ合わせる問うことです。
テーブルAに3行、テーブルBに同じく3行登録されていたとします。
結果の行数(レコード数)は、3×3の9行になります。総当たりというイメージでしょうか。
テーブルA
カラム1 | ・・・ |
A1 | … |
A2 | … |
A3 | … |
×
テーブルB
カラム2 | ・・・ |
B1 | … |
B2 | … |
B3 | … |
||
カラム1 | ・・・ | カラム2 | ・・・ |
A1 | … | B1 | … |
A1 | … | B2 | … |
A1 | … | B3 | … |
A2 | … | B1 | … |
A2 | … | B2 | … |
A2 | … | B3 | … |
A3 | … | B1 | … |
A3 | … | B2 | … |
A3 | … | B3 | … |
え?何に使うの?と思われたかと思いますが、後述の集合の基本形となるのでまずおさえておいていただきたい結合となります。
といっても、使わない結合方法ではなく、一般的に、結合条件を指定して使われます。
これは、SELECT文でも使った、WHERE句を使います。
[https://way2se.ringtrees.com/sql-002/]
WHERE句による結合条件指定
SELECT * FROM テーブルA CROSS JOIN テーブルB WHERE テーブルA.ID = テーブルB.ID;
意味:Aというテーブルと、Bというテーブルのうち、それぞれのIDが一致するものを、積算結合し、抽出する。
一般的に使われるのはこの使い方ではないでしょうか。
テーブルA
カラム1 | ID |
A1 | 1 |
A2 | 2 |
A3 | 3 |
×
テーブルB
カラム2 | ID |
B1 | 1 |
B2 | 4 |
B3 | 5 |
||
カラム1 | ID | カラム2 |
A1 | 1 | B1 |
テーブルAのA1と、テーブルBのB1だけが、ID一致していないので、結果は一行となります。
テーブルAとテーブルBのID=1のものだけ結合して抽出する。よくある結合のイメージですね。カラムの表示などは、今回省略していますが、SELECTの後にそれぞれのカラムを指定すれば、それぞれのテーブルの必要な項目だけ結合した、結合テーブルを作成することが出来ると思います。
和集合(UNION ユニオン)
SELECT * FROM テーブルA UNION SELECT * FROM テーブルB;
意味:Aというテーブルと、Bというテーブルを、縦方向に集約する。
テーブルA
カラム | ・・・ |
A1 | … |
A2 | … |
A3 | … |
+
テーブルB
カラム | ・・・ |
B1 | … |
B2 | … |
B3 | … |
||
カラム | ・・・ |
A1 | … |
A2 | … |
A3 | … |
B1 | … |
B2 | … |
B3 | … |
例えば、年毎のデータを個別にテーブル化しているとして、合算する時のイメージですね。
お気づきかもしれませんが、これらの結合はデータの更新・編集ではなく、参照となっています。
既にある情報を抽出する方法の一つの手段ということですね。
複数あるテーブルを、一つにまとめたテーブルを作るのではなく、複数のテーブルを見え方で一つのテーブルとする。これがポイントです。
他にも内部結合・外部結合がありますが、別ページで説明します。
[https://way2se.ringtrees.com/sql-011/]
その他、SQL構文は以下にて整理分類しています。
[https://way2se.ringtrees.com/sql-001/]