JOIN문 정리 + 프로그래머스 문제 풀이

멋쟁이토마토·2024년 2월 11일
0

SQL

목록 보기
1/1


📌 JOIN이란?

  • 두 개 이상의 테이블간의 데이터를 결합하여 데이터를 검색하는 방법
  • 검색하고 싶은 컬럼이 다른 테이블에 있을 경우 주로 사용
  • 여러 테이블을 마치 하나의 테이블인 것처럼 활용하여 효율적으로 조회할 수 있음

INNER JOIN

  • 기본 JOIN (아무런 명시 없이 JOIN을 쓰면 INNER JOIN이 적용됨)
  • 두 테이블 간의 일치하는 행만을 반환
  • 두 테이블을 JOIN할 때, 두 테이블에 지정한 열의 데이터가 모두 있어야 함 (ON절)

SELECT * FROM TableA A
INNER JOIN TableB B ON A.key = B.key 

OUTER JOIN

  • 두 테이블을 JOIN할 때, 1개의 테이블에만 데이터가 있어도 결과가 나옴

OUTER JOIN의 종류

LEFT OUTER JOIN
RIGHT OUTER JOIN
FULL OUTER JOIN

LEFT 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

RIGHT OUTER JOIN

오른쪽 테이블의 모든 값이 출력되는 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

FULL OUTER JOIN

왼쪽 또는 오른쪽 테이블의 모든 값이 출력되는 JOIN

SELECT * FROM TableA A
FULL OUTER JOIN TableB B ON A.key = B.key

CROSS JOIN

  • 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 JOIN
  • CROSS JOIN 결과의 전체 행 개수는 두 테이블의 각 행의 개수를 곱한 수가 됨
  SELECT * FROM TableA
  CROSS JOIN TableB

💡 on절 존재 X → 모든 행에 대해서 match하기 때문에
💡 Where 절이 포함되면 INNER JOIN으로 작동함

SELF 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와의 관계를 연결할 수 있게 해줌



프로그래머스 SQL 고득점 kit

✏ JOIN > 오랜 기간 보호한 동물 (1)

https://school.programmers.co.kr/learn/courses/30/lessons/59044


ANIMAL_INS 동물 보호소에 들어온 동물의 정보를 담은 테이블
ANIMAL_OUTS 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블

조건
✔ 입양을 못 간 동물 조회
✔ 가장 오래 보호소에 있었던 동물 3마리
✔ 보호 시작일 순으로 조회


이 문제에서 가장 관건인 것은 입양을 못 간 동물을 조회하는 것이다.
그냥 평소 JOIN 문제를 풀던대로 무작정 JOIN문을 작성하면 입양을 간 동물들만 조회되게 된다. (ANIMAL_INSANIMAL_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

profile
better than yesterday !

0개의 댓글