728x90
KDT 실무형 스프링 백엔드 엔지니어 양성과정 6기 | SQL CODEKATA
🐱 오랜 기간 보호한 동물(2)
🏷 관련 주제 : JOIN
날짜 차이
DATEDIFF
상위 N개 인스턴스
ROWNUM
LIMIT

✔️ (Oracle) Solution with JOIN & ROUND() & ROWNUM
SELECT *
FROM(SELECT I.ANIMAL_ID
, I.NAME
FROM ANIMAL_INS I
, ANIMAL_OUTS O
WHERE I.ANIMAL_ID = O.ANIMAL_ID
ORDER BY ROUND(O.DATETIME - I.DATETIME + 1) DESC)
WHERE ROWNUM <= 2;
실행 결과

✔️ (MySQL) Solution with JOIN & DATEDIFF & LIMIT
SELECT I.ANIMAL_ID
, I.NAME
FROM ANIMAL_INS I
, ANIMAL_OUTS O
WHERE I.ANIMAL_ID = O.ANIMAL_ID
ORDER BY DATEDIFF(O.DATETIME, I.DATETIME) + 1 DESC
LIMIT 2;
실행 결과

💥 오늘 만난 문제 & 나의 시도 💦 & 해결 방법 👍
📌 오늘 만난 문제 : 입양을 간 동물 중, 보호 기간
이 가장 길었던 동물 두 마리의 아이디
와 이름
을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 기간
이 긴 순으로 조회해야 합니다.
1. ANIMAL_INS
테이블과 ANIMAL_OUTS
테이블을 ANIMAL_ID
로 JOIN하여 동물의 아이디
, 이름
, 보호 시작일
, 입양일
, 보호 기간
을 조회하자.
MySQL :DATEDIFF()
이용
Oracle :TRUNC()
이용
"보호 기간" 별칭 주기
같은 날 보호 시작 및 입양이 되었다면 보호기간은 1일이므로, (입양일과 보호 시작일의 차) +1
- Oracle & MySQL
SELECT I.ANIMAL_ID , I.NAME , I.DATETIME , O.DATETIME , ROUND(O.DATETIME - I.DATETIME + 1) "보호기간" FROM ANIMAL_INS I , ANIMAL_OUTS O WHERE I.ANIMAL_ID = O.ANIMAL_ID;
실행 결과
- MySQL
SELECT I.ANIMAL_ID , I.NAME , I.DATETIME , O.DATETIME , DATEDIFF(O.DATETIME, I.DATETIME) + 1 "보호기간" FROM ANIMAL_INS I , ANIMAL_OUTS O WHERE I.ANIMAL_ID = O.ANIMAL_ID;
실행 결과
2. 보호기간
을 기준으로 내림차순 정렬하여 동물의 아이디
, 이름
, 보호기간
을 조회하자.
- Oracle & MySQL
SELECT I.ANIMAL_ID , I.NAME , ROUND(O.DATETIME - I.DATETIME + 1) "보호기간" FROM ANIMAL_INS I , ANIMAL_OUTS O WHERE I.ANIMAL_ID = O.ANIMAL_ID ORDER BY ROUND(O.DATETIME - I.DATETIME + 1) DESC;
실행 결과
- MySQL
SELECT I.ANIMAL_ID , I.NAME , DATEDIFF(O.DATETIME, I.DATETIME) + 1 "보호기간" FROM ANIMAL_INS I , ANIMAL_OUTS O WHERE I.ANIMAL_ID = O.ANIMAL_ID ORDER BY DATEDIFF(O.DATETIME, I.DATETIME) + 1 DESC;
실행 결과
3. 위의 조회 결과에서 상위 2개의 인스턴스의 동물의 아이디
와 이름
을 조회하자.
상위 N개 인스턴스 조회하기
Oracle : ROWNUM <= N
MySQL : LIMIT N
- Oracle
SELECT * FROM(SELECT I.ANIMAL_ID , I.NAME FROM ANIMAL_INS I , ANIMAL_OUTS O WHERE I.ANIMAL_ID = O.ANIMAL_ID ORDER BY ROUND(O.DATETIME - I.DATETIME + 1) DESC) WHERE ROWNUM <= 2;
실행 결과
- MySQL
SELECT I.ANIMAL_ID , I.NAME FROM ANIMAL_INS I , ANIMAL_OUTS O WHERE I.ANIMAL_ID = O.ANIMAL_ID ORDER BY DATEDIFF(O.DATETIME, I.DATETIME) + 1 DESC LIMIT 2;
실행 결과
💬 무엇을 새롭게 알았는지
- 두 테이블을 JOIN 을 해보았다.
- 두 날짜의 차이 구하기
- MySQL :
DATEDIFF()
- Oracle :
ROUND(날짜1 - 날짜2)
또는TRUNC(날짜1 - 날짜2)
- MySQL :
- 상위 N개 인스턴스 조회하기
- MySQL : LIMIT N
- Oracle : 조회하고자하는 쿼리를 FROM절에 서브쿼리로 주고 WHERE ROWNUM <= N
📚 References(참고 자료)
728x90