[ Index ]
1. 내부 조인
(1) 일대다 관계 (2) INNER JOIN
2. 외부 조인
(1) LEFT JOIN (2) RIGHT JOIN (3) FULL JOIN
3. 기타 조인
(1) 상호 조인 (2) 자체 조인
1. 내부 조인
(1) 일대다 관계
조인이란 두 테이블을 묶어서 하나의 결과로 만드는 것을 말한다.
조인을 하기 위해서는 두 테이블이 일대다 관계를 가지고 있어야 한다.
그렇다면, 일대다 관계란 무엇일까?
일대다 관계란 한쪽 테이블에는 하나의 값만 가지고,
다른 쪽 테이블에는 여러 개의 값이 존재할 수 있는 관계이다.
한 쇼핑몰 데이터베이스에 회원들의 정보가 담긴 회원 테이블과
구매 정보가 담기 구매 테이블이 있다고 할 때,
한 사람에 대한 회원 정보는 하나의 값만 있으면 되지만,
한 사람에 대한 구매는 여러 번 발생할 수 있으므로 여러 개의 값이 존재할 수 있다.
이러한 관계를 일대다 관계라고 한다!!
(2) INNER JOIN
내부 조인은 조인 중에 가장 많이 사용되는 조인 방법으로,
INNER JOIN을 그냥 JOIN이라고만 써도 된다.
조인에 대한 실습을 위해 다음과 같은 테이블을 생성했다.
회원 테이블(member)
아이디 (mem_id) |
이름 (mem_name) |
주소 (addr) |
전화번호 (phone) |
가입일자 (join_date) |
A111 | 김태연 | 서울 | 11111111 | 2020-10-05 |
A222 | 김민준 | 대전 | 22222222 | 2021-11-24 |
B333 | 이서윤 | 대구 | 33333333 | 2021-08-03 |
B444 | 박서준 | 울산 | 44444444 | 2022-01-26 |
C555 | 최도윤 | 부산 | 55555555 | 2022-06-19 |
C666 | 이시우 | 서울 | 66666666 | 2022-12-08 |
D777 | 유주원 | 광주 | 77777777 | 2023-05-23 |
D888 | 임하은 | 부산 | 88888888 | 2023-10-15 |
구매 테이블(buy)
순번 (num) |
아이디 (mem_id) |
물품명 (pro_name) |
분류 (class) |
단가 (price) |
수량 (amount) |
1 | C666 | 지갑 | 400 | 1 | |
2 | B333 | 원피스 | 패션 | 40 | 2 |
3 | D888 | 노트북 | 디지털 | 1300 | 1 |
4 | B333 | 가방 | 패션 | 100 | 1 |
5 | C555 | 신발 | 패션 | 110 | 3 |
6 | A111 | 신발 | 패션 | 200 | 2 |
7 | C555 | TV | 디지털 | 4000 | 1 |
8 | D888 | 라면 | 식품 | 11 | 5 |
9 | B333 | 지갑 | 200 | 3 | |
10 | A111 | 아이패드 | 디지털 | 800 | 1 |
11 | D888 | 케이크 | 식품 | 32 | 2 |
12 | C666 | 햇반 | 식품 | 13 | 10 |
INNER JOIN을 이용해 회원 테이블과 구매 테이블을 연결해서 출력해 보자.
SELECT *
FROM buy
INNER JOIN member
ON buy.mem_id = member.mem_id;
Result |
![]() |
테이블명을 별칭으로 설정해 좀 더 간결하게 표현할 수도 있다.
SELECT B.mem_id, B.pro_name, M.addr, M.phone
FROM buy B
INNER JOIN member M
ON B.mem_id = M.mem_id;
Result |
![]() |
내부 조인은 두 테이블에 모두 있는 내용만을 연결해서 출력해 주기 때문에
두 테이블 중 하나의 테이블에만 있는 내용을 포함하고 싶다면, 외부 조인을 사용해야 한다.
2. 외부 조인
외부 조인은 두 테이블 중 한쪽 테이블에만 내용이 있어도 결과를 추출할 수 있다.
외부 조인에는 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN이 있으며,
OUTER를 생략하고 LEFT JOIN, RIGHT JOIN, FULL JOIN이라고 써도 된다.
(1) LEFT JOIN
LEFT JOIN은 왼쪽 테이블의 내용이 모두 출력된다.
즉 왼쪽 테이블의 내용을 모두 출력하고,
왼쪽 테이블에는 있지만 오른쪽 테이블에는 없는 값은 NULL로 표시한다.
SELECT M.mem_id, M.addr, M.phone, B.pro_name
FROM member M
LEFT JOIN buy B
ON M.mem_id = B.mem_id;
Result |
![]() |
(2) RIGHT JOIN
RIGHT JOIN은 오른쪽 테이블의 내용이 모두 출력된다.
즉 오른쪽 테이블의 내용을 모두 출력하고,
오른쪽 테이블에는 있지만 왼쪽 테이블에는 없는 값은 NULL로 표시한다.
-- (1) LEFT JOIN에서 RIGHT JOIN으로 변경
SELECT M.mem_id, M.addr, M.phone, B.pro_name
FROM member M
RIGHT JOIN buy B
ON M.mem_id = B.mem_id;
-- (2) LEFT JOIN에서 RIGHT JOIN으로 바꾸고, 테이블의 위치도 변경
SELECT M.mem_id, M.addr, M.phone, B.pro_name
FROM buy B
RIGHT JOIN member M
ON M.mem_id = B.mem_id;
(1) Result | (2) Result |
![]() |
![]() |
※ LEFT JOIN과 RIGHT JOIN은 테이블의 위치만 바꿔주면 같은 결과를 얻을 수 있다.
(3) FULL JOIN
FULL JOIN은 LEFT JOIN과 RIGHT JOIN이 합쳐진 것으로,
왼쪽 테이블과 오른쪽 테이블 중 어느 한쪽에 내용이 들어 있으면 출력한다.
3. 기타 조인
(1) 상호 조인
상호 조인은 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인시킨다.
따라서, 상호 조인 결과의 전체 행 개수는 두 테이블의 행 개수를 곱한 것과 같다.
* 상호 조인의 특징 *
- ON 구문을 사용할 수 없다.
- 랜덤으로 조인한다.
- 테스트를 위한 대용량 데이터 생성에 주로 사용한다.
SELECT COUNT(*)
FROM sakila.city; -- (1) sakila.city 행 개수
SELECT COUNT(*)
FROM world.city; -- (2) world.city 행 개수
SELECT COUNT(*)
FROM sakila.city
CROSS JOIN world.city; -- (3) 상호 조인 결과 행 개수
(1) Result | (2) Result | (3) Result |
![]() 600 |
![]() 4079 |
![]() 600 x 4079 = 2447400 |
(2) 자체 조인
자체 조인은 자기 자신과 조인하는 것이다.
자체 조인은 자주 사용되지는 않지만, 회사 조직도 테이블에서 주로 사용된다.
조직도 테이블(company)
직원(employee) | 직속상관(manager) | 연락처(phone) |
김대표 | 0000 | |
김이사 | 김대표 | 1111 |
박부장 | 김이사 | 2222 |
박과장 | 박부장 | 3333 |
최대리 | 박과장 | 4444 |
최주임 | 최대리 | 5555 |
위와 같은 조직도 테이블이 있다고 할 때, 자체 조인을 사용해
최대리의 직속상관과 직속상관의 연락처를 출력해 보자.
SELECT A.employee "직원", B.employee "직속상관", B.phone "직속상관연락처"
FROM company A
INNER JOIN company B
ON A.manager = B.employee
WHERE A.employee = '최대리';
Result |
![]() |
[ Reference ]
📙 우재남, 한빛미디어, 혼자 공부하는 SQL
'📖 STUDY > SQL' 카테고리의 다른 글
[EP.08] 테이블의 모든 것 (0) | 2023.10.24 |
---|---|
[EP.07] SQL 프로그래밍 (0) | 2023.10.20 |
[EP.05] 데이터 형식 (0) | 2023.10.17 |
[EP.04] 데이터 입력, 수정, 삭제 (0) | 2023.10.16 |
[EP.03] ORDER BY, GROUP BY (0) | 2023.10.16 |