MySQL - 프로그래머스 레벨 : 3(1) - ORDER BY '정답률'

먹보·2022년 12월 16일
0
post-thumbnail

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

테이블 설명 : ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다. ANIMAL_OUTS 테이블의 ANIMAL_ID는 ANIMAL_INS의 ANIMAL_ID의 외래 키입니다.

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

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

🗒️코멘트 : 처음에 차집합을 생각해서 너무 어렵게 접근하려고 해 생각보다 오래걸렸던 문제이다...차집합을 다른 관점에서 보면 비교하려는 테이블의 동물 아이디가 없다는 사실인데...그걸 NULL로 생각한다는게 이렇게 어렵다니..짜증 지대로다이잉

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

테이블 설명 : ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다. ANIMAL_OUTS 테이블의 ANIMAL_ID는 ANIMAL_INS의 ANIMAL_ID의 외래 키입니다.

문제 : 입양을 간 동물 중, 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 기간이 긴 순으로 조회해야 합니다.

SELECT
I.ANIMAL_ID,
I.NAME
FROM ANIMAL_INS I
JOIN ANIMAL_OUTS O ON I.ANIMAL_ID = O.ANIMAL_ID
ORDER BY DATEDIFF(O.DATETIME,I.DATETIME) DESC
LIMIT 2

🗒️코멘트 : 신박하네!! 정말 DBMS는 간편하다. 날짜 계산까지 하나의 함수로 간단하게 해준다. 이게 가능할까 싶어서 검색해봤는데 바로 함수가 딱 나올 때마다..놀랍다..뭐..액셀에서도 가능한거니 당연히 SQL에서도 가능한 것이겠지만..어쨌든..

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

테이블 설명 : 상기 1번과 2번과 동일한 테이블이라 생략

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

SELECT
I.ANIMAL_ID,
I.NAME
FROM ANIMAL_INS I
JOIN ANIMAL_OUTS O ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE DATEDIFF(I.DATETIME,O.DATETIME) > 0
ORDER BY I.DATETIME ASC
---
SELECT
I.ANIMAL_ID,
I.NAME
FROM ANIMAL_INS I
JOIN ANIMAL_OUTS O ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE TIMEDIFF(I.DATETIME,O.DATETIME) > 0
ORDER BY I.DATETIME ASC

🗒️코멘트 : 처음 쓴 답은 계속 틀렸다. 내가 순서가 틀린건가 싶었지만 그것도 아니었고 생각만 주구장창 하던 중 노트를 꺼내 생각을 해봤다. 해답은 2번 문제를 풀 때 느꼈던 내 의심이었다...DATEDIFFF는 순전히 날짜와의 차이만 계산한다. 즉 1분이 지났던 말던 그 날 기준으로 계산을 하기 때문에 정확한 값은 아니다..사실 2번 문제를 풀때 이 꺼림직한 느낌을 그냥 넘겼지만..간과하지는 말았어야 했다..역시 사람은 고생해봐야 배운다고..DATEDIFF 에서 TIMEDIFF 로 바꾸기까지..20분이 걸렸다..하하하하하하하

📌총평 :

드디어 레벨 3를 풀기 시작했다. 근데..생각보다?? 로직이 간단하다라고 방심했지만 내가 간과한 사실을 하나 둘씩 찌르고 들어온다..무섭다..무서워...조금 더 디테일하게 개념을 익히고 문제를 풀어 나가야겠다.

profile
🍖먹은 만큼 성장하는 개발자👩‍💻

0개의 댓글