본문 바로가기
Database/MySQL

[MySQL] 조인(Join)

by hyeeein 2023. 12. 22.

* 조인: 두 개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 것

 

1. 내부조인

 

- 일대다 관계(one to many) : 한쪽 테이블에는 하나의 값만 존재해야 하지만, 연결된 다른 테이블에는 여러 개의 값이 존재할 수 있는 관계를 의미함. 주로 기본 키(PK)와 외래 키(FK) 관계로 맺어져 있어, PK-FK 관계라고 부름. 상호 조인은 제외!

 

- 내부 조인의 기본 형식

SELECT <열 목록>
FROM <첫 번째 테이블>
	INNER JOIN <두 번째 테이블>
	ON <조인될 조건>
[WHERE 검색 조건]

* INNER JOIN을 JOIN이라고만 써도 INNER JOIN으로 인식함 !

* 두 개의 테이블을 조인할 때 동일한 열 이름이 존재한다면, 테이블_이름.열_이름 형식으로 꼭 표기하기

* 내부 조인을 조금 더 간결하게 표현하려면 별칭(alias)를 이용한다

-- 예시
SELECT B.mem_id, M.mem_name, B.prod_name, M.addr, CONCAT(M.phone1, M.phone2) '연락처'
FROM buy B
	INNER JOIN member M
	ON B.mem_id = M.mem_id;

 

- 내부 조인은 두 테이블에 모두 있는 내용만 조인 가능하다.

- 만약, 양쪽 중에 한곳이라도 내용이 있을 때 조인하려면 외부 조인을 사용 !!

 

※ 중복된 결과 1개만 출력: DISTINCT ※

-- 예시
SELECT DISTINCT B.mem_id, M.mem_name, B.prod_name, M.addr
FROM buy B
	INNER JOIN member M
	ON B.mem_id = M.mem_id
ORDER BY M.mem_id;

 

 

2. 외부 조인

 

외부 조인은 한쪽에만 데이터가 있어도 결과가 출력됨

 

- 외부 조인의 기본 형식

SELECT <열 목록>
FROM <첫 번째 테이블(LEFT 테이블)>
	<LEFT | RIGHT | FULL> OUTER JOIN <두 번째 테이블(RIGHT 테이블)>
	ON <조인될 조건>
[WHERE 검색 조건] ;

* LEFT OUTER JOIN (= LEFT JOIN) : 왼쪽 테이블(member)의 내용은 모두 출력되어야 함.

* RIGHT OUTER JOIN (=RIGHT JOIN) : 오른쪽 테이블(buy)의 내용은 모두 출력되어야 함.

* FULL OUTER JOIN : 왼쪽이든 오른쪽이든 한쪽에 들어 있는 내용이면 출력함.

 

-- 예) 회원으로 가입만 하고, 한 번도 구매한 적이 없는 회원의 목록 추출

SELECT DISTINCT M.mem_id, B.prod_name, M.mem_name, M.addr
FROM member M
	LEFT OUTER JOIN buy B
	ON M.mem_id = B.mem_id
WHERE B.prod_name IS NULL
ORDER BY M.mem_id;

 

 

3. 기타 조인

 

1) 상호 조인: 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인시키는 기능 (주로 테스트용)

- 전체 행 개수는 두 테이블의 각 행의 개수를 곱한 개수가 됨 (카티션 곱이라고도 부름)

SELECT *
FROM buy
	CROSS JOIN member;

 

★ 주의사항 ★

* ON 구문을 사용할 수 없다

* 결과의 내용은 의미가 없다. 랜덤으로 조인하기 때문이다.

* 상호 조인의 주 용도는 테스트하기 위해 대용량의 데이터를 생성할 때이다.

 

=> 진짜로 대용량 테이블을 만들고 싶으면 CREATE TABLE ~ SELECT 문을 사용

CREATE TABLE cross_table
	SELECT *
	FROM sakila.actor
		CROSS JOIN world.country;

SELECT * FROM cross_table LIMIT 5;

 

2) 자체 조인: 자신이 자신과 조인한다는 의미 (1개의 테이블만 사용)

 

- 기본 형식: 테이블이 1개지만 다른 별칭을 사용해서 서로 다른 것처럼 사용하면 됨

- 사용 예) 회사의 조직 관계

SELECT <열 목록>
FROM <테이블> 별칭A
	INNER JOIN <테이블> 별칭B
	ON <조인될 조건>
[WHERE 검색 조건]