ねぎとろ放浪記

ねぎとろ放浪記

個人的備忘録です。勉強したことをまとめていきます。

基本情報で使うSQL テーブル結合編

データベースを得点源にしよう!の第三弾のテーブル結合編です。
(前回の記事はこちら)

今回扱う関数

  1. INNER JOIN
  2. LEFT OUTER JOIN
  3. RIGHT OUTER JOIN
  4. FULL JOIN
  5. UNION ALL
  6. UNION


今回は以下の2つの表を操作します。
メンバー表

 id | name | age | gender | team_id 
----+------+-----+--------+---------
  1 | 佐藤 |  22 |      1 |       1
  2 | 鈴木 |  23 |      2 |       3
  3 | 高橋 |  25 |      2 |        
  4 | 後藤 |  30 |      1 |       1
  5 | 村井 |  35 |      2 |       2

チーム表

 id |  name   
----+---------
  1 | チームA
  2 | チームB
  3 | チームC
    | チームD

テーブルの結合とは

複数の表から集めたデータを並べて、新たな表をつくる処理のこと。

f:id:neginegitoro:20201206155000j:plain
テーブルの結合

この図では、メンバー表とチーム表をteam_idを用いて結合し、新たな表を作っています。

結合の種類

1種類の内部結合と3種類の外部結合がある。

構文 名前 処理
INNER JOIN 内部結合 結合相手がいない行は削除される
LEFT OUTER JOIN 左外部結合 左の表を基準に結合
左の表の行は全て残る
RIGHT OUTER JOIN 右外部結合 右の表を基準に結合
右の表の行は全て残る
FULL JOIN 完全外部結合 左右の行が全て残る

内部結合(INNER JOIN)

INNER JOINもしくはJOINを使います。

両方の表に値が存在する行のみ残す形式です。

SELECT member.name, age, gender, team.name as team_name
FROM member 
INNER JOIN team 
ON member.team_id = team.id;

実行結果

 name | age | gender | team_name 
------+-----+--------+-----------
 佐藤 |  22 |      1 | チームA
 後藤 |  30 |      1 | チームA
 村井 |  35 |      2 | チームB
 鈴木 |  23 |      2 | チームC

メンバー表のteam_idとチーム表のidで結合しました。

INNNER JOIN なので、結合相手がいない(team_idがない)人は表示されていません。

高橋さんはteam_idがないので表示されていません。

member.name という書き方は、メンバー表のnameカラムという意味です。
同じ名前のカラムが存在しないならテーブル名を明記しなくてもOKです。

左外部結合(LEFT OUTER JOIN)

LEFT JOINを使います。

左側の表を基準にして結合します。

左の表の値は結合相手がいなくても表示されます。

SELECT member.name, age, gender, team.name as team_name
FROM member 
LEFT OUTER JOIN team 
ON member.team_id = team.id;

実行結果

 name | age | gender | team_name 
------+-----+--------+-----------
 佐藤 |  22 |      1 | チームA
 後藤 |  30 |      1 | チームA
 村井 |  35 |      2 | チームB
 鈴木 |  23 |      2 | チームC
 高橋 |  25 |      2 | 

メンバー表を基準に結合しているので、チームIDがない高橋さんも表示されています。

右側外部結合はこの逆です。

完全外部結合(FULL JOIN)

FULL JOINを使うと、結合相手のいないレコードもすべて表示されます。

SELECT member.name, age, gender, team.name as team_name
FROM member 
FULL JOIN team 
ON member.team_id = team.id;

実行結果

 name | age | gender | team_name 
------+-----+--------+-----------
 佐藤 |  22 |      1 | チームA
 後藤 |  30 |      1 | チームA
 村井 |  35 |      2 | チームB
 鈴木 |  23 |      2 | チームC
 高橋 |  25 |      2 | 
      |     |        | チームD

高橋さんもチームDも表示されています。

結果の統合(UNION ALL)

UNION ALLは2つ以上のSELECTの結果を統合して表示します。

SELECT [カラム名] FROM [テーブル名] WHERE [条件]
UNION ALL
SELECT [カラム名] FROM [テーブル名] WHERE [条件];

メンバー表から25歳以下の人と35歳以上の人を表示してみます。

SELECT name, age FROM member WHERE age <= 25
UNION ALL
SELECT name, age FROM member WHERE age >=35;

実行結果

 name | age 
------+-----
 村井 |  35
 佐藤 |  22
 高橋 |  25
 鈴木 |  23

選択するカラムは2つのSELECTで同じである必要があります。

UNIONとすると重複するレコードは重複したレコードは削除されます。



以上テーブル結合編でした!
次回はテーブル操作編です。