1. 조인 여섯가지 방법
기본적인 조인 방법은 파이썬과 동일! 다만 MySQL 은 outer join 지원을 안 한다고.. (왜..?) 그래서 그냥 Left 한번 Right 한번 해서 합치면 될 듯!
- Inner Join
두 데이터 모두에서 겹치는것만 가져오는 개념
-left, right join
왼쪽 오른쪽 기준으로 합치는 개념
-outer join
합집합의 개념 but mysql 인 경우는 이렇게 해결하자
union 을 이용하자 ! 왼쪽 한번 오른쪽 한번 합친 뒤에..
* unioin = 두 쿼리를 합치고 중복은 제외하고 보여주는 것
select *
From a
Left Join b
On a.number = b.number
UNION
select *
From a
Right join b
On a.number = b.number
-cross join
쓸 일이 있을까..? 크로스로 데이터 가져오는... 결국 컬럼 개수 * 컬럼 개수 만큼의 데이터가 겁나 많이 무작위로 생기는 것임... 근데 cross 는 그냥 싸그리 합치는거기 때문에 ON 은 안 써줘도 됩니다!!
-self join
셀프는 같은 테이블 끼리의 inner join 을 의미한다 그래서 AS 로 꼭 별칭을 지정해 줘야 한다. 같은 테이블이니까 테이블이 왼쪽인지 오른쪽인지 모호해지기 때문!
2. 실습
포켓몬 데이터로 해본 실습들! 조인해서 조건 걸기 정렬하기 등등 해봤음
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);
/*
MISSION (2)
포켓몬 테이블과 능력치 테이블을 합쳐서 포켓몬 번호와 이름을 한번에 가져와 주세요.
이 때, 능력치 테이블에 있는 모든 포켓몬의 데이터를 가져와 주세요. 만약, 포켓몬의 이름 데이터를 구할 수 없다면, NULL을 가져와도 좋습니다.
*/
SELECT ability.number, 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);
/*
MISSION (1)
포켓몬 타입 별 키의 평균을 가져와 주세요.
*/
SELECT type,avg(height)
FROM pokemon.ability
RIGHT JOIN pokemon.mypokemon
ON ability.number = mypokemon.number
GROUP BY type;
/*
MISSION (2)
포켓몬의 타입 별 몸무게의 평균을 가져와 주세요.
*/
SELECT type,avg(weight)
FROM pokemon.ability
LEFT JOIN pokemon.mypokemon
ON ability.number = mypokemon.number
GROUP BY type;
/*
MISSION (3)
포켓몬의 타입 별 키의 평균과 몸무게의 평균을 함께 가져와 주세요.
*/
SELECT type,avg(weight) AS '몸무게 평균' ,avg(height) AS '키 평균'
FROM pokemon.ability
LEFT JOIN pokemon.mypokemon
ON ability.number = mypokemon.number
GROUP BY type;
/*
MISSION (4)
번호가 100 이상인 내 포켓몬들의 번호, 이름, 공격력, 방어력을 가져와 주세요.
*/
SELECT ability.number, name , attack, defense
FROM ability
INNER JOIN mypokemon
ON ability.number = mypokemon.number
WHERE ability.number > 100;
/*
MISSION (5)
공격력과 방어력의 합이 큰 순서대로 내 포켓몬들의 이름을 나열해 주세요.
*/
SELECT name
FROM mypokemon LEFT JOIN ability
ON mypokemon.number = ability.number
ORDER BY attack + defense DESC;
/*
MISSION (6)
속도가 가장 빠른 내 포켓몬의 이름을 가져와 주세요.
*/
SELECT name
FROM mypokemon LEFT JOIN ability
ON mypokemon.number = ability.number
ORDER BY speed DESC
LIMIT 3;
728x90
'데이터 엔지니어링 > SQL' 카테고리의 다른 글
[SQL] 숫자형 데이터에서 자주 쓰는 모듈 (0) | 2022.11.24 |
---|---|
[SQL] 문자형 데이터에서 자주 쓰는 모듈들 LOCATE, SUBSTRING, REPLACE 등 (0) | 2022.11.24 |
[SQL] 데이터 줄세우기 RANK, DENSE_RANK, ROW_NUMBER (0) | 2022.11.24 |
[SQL] 서브쿼리 (0) | 2022.11.23 |
[SQL] 여러 테이블 한번에 다루기 (0) | 2022.11.17 |