👇 흉부외과 또는 일반외과 의사 목록 출력하기
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
🔓 문제 설명
DOCTOR 테이블에서 진료과가 흉부외과(CS)이거나 일반외과(GS)인 의사의 이름, 의사ID, 진료과, 고용일자를 조회하는 SQL문을 작성해주세요. 이때 결과는 고용일자를 기준으로 내림차순 정렬하고, 고용일자가 같다면 이름을 기준으로 오름차순 정렬해주세요.
예시 문제 데이터(DOCTOR)
| DR_NAME | DR_ID | LCNS_NO | HIRE_YMD | MCDP_CD | TLNO |
| 루피 | DR20090029 | LC00010001 | 2009-03-01 | CS | 01085482011 |
| 패티 | DR20090001 | LC00010901 | 2009-07-01 | CS | 01085220122 |
| 뽀로로 | DR20170123 | LC00091201 | 2017-03-01 | GS | 01034969210 |
| 니모 | DR20200012 | LC00911162 | 2020-03-01 | CS | 01089483921 |
| 자스민 | DR20100032 | LC00010192 | 2010-03-01 | GS | 01023981922 |
| 벨 | DR20100039 | LC00010562 | 2010-07-01 | GS | 01058390758 |
⚡SQL Query
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;
🔎 풀이 설명
1. 다중 조건 선택: MCDP_CD = 'CS' OR MCDP_CD = 'GS' 대신 IN ('CS', 'GS') 연산자를 사용하였습니다.
💡인사이트
1. IN() 함수(IN-List)
- MCDP_CD 컬럼에 인덱스가 있다면, 옵티마이저는 IN 조건을 IN-List Iterator 방식으로 처리할 수 있습니다. 이는 내부적으로 MCDP_CD = 'CS'를 한 번 찾고, MCDP_CD = 'GS'를 한 번 더 찾아 결합하는 방식입니다.
- IN() 과 OR 성능은 비슷하지만, 가독성과 옵티마이저의 변환 부하를 줄이기 위해 IN 연산자를 사용하는 것이 정석입니다.
2. SELECT 절의 가공
- SELECT 절에서 컬럼이 가공된 후 ORDER BY 절에서 TO_CHAR 결과값을 기준으로 정렬하게 되면 문자열 기준으로 정렬이 수행되므로 주의해야 합니다.
3. 결합 인덱스 구성
- 위 쿼리에서 최적화된 인덱스는 [MCDP_CD + HIRE_YMD DESC + DR_NAME] 순서 입니다.
- MCDP_CD를 조건에 맞게 먼저 필터링 한 후, HIRE_YMD와 DR_NAME은 인덱스 내의 정렬된 상태로 스캔하기 때문에 별도의 정렬 작업없이 결과를 반환할 수 있습니다.
'🗄️ DB_이야기 > # ⚡SQL' 카테고리의 다른 글
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 조건에 부합하는 중고거래 댓글 조회하기(SELECT) (0) | 2026.04.13 |
|---|---|
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 3월에 태어난 여성 회원 목록 출력하기(SELECT) (1) | 2026.04.13 |
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 조건에 맞는 도서 리스트 출력하기(SELECT) (0) | 2026.04.13 |
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 과일로 만든 아이스크림 고르기(SELECT) (0) | 2026.04.13 |
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 12세 이하인 여자 환자 목록 출력하기(SELECT) (1) | 2026.04.13 |