SQLのJOINについて改めて学ぶ
新しくやることがJOINを多用するので、ふわっとしていたJOINについて整理する
JOINは何をするものなのか
テーブルを結合するために使う
DBからデータを取得する際にテーブル①とテーブル②を組み合わせて取得したい際に使う
例文
SELECT *(カラム名) FROM テーブル① JOIN テーブル② ON テーブル①.カラム名① = テーブル名②.カラム名①
JOINの種類
大まかに内部結合と外部結合が存在する
- 内部結合 ⇒ (INNER) JOIN
- 外部結合 ⇒ LEFT or RIGHT (OUTER) JOIN
()内の INNER と OUTER は省略できる
下記のサンプルテーブルを基に実際の動きを確認する
内部結合について
内部結合はテーブル①(food)とテーブル②(food_type)を結合し、完全に一致したものを取得する
SELECT * FROM food
INNER JOIN food_type ON food.type_id = food_type.id
- foodテーブルにのみ存在するバニラアイスは出力されない
- food_typeテーブルにのみ存在する麺は出力されない
外部結合について
外部結合の中で"左"外部結合と"右"外部結合が存在する
基本的に使用されるのは左外部結合で、左外部結合をするためにテーブルの順序を入れ替えるほど(らしい)
左右のどっちを主体化するか、という考え方でよい
左外部結合
SELECT * FROM food
LEFT JOIN food_type ON food.type_id = food_type.id
- バニラアイスのfood_type.idは存在しないが、左側に指定したfoodテーブルに存在する為food_type部分はnullとして出力される
- food_typeテーブルのみに存在する 麺 は出力されない
右外部結合
SELECT * FROM food
RIGHT JOIN food_type ON food.type_id = food_type.id
- 麺のtype_idは存在しないが、左側に指定したfood_typeテーブルに存在する為food部分はnullとして出力される
- foodテーブルのみに存在する バニラアイス は出力されない
使用したSQL
CREATE TABLE food (
id varchar(256),
type_id varchar(256),
name varchar(256),
money int
);
CREATE TABLE food_type(
id varchar(256),
name varchar(256)
);
INSERT INTO food (id,type_id,name,money) VALUES
('1','1','リンゴ',300),
('2','3','白菜',800),
('3','2','豚肉',1000),
('4','2','牛肉',2000),
('5','4','カツオ',300),
('6','6','バニラアイス',298);
INSERT INTO food_type (id,name) VALUES
('1','果物'),
('2','肉'),
('3','野菜'),
('4','魚'),
('5','麺');
select * from food;
select * from food_type;