* 조인: 두 개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 것
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 검색 조건]
'Database > MySQL' 카테고리의 다른 글
[MySQL] SQL 내장함수 (2) | 2024.05.12 |
---|---|
[MySQL] SQL 프로그래밍 (IF, CASE, WHILE, 동적 SQL) (1) | 2023.12.23 |
[MySQL] 데이터 형식 (숫자, 문자, 날짜형) (0) | 2023.12.22 |
[MySQL] 데이터 변경을 위한 SQL문 : INSERT, UPDATE, DELETE (0) | 2023.12.11 |
[MySQL] SQL 기본 문법 : SELECT (1) | 2023.12.08 |