본문 바로가기

CS/DB

[MySQL] JOIN

JOIN은 여러 테이블에 저장된 데이터를 하나의 SQL문으로 검색할 수 있게 해준다.

두 개 이상의 테이블을 JOIN하기 위해서는 Foreign key(외래키)가 적어도 하나 이상 있어야 한다.

아래의 그림을 보면서 JOIN에 대해 더 자세히 알아보자.

 

 

우선 JOIN할 두 테이블을 생성하자.

 

create table `user` (
	`id` int not null,
    `name` varchar(10) not null,
    `age` int not null,
    primary key(`id`)
);

insert into user (id, name, age)
values
(1, '홍길동', 24),
(2, '김철수', 23),
(3, '박아무개', 21),
(4, '이홍녀', 25);

create table `school`(
	`id` int not null,
    `schoolName` varchar(20) not null,
    `major` varchar(30) not null,
    primary key(`id`)
);

insert into school (id, schoolName, major)
values
(1, '서울대', '물리학과'),
(3, '연세대', '경영학과'),
(6, '고려대', '경제학과');

1. LEFT JOIN

LEFT JOIN은 A 테이블(왼쪽 테이블)을 기준으로 B 테이블(오른쪽 테이블)을 합친 결과를 가져온다.

A의 필드값은 모두 가져오지만 B는 ON절을 만족하는 값만 가져온다.

 

위의 테이블로 예시를 들어보자.

 

select *
from user a
left join school b
on a.id = b.id;

 

 

user 테이블을 a라고 칭하고 school 테이블을 b라고 정한뒤,

a 테이블의 모든 값은 가져오고 b 테이블에서는 둘의 id가 일치하는 값만 가져왔다.

b에는 id가 2와 4인 값이 없기 때문에 컬럼값이 NULL로 표기되었고, a에 id가 6인 값이 없기 때문에 b의 id가 6인 값도 가져오지 못했다.

JOIN 할 때 두 테이블의 모든 필드를 그대로 가져오기 때문에
중복되는 필드를 보고싶지 않다면 직접 SELECT 문을 다 작성하자.

1-2. LEFT JOIN (IS NULL)

LEFT JOIN에서는 a 테이블의 모든 값을 가져왔지만 WHERE 절을 이용하여 순수한 a의 값만 뽑을 것이다.

 

아래의 예시를 살펴보자.

 

select *
from user a
left join school b
on a.id = b.id
where b.id is null;

 

 

WHERE 절을 이용해서 a 테이블에서 b 테이블과 id가 겹치지 않는 값들만 출력했다.

따라서 LEFT JOIN의 결과 중 b 테이블과 연결이 없는 id가 2, 4인 값들이 검색됐다.

2. RIGHT JOIN

LEFT JOIN과 개념은 똑같은데 기준이 되는 테이블만 반대이다.

이번엔 B 테이블(오른쪽)을 기준으로 A 테이블(왼쪽)을 합친 결과를 가져온다.

 

위와 비슷한 예시를 들어보자.

 

select *
from user a
right join school b
on a.id = b.id;

 

 

결과를 보면 금방 이해가 될 것이다.

RIGTH JOIN도 1-2와 동일하게 WHERE 절을 이용하여 순수한 B의 값만을 뽑아올 수 있다.
동일한 과정이니 생략한다.

3. INNER JOIN

두 테이블에서 ON절의 조건을 만족하는 데이터만 가져온다.

 

아래의 예시를 보자.

 

select *
from user a
inner join school b
on a.id = b.id;

 

 

두 테이블에서 id가 같은 값들만 온전하게 출력됐다.

4. FULL OUTER JOIN

양쪽 테이블의 모든 데이터를 출력한다.

MySQL은 FULL OUTER JOIN을 지원하지 않기 때문에 UNION을 사용해 표현할 수 있다.

UNION은 여러 개의 SELECT 문의 결과를 하나의 테이블로 표현할 때 사용한다.
이때 각각의 SELECT 문으로 선택된 필드의 개수와 타입은 모두 같아야 하며, 필드의 순서 또한 같아야 한다.

아래의 예시를 살펴보자.

 

select a.id, a.name, a.age, b.id, b.schoolName, b.major
from user a
left join school b
on a.id = b.id
union
select a.id, a.name, a.age, b.id, b.schoolName, b.major
from user a
right join school b
on a.id = b.id;

 

 

LEFT JOIN과 RIGHT JOIN의 결과가 합쳐진 모습으로, a와 b 테이블의 모든 값을 가져왔다.

'CS > DB' 카테고리의 다른 글

DML : 단일 테이블 검색문 (Part 2)  (0) 2023.05.21
DML : 단일 테이블 검색문 (Part 1)  (1) 2023.05.17
스키마와 테이블 정의  (0) 2023.05.15
다양한 ERD 표기법  (0) 2023.05.15
관계 데이터 모델과 관계 연산자  (0) 2023.05.12