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 |