테이블 합치기 JOIN
같은 의미를 가지는 컬럼 값을 기준으로 테이블을 합친다
<조인의 종류 6가지>
1. INNER JOIN
기본 JOIN 으로 JOIN만 입력하면 INNER JOIN으로 인식된다
두 테이블 모두에 있는 값만 합친다
*쿼리문법
SELECT [컬럼이름]
FROM [테이블 A이름]
INNER JOIN [테이블 B이름]
ON [테이블 A이름]. [컬럼 A이름] = [테이블 B이름]. [컬럼 B이름]
WHERE 조건식;
*INNER JOIN 예제
SELECT *
FROM mypokemon
INNER JOIN ability
ON mypokemon.number = ablility.number;
2. LEFT JOIN
왼쪽 테이블에 있는 값만 합치기
*쿼리문법
SELECT [컬럼이름]
FROM [테이블 A이름]
LEFT JOIN [테이블 B이름]
ON [테이블 A이름]. [컬럼 A이름] = [테이블 B이름]. [컬럼 B이름]
WHERE 조건식;
*예제
SELECT *
FROM mypokemon
LEFT JOIN ability
ON mypokemon.number = ability.number;
3. RIGHT JOIN
오른쪽 테이블에 있는 값만 합치기
*쿼리문법
SELECT [컬럼이름]
FROM [테이블 A이름]
RIGHT JOIN [테이블 B이름]
ON [테이블 A이름]. [컬럼 A이름] = [테이블 B이름]. [컬럼 B이름]
WHERE 조건식;
*예제
SELECT *
FROM mypokemon
RIGHT JOIN ability
ON mypokemon.number = ability.number;
4. OUTER JOIN
두 테이블에 있는 모든 값 합치기
*My SQL에는 OUTER JOIN 키워드가 없음
LEFT JOIN 과 RIGHT JOIN 을 연결해서 사용해야한다. UNION(두쿼리 결과를 중복값 제외하고 합쳐서 보여주는 연산자)를 사용하여 연결
*OUTER JOIN 문법
SELECT [컬럼이름]
FROM [테이블 A이름]
LEFT JOIN [테이블 B 이름]
ON [테이블 A이름]. [컬럼A 이름] = [테이블 B이름]. [컬럼 B이름]
UNION
SELECT [컬럼이름]
FROM [테이블 A이름]
RIGHT JOIN [테이블 B 이름]
ON [테이블 A이름]. [컬럼A 이름] = [테이블 B이름]. [컬럼 B이름];
*OUTER JOIN 예제
SELECT *
FROM mypokemon
LEFT JOIN ability
ON mypokemon.number = ability.number
UNION
SELECT *
FROM mypokemon
RIGHT JOIN ability
ON mypokemon.number = ability.number;
5. CROSS JOIN
두테이블의 모든 값을 각각 합치기
ON 키워드가 없어도 된다
*CROSS JOIN 문법
SELECT [컬럼이름]
FROM [테이블 A이름]
CROSS JOIN [테이블 B 이름]
WHERE 조건식;
*CROSS JOIN 예제
SELECT *
FROM mypokemon
CROSS JOIN ability;
6. SELF JOIN
같은 테이블에 있는 값 합치기
*SELF JOIN 문법
SELECT [컬럼이름]
FROM [테이블 A이름] AS t1
INNER JOIN [테이블 B이름] AS t2
ON t1.[컬럼 A이름] = t2.[컬럼 B이름]
WHERE 조건식;
*SELF JOIN 예제
SELECT *
FROM mypokemon AS t1
INNER JOIN mypokemon AS t2
ON t1.number = t2.number;
*알아둘 점 : 같은 이름을 가진 컬럼을 select 할때 어떤 테이블에서 합쳐진 컬럼을 가져올 것인지 명시 해줘야 한다.
예를 들어 number라는 컬럼이 같은 이름을 가진다면
SELECT number → X
SELECT mypokemon.number → O
<예제쿼리>
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 (1)
포켓몬 테이블과 능력치 테이블을 합쳐서 포켓몬 이름, 공격력, 방어력을 한번에 가져와 주세요.
이 때, 포켓몬 테이블에 있는 모든 포켓몬의 데이터를 가져와 주세요. 만약, 포켓몬의 능력치 데이터를 구할
수 없다면, NULL을 가져와도 좋습니다.
MISSION (2)
포켓몬 테이블과 능력치 테이블을 합쳐서 포켓몬 번호와 이름을 한번에 가져와 주세요.
이 때, 능력치 테이블에 있는 모든 포켓몬의 데이터를 가져와 주세요. 만약, 포켓몬의 이름 데이터를 구할
수 없다면, NULL을 가져와도 좋습니다*/
SELECT name, attack, defense
FROM mypokemon
LEFT JOIN ability
ON mypokemon.number=ability.number;
SELECT ability.number, name
FROM mypokemon
RIGHT JOIN ability
ON mypokemon.number=ability.number;
'SQL' 카테고리의 다른 글
[패스트캠퍼스] SQL 강의 : 조건에 조건 더하기, 서브쿼리 사용하기 (0) | 2022.12.27 |
---|---|
[패스트캠퍼스] SQL 강의 : 테이블 집합 연산(여러 테이블 한번에 다루기) (0) | 2022.12.27 |
[패스트캠퍼스] SQL 강의 : 그룹함수 조건만들기/ 함수만들기 (0) | 2022.12.27 |
[패스트캠퍼스] SQL 강의 : 원하는 데이터 그룹하고 통계하기, 그룹함수 (0) | 2022.12.23 |
[패스트캠퍼스] SQL 강의 : 원하는 데이터 가져오기 (0) | 2022.12.20 |