📌 JOIN이란?
SELECT * FROM TableA A
INNER JOIN TableB B ON A.key = B.key
OUTER JOIN의 종류
✅ LEFT OUTER JOIN
✅ RIGHT OUTER JOIN
✅ FULL OUTER JOIN
왼쪽 테이블의 모든 값이 출력되는 JOIN
LEFT Table을 기준으로 가져오는데 RIGHT Table에 없으면 null
LEFT Table만(교집합 제외)을 가져오고 싶은 경우라면, LEFT OUTER JOIN을 한 후에 RIGHT TABLE에 NULL인 값들만 가져오면 됨 (WHERE문 추가)
SELECT * FROM TableA A
LEFT JOIN TableB B ON A.key = B.key
WHERE B.key IS NULL
오른쪽 테이블의 모든 값이 출력되는 JOIN
RIGHT Table을 기준으로 가져오는데 LEFT Table에 없으면 null
RIGHT Table만(교집합 제외)을 가져오고 싶은 경우라면, RIGHT OUTER JOIN을 한 후에 LEFT TABLE에 NULL인 값들만 가져오면 됨 (WHERE문 추가)
SELECT * FROM TableA A
RIGHT JOIN TableB B ON A.key = B.key
WHERE A.key IS NULL
왼쪽 또는 오른쪽 테이블의 모든 값이 출력되는 JOIN
SELECT * FROM TableA A
FULL OUTER JOIN TableB B ON A.key = B.key
SELECT * FROM TableA
CROSS JOIN TableB
💡 on절 존재 X → 모든 행에 대해서 match하기 때문에
💡 Where 절이 포함되면 INNER JOIN으로 작동함
자기 자신과 조인하므로 1개의 테이블을 사용
테이블의 행을 같은 테이블 안에 있는 다른 행과 JOIN
계층적인 구조를 테이블화 할 경우
SELECT A.col, B.col from TableA as A
JOIN TableA as B on A.col = B.col
📍 staff_id와 manager_id와의 관계를 연결할 수 있게 해줌
✏ JOIN > 오랜 기간 보호한 동물 (1)
https://school.programmers.co.kr/learn/courses/30/lessons/59044
ANIMAL_INS
동물 보호소에 들어온 동물의 정보를 담은 테이블
ANIMAL_OUTS
동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블
조건
✔ 입양을 못 간 동물 조회
✔ 가장 오래 보호소에 있었던 동물 3마리
✔ 보호 시작일 순으로 조회
이 문제에서 가장 관건인 것은 입양을 못 간 동물을 조회하는 것이다.
그냥 평소 JOIN 문제를 풀던대로 무작정 JOIN문을 작성하면 입양을 간 동물들만 조회되게 된다. (ANIMAL_INS
과 ANIMAL_OUTS
를 INNER JOIN하게 되면, 입양 보낸 동물의 정보가 나오기 때문)
따라서, ANIMAL_INS
를 기준으로 LEFT JOIN하여 ANIMAL_OUTS
에는 NULL값인 데이터들을 조회해야 한다.
SELECT I.NAME, I.DATETIME FROM ANIMAL_INS AS I
LEFT JOIN ANIMAL_OUTS AS O ON O.ANIMAL_ID = I.ANIMAL_ID
WHERE O.DATETIME IS NULL
ORDER BY DATETIME
LIMIT 3
REFERENCE
- https://sql-joins.leopard.in.ua/
- https://hongong.hanbit.co.kr/sql-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95-joininner-outer-cross-self-join/
- https://www.devart.com/dbforge/sql/sqlcomplete/sql-cross-join.html
- https://doh-an.tistory.com/30
- https://www.sqlservertutorial.net/sql-server-basics/sql-server-self-join/