基本情報で使うSQL テーブル結合編
データベースを得点源にしよう!の第三弾のテーブル結合編です。
(前回の記事はこちら)
今回扱う関数
今回は以下の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
テーブルの結合とは
複数の表から集めたデータを並べて、新たな表をつくる処理のこと。
この図では、メンバー表とチーム表を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
とすると重複するレコードは重複したレコードは削除されます。
以上テーブル結合編でした!
次回はテーブル操作編です。