본문 바로가기

SQL

[패스트캠퍼스] SQL 강의 : 테이블 합치기, JOIN 함수

 

 

테이블 합치기 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;