テーブルの結合とは
テーブル同士をある条件で結合することにより、正規化なしの状態を作り出すことです。
※基本的には、正規化ですが、パフォーマンスの問題が解消できないもしくは、できなくなりそうな時、あえて非正規化することもあります。
主キー(Primary Key) 一つの行を特定できる列のことです。
外部キー(Foreign Key) 他テーブルとの関連付けに使う列のこと。
※外部キーは関連付けられた先のテーブルでは主キーになります。
結合処理をする時の記述順序と実行順序
記述順序
- select・・取得行(カラム)の指定
- from・・対象テーブルの指定
- 結合処理
- where・・・絞り込み条件の指定
- group by ・・・グループ化の条件を指定
- having・・・グループ化した後の絞り込み条件を指定
- order by・・・並び替え条件を指定
- limit・・・取得する行数の制限
実行順序
- from・・・対象テーブルの指定
- 結合処理
- where・・・絞り込み条件の指定
- group by・・・グループ化の条件を指定
- select・・・取得行(カラム)の指定
- having・・・グループ化した後の絞り込み条件を指定
- order by・・・並び替え条件を指定
- limit・・・取得する行の制限
※selectの記述順序と実行順序が異なります。
内部結合でテーブルを結合する(inner join)
inner Joinの構文
select テーブル名1列名, テーブル名2列名... from テーブル名1 inner join テーブル名2 on テーブル名1.列名 = テーブル名2.列名;
テーブル1 テーブル2
id | last_name | first_name | prefecture_id | id | name | |
---|---|---|---|---|---|---|
1 | xxxxx | xxxxx | 1 | 1 | 北海道 | |
2 | xxxxx | xxxxx | 4 | 4 | 宮城県 | |
3 | xxxxx | xxxxx | 8 | 8 | 茨木県 | |
4 | xxxxx | xxxxx | 27 | 27 | 大阪府 | |
5 | xxxxx | xxxxx | 43 | 43 | 熊本県 |
テーブル1では都道府県がIDで格納されています。
テーブル2には都道府県IDと都道府県名が格納されています。
このテーブルを結合して
ユーザーID,苗字,名前,都道府県名で表示してみます。
select デーブル1.id, テーブル1.last_name, テーブル1.first_name, テーブル2.name from テーブル1 inner join テーブル2 on テーブル1.prefecture_id = テーブル2.id;
すると以下のように結合されて出力されます
テーブル名が沢山あって見づらい時
以下のように記述を変更してSQLを見やすくしても出力結果は同じです。※as は省略可能です。
テーブル1→u
テーブル2→p
以下に表示している太字のテーブル名(asの前)は変更できません。
※inner join →joinもOKですが、外部結合の時は省略できません。
select u.id, u.last_name, u.first_name, p.name from テーブル1 as u inner join テーブル2 as p on u.prefecture_id = p.id;
whrer句を使ってさらに絞り込んだ結合をします。
出力条件は
先程出力したユーザーID,苗字,名前,都道府県名で追加で男性だけのデータを出力してみます。
性別は、テーブル1の列gengerが 男性が1 女性が2 で持っていた場合。
構文
select テーブル名1列名, テーブル名2列名... from テーブル名1 inner join テーブル名2 on テーブル名1.列名 = テーブル名2.列名 where 絞り込み条件;
それではsqlに記述してみます
select u.id, u.last_name, u.first_name, p.name from テーブル1 u inner join テーブル2 p on u.prefecture_id = p.id where u.gender = 1;
出力結果は以下のようにテーブルが結合され男性分のみのデータが出力されます。
外部結合(outer join)
片方のテーブルの情報が全て出力されるテーブルの結合で、もう1つのテーブルに欠落のあるデータを取り扱う結合です。
テーブル1 テーブル2
id | last_name | id | user_id | |
---|---|---|---|---|
1 | 田中 | 1 | 1 | |
1 | 田中 | 2 | 1 | |
2 | 太田 | |||
3 | 佐藤 | 3 | 3 | |
3 | 佐藤 | 4 | 3 |
構文
slect テーブル名1.列名, テーブル名2.列名... from テーブル名1 left outer join テーブル名2 on テーブル名1.列名 = テーブル名2.列名;
※leftの場合テーブル名1がマスタとなります。right outer join・・from句で後に書いたテーブルをマスタとします。
※rightの場合はテーブル名2がマスタとなります。
上記の テーブル1=users テーブル2=orders とした場合 に結合するには、以下のように記述します。
select u.last_name last_name, u.id user_id, o.user_id order_user_id, o.id orer_id from users u left outer join orders o on u.id = o.user_id order by u.id;
元のデータが違うので表示が異なりますが、マスターのテーブルが全て出力され、もう一つのテーブルの値がないものはnullが表示されているのがわかると思います。
コメント