본문 바로가기
🗄️ DB_이야기/# ⚡SQL

🚀[SQL 알고리즘 문제 풀이] Programmers : 흉부외과 또는 일반외과 의사 목록 출력하기(SELECT)

by gwon_s 2026. 4. 13.

👇 흉부외과 또는 일반외과 의사 목록 출력하기

 

프로그래머스

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_YMDDR_NAME은 인덱스 내의 정렬된 상태로 스캔하기 때문에 별도의 정렬 작업없이 결과를 반환할 수 있습니다.