호기심 많은 분석가

[MySQL] 프로그래머스 Coding_Test / JOIN (1) 본문

Coding/Coding Test & Algorithm

[MySQL] 프로그래머스 Coding_Test / JOIN (1)

DA Hun 2021. 5. 7. 11:44

포스팅 개요

 SQL 문법과 익숙해지고자 프로그래머스의 SQL Coding Test 문제들을 풀어봄. 그중 JOIN 파트의 문제들을 기록해두었습니다. 그 전 문제들은 2021.05.06 - [Coding Test & Algorithm] - [MySQL] 프로그래머스 Coding_Test / IS NULL 포스팅에서 확인할 수 있습니다.


포스팅 본문

 아래의 문제들은 모두 동일한 TABLE을 기준으로 문제가 주어졌습니다.

TABLE 설명

TABLE SUMMARY


1. 없어진 기록 찾기

 천재지변으로 인해 일부 데이터가 유실되었습니다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요.

없어진 기록 찾기

SELECT AO.ANIMAL_ID, AO.NAME FROM ANIMAL_INS AS AI 
RIGHT OUTER JOIN 
ANIMAL_OUTS AS AO
ON AI.ANIMAL_ID = AO.ANIMAL_ID
WHERE AI.INTAKE_CONDITION IS NULL
ORDER BY AO.ANIMAL_ID

 두 테이블 모두 가지고 있지만 유실 데이터가 있는 ANIMAL_ID로 RIGHT OUTER JOIN을 실행해줍니다. 그러면 아래와 같은 테이블이 형성됩니다.

 이제 우리가 원하는 것은 ANIMAL_INS 테이블의 ANIMAL_ID가 NULL인 ANIMAL_OUTS 이기에 그것을 찾아주는 문법으로 문제를 마무리하였습니다.


2. 있었는데요 없었습니다

 관리자의 실수로 일부 동물의 입양일이 잘못 입력되었습니다. 보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일이 빠른 순으로 조회해야 합니다.

있었는데요 없었습니다

SELECT AI.ANIMAL_ID, AI.NAME FROM ANIMAL_INS AS AI
JOIN 
ANIMAL_OUTS AS AO
USING(ANIMAL_ID)
WHERE AI.DATETIME > AO.DATETIME
ORDER BY AI.DATETIME

 이번에는 조금 다르게 USING 문법을 사용해보았다. ON의 경우 조금 더 자세하지만 USING으로 간단히 표현 가능한 듯하다. 그다음 WHERE 절을 이용하여 문제가 원하는 조건을 출력하였다.

 

 글 쓰는 김에 찾아보니 조인 조건을 주는 사용법의 차이라고 한다. USING은 두 테이블의 동일한 컬럼명에만 사용 가능하고, ON은 조건식 (A.컬럼 = B.컬럼)이 온다. 다양한 조건식을 사용할 때는 ON을, 위의 문제와 같이 동일한 컬럼명을 이용하여 간단히 표현할 때는 USING 사용을 추천한다. 


3. 오랜 기간 보호한 동물(1)

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

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

SELECT AI.NAME, AI.DATETIME
FROM ANIMAL_INS AS AI
LEFT OUTER JOIN
ANIMAL_OUTS AS AO
USING (ANIMAL_ID)
WHERE AO.ANIMAL_ID IS NULL
ORDER BY AI.DATETIME
LIMIT 3

 우선 입양가지 못한 동물들의 경우, ANIMAL_OUTS에 대한 정보가 없으므로 LEFT OUTER JOIN으로 테이블을 생성해주었습니다.

 이제 ANIMAL_OUTS의 ANIMAL_ID가 NULL 인 데이터 중 DATETIME을 기준으로 상위 3개를 골라내야 했기에 LIMIT 문법을 사용하여 문제를 해결했습니다.


 GROUP BY와 비슷하게 JOIN의 마지막 문제도 공부할 것이 많습니다. 다음 포스팅에서 자세히 다뤄보겠습니다. :)