✅ JOIN
두 개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 것
두 테이블의 조인을 위해서는 기본키(PRIMARY KEY, PK)와 외래키(FOREIGN KEY, FK) 관계로 맺어져야 한다.
(때문에 on 조인 조건에는 기본기 = 외래키 연결짓는 로직이 들어가야 되는 것임!)
✅ 종류
1. INNER JOIN(내부 조인)
: 두 테이블을 조인할 때, 두 테이블에 모두 데이터가 있어야만 결과가 나온다.
2. OUTER JOIN(외부 조인)
: 두 테이블을 조인할 때, 1개의 테이블에만 데이터가 있어도 결과가 나온다.
3. CROSS JOIN(상호 조인)
: 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인하는 기능이다.
4. SELF JOIN(자체 조인)
: 자신이 자신과 조인한다는 의미로, 1개의 테이블을 사용한다.
✅ INNER JOIN(내부 조인)
두 테이블을 조인할 때, 두 테이블에 모두 있는 내용만 출력됨.
- INNER생략 가능 : INNER JOIN ON=> JOIN ON
- ON은 조인하기 전의 조건, WHERE은 조인 후 검색 조건임.
SELECT <열 목록>
FROM <첫 번째 테이블> INNER JOIN <두 번째 테이블>
ON <조인 조건>
[WHERE 검색 조건]
[예제] - 테이블 형태만 참조
SELECT * -- 4
from PRODUCT INNER JOIN OFFLINE_SALE -- 2
on PRODUCT.PRODUCT_ID = OFFLINE_SALE.PRODUCT_ID -- 1
WHERE OFFLINE_SALE.PRODUCT_ID = 1 -- 3
-- 1. PRODUCT 테이블의 PRODUCT_ID와 OFFLINE_SALE 테이블의 PRODUCT_ID가 같은 조건으로
-- 2. 두 테이블을 결합한다.
-- 3. 그 결과에서 OFFLINE_SALE테이블의 ID가 1인 정보만 필터한 뒤
-- 4. 모든 컬럼을 조회한다.
=> 조회결과
✅ OUTER JOIN(외부 조인)
두 테이블을 조인할 때, 1개의 테이블에만 데이터가 있어도 결과가 나온다.
- (LEFT OUTER JOIN에서만) OUTER를 생략 가능 : LEFT OUTER JOIN ON => LEFT JOIN ON
SELECT <열 목록>
FROM <첫 번째 테이블(LEFT 테이블)>
<LEFT | RIGHT | FULL> OUTER JOIN <두 번째 테이블(RIGHT 테이블)>
ON <조인 조건>
[WHERE 검색 조건]
[LEFT JOIN 예제] - 오랜 기간 보호한 동물
- 해설
SELECT ANIMAL_INS.NAME,ANIMAL_INS.DATETIME
from ANIMAL_INS LEFT OUTER JOIN ANIMAL_OUTS # 2. INS테이블 전체 + OUTS테이블은 INS와 ID가 겹치는 것만
ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID # 1. ID가 같은 테이블끼리 조인하는데
WHERE ANIMAL_OUTS.ANIMAL_ID IS NULL #3. 조인 결과 중 INS에만 있는 값이여서 OUTS 정보가 NULL인 정보만 조회
ORDER BY ANIMAL_INS.DATETIME #4.날짜 기준으로 오름차순 정렬 후
limit 3 # 5. 최고 3개만 조회
- LEFT JOIN : INS테이블은 변함 없고, OUTS 테이블은 ID가 맞지 않는 경우 null값으로 변함
SELECT * from ANIMAL_INS LEFT OUTER JOIN ANIMAL_OUTS
ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID
ORDER BY ANIMAL_OUTS.ANIMAL_ID
[RIGHT JOIN 예제] - 프로그래머스 - 없어진 기록 찾기
- 해설
SELECT ANIMAL_OUTS.ANIMAL_ID , ANIMAL_OUTS.NAME #4. 이후 조회된 테이블에서 ID와 NAME 컬럼을 조회함
FROM ANIMAL_INS RIGHT JOIN ANIMAL_OUTS #2. OUTS테이블은 변함 없고, INS테이블은 맞는 ID없을 경우 NULL로 값변경
ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID #1. ID값이 같을 것을 조건으로
WHERE ANIMAL_INS.ANIMAL_ID IS NULL #3. INS 값이 NULL인 것만 조회
- RIGHT JOIN : OUTS테이블은 변함 없고, INS테이블은 맞는 ID없을 경우 테이블을 NULL로 값변경
SELECT *
FROM ANIMAL_INS RIGHT JOIN ANIMAL_OUTS
ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID
JOIN 에서ON과 WHERE
ON : JOIN 되기 전에 실행되는 조건
WHERE - JOIN이 된 후 실행되는 조건
참고자료
https://hongong.hanbit.co.kr/sql-%ea%b8%b0%eb%b3%b8-%eb%ac%b8%eb%b2%95-joininner-outer-cross-self-join/ (그림출처)
https://mizykk.tistory.com/81
https://bramhyun.tistory.com/39
'DB > SQL' 카테고리의 다른 글
[SQL] 행 입력, 수정, 삭제 CRUD (0) | 2023.05.30 |
---|---|
[SQL]프로그래머스 - 즐겨찾기가 가장 많은 식당 정보 출력 (0) | 2023.05.30 |
[SQL]Group by, Having, 집계함수 (0) | 2023.05.23 |
[SQL] 서브쿼리 - TODO (0) | 2023.05.21 |
DB 기초개념 (0) | 2023.05.17 |