같은 의미를 가지는 컬럼의 값을 기준
으로 테이블을 합칠 때 사용하는 키워드
기본 JOIN으로 JOIN만 적을 시, 자동으로 INNER JOIN으로 인식
두 테이블 모두에 있는 값만 합칠 때 사용
FROM 과 WHERE 사이에서 사용
왼쪽 테이블(기준 테이블)에 있는 값만 합치기
기준이 되는 테이블의 값은 그대로 두고, 대상 테이블의 값을 합친다고 생각하자
-> 없는 값은 NULL
OUTER JOIN은 MySQL 키워드에 없음
두 테이블에 있는 모든 값 합치는 키워드(중복되는 것 제거)
두 테이블에 있는 모든 값을 각각 합치기
ON
키워드 없어도 됨
같은 테이블에 있는 값 합치는 키워드
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;
-> 칼럼명이 겹치는 경우가 아닌 경우 테이블 이름 써줄 필요 없었음!