MySQL(その13外部結合(outer join),union,union all)

その12から続きます。

外部結合とは?

片方のテーブルの情報がすべて出力されるテーブルの結合

外部結合は欠落のあるデータを取り扱う結合

構文:外部結合 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は重複したものを出力したいときに使う

その14に続きます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です