集合演算

UNION レコードの足し算

-- 二つのselectの結果が合わせて出力される
select id, price from soft
union 
select id, price from soft2;

-- ※注意点
--  列の数を揃えること
-- 列のデータ型を揃えること
-- order byは全体で一つだけ

-- where と order byを使う
select id, price from soft
where price > 200
union 
select id, price from soft2
where id <> '4'
order by price;


-- ALL で重複行を残す
-- union の後にallをつけると各テーブルのデータが重複しても取得する
select id, price from soft
union all
select id, price from soft2;

INTERSECT テーブルの共通部分

-- 各テーブルの一致したデータのみ出力
select id, price from soft
intersect 
select id, price from soft2
order by price;

EXCEPT レコードの引き算

-- 前者のテーブルから後者でも一致するレコード以外取得する。(前者レコード - 後者レコード = 結果)
select id, price from soft
except 
select id, price from soft2
order by price;

-- 注意点
-- 引き算のためどちらのテーブルを先に書くかで結果が変わるので注意

JOIN 結合

テーブルの列を連結する

-- INNERJOIN 内部結合
select s.name, s.price, c.name 
from soft as s 
inner join category as c 
on s.category = c.category_id;

-- where を使う
select s.name, s.price, c.name 
from soft as s 
inner join category as c 
on s.category = c.category_id
where s.id = '2';


-- OUTER JOIN 外部結合
-- outer join の前にleft  またはrightをつける
select s.name, s.price, c.name 
from soft as s 
left outer join category as c 
on s.category = c.category_id;


-- 注意点

-- INNER JOIN(内部結合) と OUTER JOIN(外部結合)の違い
-- 内部結合では2つのテーブルに存在しているデータを取得する
-- 外部結合では片方のテーブルのデータを全て取得する
-- 例えば外部結合ではデータがNULLでも取得する

-- LEFT と RIGHT の違い (OUTER JOIN)
-- LEFT か RIGHT のテーブル指定でどちらのテーブルをマスタにするか決める。
-- 機能的な差はないのでどちらでも良い

クロス結合

-- データ数  ✖️ データ数 が結果として取得する
-- 2つのテーブルのレコード全ての組み合わせを作る
select s.name, s.price, c.name 
from soft as s 
cross join category as c ;