문제 링크:
https://school.programmers.co.kr/learn/courses/30/lessons/132203
문제 풀이:
1) WHERE 사용
먼저 DOCTOR 테이블에서 흉부외과 (CS), 일반외과 (GS)인 의사의 정보만 가져오기 위해 WHERE 절을 활용해야한다.
OR 또는 IN을 활용하면 된다.
이 풀이에서는 가독성이 더 좋다고 하는 IN을 사용할 것이다.
/*
OR를 사용한 방법
*/
SELECT *
FROM DOCTOR
WHERE MCDP_CD = 'CS'
OR MCDP_CD = 'GS';
/*
IN을 사용한 방법
*/
SELECT *
FROM DOCTOR
WHERE MCDP_CD IN ('CS', 'GS');
2) SELECT 사용
불필요한 컬럼도 함께 포함되어있어서, 필요한 컬럼만 사용하도록 SELECT 절에 컬럼을 명시해주었다.
SELECT DR_NAME, DR_ID, MCDP_CD, HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD IN ('CS', 'GS');
3) 결과 정렬: 고용일자 기준 내림차순 정렬 -> 같다면 이름 기준 오름차순 정렬
SELECT DR_NAME, DR_ID, MCDP_CD, HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD IN ('CS', 'GS')
ORDER BY HIRE_YMD desc, DR_NAME asc;
4) 날짜 포맷 일치: 주의사항을 확인 안해서 처음 제출했을 때는 틀렸었다.
주의 사항에 날짜 포맷을 일치시키라고 명시되어있고, 예시 결과에서는 2025-01-01과 같은 형식으로, 시간 정보가 없다.
날짜 포맷 변경의 경우 Oracle과 MySQL이 다르게 적용된다.
WHERE 절은 IN을 사용하는 것으로 통일하고,
Oracle과 MySQL의 차이점에 집중해보자.
/*
MySQL은 DATE_FORMAT 함수를 사용한다
*/
SELECT DR_NAME, DR_ID, MCDP_CD, DATE_FORMAT(HIRE_YMD, '%Y-%m-%d') as HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD IN ('CS', 'GS')
ORDER BY HIRE_YMD desc, DR_NAME asc;
/*
Oracle은 TO_CHAR 함수를 사용한다.
*/
SELECT DR_NAME, DR_ID, MCDP_CD, TO_CHAR(HIRE_YMD, 'YYYY-MM-DD') as HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD IN ('CS', 'GS')
ORDER BY HIRE_YMD desc, DR_NAME asc;
이렇게 풀면, 문제에서 원하는 해답이 된다.
생긴 의문점: OR와 IN 어느 것이 더 효율적인 SQL 코드일까?
* 참고자료: https://stackoverflow.com/questions/8214688/sql-performance-tuning-for-oracle-many-or-vs-in
0 댓글