外部結合とは?
片方のテーブルの情報がすべて出力されるテーブルの結合
外部結合は欠落のあるデータを取り扱う結合
構文:外部結合 left outer join
select テーブル名1.列名,テーブル名2.列名・・・
from
テーブル名1
left outer join
テーブル名2
on テーブル名1.列名 = テーブル名2.列名;
left outer join / right outer join
left outer join・・・左側(from句で最初に書いたテーブル)をマスターとする。
right outer join・・・右側(from句で後に書いたテーブル)をマスターとする。
select u.last_name, u.id, o.user_id, o.id from users u left outer join orders as o on u.id = o.user_id order by u.id;

※ポイント
outerは省略することもできる。innerとの違いはuser_idやorder_idにnullが省略されず、表示されているところ。
応用)全ての商品について販売個数一覧を出したい!ER図を参考に
select p.id, p.name, sum(od.product_qty)num from products as p left outer join order_details as od on p.id = od.product_id group by p.id;

3つ以上のテーブルを使った結合
例:注文一覧を出したい。注文詳細情報と商品情報も一覧の中に入れたい!ER図を参考にして解こう
select o.id, o.user_id, o.amount, o.order_time, p.name, od.product_id, od.product_qty, od.product_price from orders as o inner join order_details as od on o.user_id = od.order_id inner join products as p on od.order_id = p.id

※ポイント
joinは複数回使える
応用2)user_id だと誰なのかわからないので,名字と名前を一覧に追加したい!
select o.id, o.user_id, o.amount, o.order_time, u.last_name, u.first_name, p.name, od.product_id, od.product_qty, od.product_price from orders as o inner join order_details as od on o.user_id = od.order_id inner join products as p on od.order_id = p.id inner join users as u on o.user_id = u.id;

※ポイント
表は3つ以上結合できる
多対多の関係を含む結合
例:商品idが3に紐付く商品カテゴリ名を全て知りたい!
必要な情報は商品id,商品名,カテゴリ名,ER図を参考に
select p.name, p.id, c.name from products as p inner join products_categories as pc on p.id = pc.product_id inner join categories as c on pc.category_id = c.id where p.id = 3;

テーブルの足し算(union,union all)
構文
select 列1,・・・ from テーブル1
union select 列2,・・・FROM テーブル2
※注意点
テーブル1とテーブル2で列数を合わせる必要がある。
同じ位置にあるカラムのデータ型は一致している必要がある。
例)usersテーブル / admin_usersテーブル
・email – email
・last_name – last_name
・first_name – first_name
・gender – gender
例:ユーザーとアドミンユーザーを足し合わせた一覧が欲しい!
出力したい列は e-mail、姓、名、性別 性別を表す数字 1,2で ok
select email, last_name, first_name, gender from users union select email, last_name, first_name, gender from admin_users;

応用)users テーブルから男性だけ,
admin_usersテーブルからは女性だけ抜出し
union した結果を性別だけに並び替える
select email,last_name,first_name, gender from users where gender = 1 union select email, last_name, first_name, gender from admin_users where gender =2 order by gender;

↑order byは最後(全体に一つ)にしかつけれないので注意!
union allは重複したものを出力したいときに使う
