LoginSignup
3
0

More than 1 year has passed since last update.

SQLのJOINについて改めて学ぶ

Posted at

SQLのJOINについて改めて学ぶ

新しくやることがJOINを多用するので、ふわっとしていたJOINについて整理する

JOINは何をするものなのか

テーブルを結合するために使う
DBからデータを取得する際にテーブル①とテーブル②を組み合わせて取得したい際に使う

例文
SELECT *(カラム名) FROM テーブル① JOIN テーブル② ON テーブル①.カラム名① = テーブル名②.カラム名①

JOINの種類

大まかに内部結合と外部結合が存在する

  • 内部結合 ⇒ (INNER) JOIN
  • 外部結合 ⇒ LEFT or RIGHT (OUTER) JOIN
    ()内の INNER と OUTER は省略できる

下記のサンプルテーブルを基に実際の動きを確認する

foodテーブル
image.png

food_typeテーブル
image.png

内部結合について

内部結合はテーブル①(food)とテーブル②(food_type)を結合し、完全に一致したものを取得する

SELECT * FROM food
INNER JOIN food_type ON food.type_id = food_type.id

image.png

  • foodテーブルにのみ存在するバニラアイスは出力されない
  • food_typeテーブルにのみ存在する麺は出力されない

外部結合について

外部結合の中で"左"外部結合と"右"外部結合が存在する
基本的に使用されるのは左外部結合で、左外部結合をするためにテーブルの順序を入れ替えるほど(らしい)
左右のどっちを主体化するか、という考え方でよい

左外部結合

SELECT * FROM food
LEFT JOIN food_type ON food.type_id = food_type.id

実行結果
image.png

  • バニラアイスのfood_type.idは存在しないが、左側に指定したfoodテーブルに存在する為food_type部分はnullとして出力される
  • food_typeテーブルのみに存在する 麺 は出力されない

右外部結合

SELECT * FROM food
RIGHT JOIN food_type ON food.type_id = food_type.id

実行結果
image.png

  • 麺の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;
3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0