[SQL] 테이블 합치기(JOIN)

WOOK JONG KIM·2022년 12월 15일
0

mysql기초

목록 보기
7/13
post-thumbnail

JOIN

같은 의미를 가지는 컬럼의 값을 기준으로 테이블을 합칠 때 사용하는 키워드

종류

INNER JOIN

기본 JOIN으로 JOIN만 적을 시, 자동으로 INNER JOIN으로 인식

두 테이블 모두에 있는 값만 합칠 때 사용

FROM 과 WHERE 사이에서 사용

LEFT JOIN

왼쪽 테이블(기준 테이블)에 있는 값만 합치기

RIGHT JOIN

기준이 되는 테이블의 값은 그대로 두고, 대상 테이블의 값을 합친다고 생각하자
-> 없는 값은 NULL

OUTER JOIN

OUTER JOIN은 MySQL 키워드에 없음

두 테이블에 있는 모든 값 합치는 키워드(중복되는 것 제거)

CROSS JOIN

두 테이블에 있는 모든 값을 각각 합치기

ON 키워드 없어도 됨

SELF JOIN

같은 테이블에 있는 값 합치는 키워드


한줄 정리

INNER JOIN : 기준 칼럼, 대상 칼럼에 같은 값이 없으면 상실될 가능성 잇음

LEFT JOIN : 매칭되는 값이 없어도 왼쪽값을 다 살려두고 싶을 때

RIGHT JOIN : 매칭되는 값이 없어도 오른쪽 값을 다 살려두고 싶을 때

OUTER JOIN : LEFT JOIN UNION RIGHT JOIN(열의 수 == 기준 테이블 row 수 + 대상 테이블 row 수 - 겹치는 row 수)

CROSS JOIN : 기준 없이 모두 합침( N * M )

SELF JOIN : 하나의 테이블을 함침

코드 예시

같은 이름을 가지는 컬럼이 있다면 SELECT 해 올 때, 어떤 테이블에서 합쳐진 컬럼을 가져올것 인지 명시

ex) mypokemon.number, ability.number

DROP DATABASE IF EXISTS pokemon;

CREATE DATABASE pokemon;

USE pokemon;

CREATE TABLE mypokemon
(
number INT,
name VARCHAR(20),
type VARCHAR(10)
);
INSERT INTO mypokemon (number, name, type)
VALUES (10, 'caterpie', 'bug'),
(25, 'pikachu', 'electric'),
(26, 'raichu', 'electric'),
(133, 'eevee', 'normal'),
(152, 'chikoirita', 'grass');
CREATE TABLE ability (
number INT,
height FLOAT,
weight FLOAT,
attack INT,
defense INT,
speed int
);
INSERT INTO ability (number, height, weight, attack, defense, speed)
VALUES (10, 0.3, 2.9, 30, 35, 45),
(25, 0.4, 6, 55, 40, 90),
(125, 1.1, 30, 83, 57, 105),
(133, 0.3, 6.5, 55, 50, 55),
(137, 0.8, 36.5, 60, 70, 40),
(152, 0.9, 6.4, 49, 65, 45),
(153, 1.2, 15.8, 62, 80, 60),
(172, 0.3, 2, 40, 15, 60),
(470, 1, 25.5, 110, 130, 95);

SELECT mypokemon.name, ability.attack, ability.defense
FROM mypokemon
LEFT JOIN ability
ON mypokemon.number = ability.number;
    
SELECT ability.number, mypokemon.name
FROM mypokemon
RIGHT JOIN ability
on mypokemon.number = ability.number;

DROP DATABASE IF EXISTS pokemon
;

CREATE DATABASE pokemon
;

USE pokemon
;

CREATE TABLE mypokemon
(

number INT,
name VARCHAR(20),
type VARCHAR(10)
);
INSERT INTO mypokemon (number, name, type)
VALUES (10, 'caterpie', 'bug'),
(25, 'pikachu', 'electric'),
(26, 'raichu', 'electric'),
(133, 'eevee', 'normal'),
(152, 'chikoirita', 'grass');
CREATE TABLE ability (
number INT,
height FLOAT,
weight FLOAT,
attack INT,
defense INT,
speed int
);
INSERT INTO ability (number, height, weight, attack, defense, speed)
VALUES (10, 0.3, 2.9, 30, 35, 45),
(25, 0.4, 6, 55, 40, 90),
(26, 0.8, 30, 90, 55, 110),
(133, 0.3, 6.5, 55, 50, 55),
(137, 0.8, 36.5, 60, 70, 40),
(152, 0.9, 6.4, 49, 65, 45),
(153, 1.2, 15.8, 62, 80, 60),
(172, 0.3, 2, 40, 15, 60),
(470, 1, 25.5, 110, 130, 95);

SELECT mypokemon.type, avg(height)
FROM mypokemon
LEFT JOIN ability
on mypokemon.number = ability.number
GROUP BY type;

SELECT mypokemon.type, avg(weight)
FROM mypokemon
LEFT JOIN ability
on mypokemon.number = ability.number
GROUP BY type;

SELECT mypokemon.type, avg(height), avg(weight)
FROM mypokemon
INNER JOIN ability
on mypokemon.number = ability.number
GROUP BY type;

SELECT mypokemon.number, mypokemon.name, ability.attack
FROM mypokemon
INNER JOIN ability
on mypokemon.number = ability.number
WHERE mypokemon.number > 100;

SELECT mypokemon.name
FROM mypokemon
INNER JOIN ability
on mypokemon.number = ability.number
ORDER BY ability.attack + ability.defense DESC;

SELECT mypokemon.name
FROM mypokemon
INNER JOIN ability
on mypokemon.number = ability.number
ORDER BY ability.speed DESC limit 1; 

-> 칼럼명이 겹치는 경우가 아닌 경우 테이블 이름 써줄 필요 없었음!

profile
Journey for Backend Developer

0개의 댓글