본문 바로가기
SQL/코딩테스트

[프로그래머스 / MySQL] 오랜 기간 보호한 동물(1)

by Hi_heidi 2024. 2. 1.

문제

💡 아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일 순으로 조회해야 합니다.

 

테이블 형태

ANIMAL_INS /  ANIMAL_OUTS
출력 결과 예시

 

풀이

SELECT I.NAME, I.DATETIME
FROM ANIMAL_INS AS I
    LEFT JOIN ANIMAL_OUTS AS O ON I.ANIMAL_ID = O.ANIMAL_ID WHERE O.ANIMAL_ID IS NULL
ORDER BY I.DATETIME
LIMIT 3

 

해설

FROM ANIMAL_INS AS I
    LEFT JOIN ANIMAL_OUTS AS O ON I.ANIMAL_ID = O.ANIMAL_ID WHERE O.ANIMAL_ID IS NULL
  • 입양을 못 간 동물을 출력해야 한다 → ANIMAL_INS 테이블(I)에만 있는 데이터이다 →테이블(I) 를 기준으로 LEFT JOIN 해야 한다
  • 테이블(I)와 테이블(O)의 공통 컬럼 중 고유값인 동물ID(ANIMAL_ID)를 기준으로 LEFT JOIN 한 뒤, WHERE 문에서 테이블(O)의 동물ID가 NULL이라는 조건을 추가하면 입양을 못 간 동물들만 필터링할 수 있다
JOIN하는 테이블에는 없는 행 찾기
SQL JOIN Visualizer

If there is no matching row for the right table in the ON or USING part in a LEFT JOIN, a row with all columns set to NULL is used for the right table. You can use this fact to find rows in a table that have no counterpart in another table:
SELECT left_tbl.*
  FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id
  WHERE right_tbl.id IS NULL;​
 

MySQL :: MySQL 8.3 Reference Manual :: 13.2.13.2 JOIN Clause

MySQL supports the following JOIN syntax for the table_references part of SELECT statements and multiple-table DELETE and UPDATE statements: table_references: escaped_table_reference [, escaped_table_reference] ... escaped_table_reference: { table_referenc

dev.mysql.com

 

SELECT I.NAME, I.DATETIME
  • 예시 결과와 일치하도록 컬럼을 고르는데, I테이블에 있는 값만 출력해야 하므로 두 테이블 모두 포함된 컬럼일지라도 I테이블의 컬럼을 추출하도록 한다
ORDER BY I.DATETIME
  • 입양일 기준으로 오름차순 정렬한다
LIMIT 3
  • 3마리를 출력해야 하므로 LIMIT 로 제한한다