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
JOIN
두 개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 것
종류
1. INNER JOIN(내부 조인)
: 두 테이블을 조인할 때, 두 테이블에 모두 지정한 열의 데이터가 있어야 한다.
2. OUTER JOIN(외부 조인)
: 두 테이블을 조인할 때, 1개의 테이블에만 데이터가 있어도 결과가 나온다.
3. CROSS JOIN(상호 조인)
: 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인하는 기능이다.
4. SELF JOIN(자체 조인)
: 자신이 자신과 조인한다는 의미로, 1개의 테이블을 사용한다.
두 테이블을 조인할 때, 두 테이블에 모두 지정한 열의 데이터가 있어야 한다.
SELECT <열 목록>
FROM <첫 번째 테이블> INNER JOIN <두 번째 테이블>
ON <조인 조건>
[WHERE 검색 조건]
# INNER JOIN을 JOIN이라고만 써도 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. 모든 컬럼을 조회한다.
=> 조회결과
두 테이블을 조인할 때, 1개의 테이블에만 데이터가 있어도 결과가 나온다.
SELECT <열 목록>
FROM <첫 번째 테이블(LEFT 테이블)>
<LEFT | RIGHT | FULL> OUTER JOIN <두 번째 테이블(RIGHT 테이블)>
ON <조인 조건>
[WHERE 검색 조건]
# OUTER를 생락하고, LEFT JOIN 이렇게 쓰기도 한다.
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개만 조회
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인 것만 조회
SELECT *
FROM ANIMAL_INS RIGHT JOIN ANIMAL_OUTS
ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID