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

🚀[SQL 알고리즘 문제 풀이] Programmers : 12세 이하인 여자 환자 목록 출력하기(SELECT)

by gwon_s 2026. 4. 13.

👇 12세 이하인 여자 환자 목록 출력하기(SELECT)

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

🔓 문제 설명

PATIENT 테이블에서 12세 이하인 여자환자의 환자이름, 환자번호, 성별코드, 나이, 전화번호를 조회하는 SQL문을 작성해주세요. 이때 전화번호가 없는 경우, 'NONE'으로 출력시켜 주시고 결과는 나이를 기준으로 내림차순 정렬하고, 나이 같다면 환자이름을 기준으로 오름차순 정렬해주세요.

 

예시 문제 데이터 (PATIENT)

PT_NO PT_NAME GEND_CD AGE TLNO
PT22000009 한나 W 12 01032323117
PT22000018 안나 W 11 NULL
PT22000019 바라 W 10 01079068799
PT22000006 뽀뽀 W 8 NULL
PT22000014 토프 W 22 01039458213

⚡SQL Query

SELECT PT_NAME, PT_NO, GEND_CD, AGE, NVL(TLNO, 'NONE') AS TLNO
FROM PATIENT
WHERE AGE <= 12 
  AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME ASC;

🔎 풀이 설명

1. NULL 값 처리: NVL(TLNO, 'NONE') 함수를 사용하여 NULL인 경우 'NONE'으로 치환


💡인사이트

1. NVL()

  • PostgreSQL 이나 MySQL의 경우 COALESCEIFNULL을 사용합니다.

 

2. NULL과 인덱스

  • 인덱스 구성 컬럼이 모두 NULL인 ROW는 인덱스에 저장되지 않습니다. 따라서, WHERE TLNO IS NULL과 같은 인덱스를 타지 못하고 FULL TABLE SCAN을 유발합니다.

 

3. 결합 인덱스 구성

  • 위 문제의 최적의 인덱스 구성은 [GEND_CD + AGE + PT_NAME] 순의 결합 인덱스 입니다.
  • GEND_CD등치(=) 조건, AGE범위(<=) 조건이므로, 이 순서로 인덱스를 생성하면 INDEX RANGE SCAN 효율이 극대화되며 PT_NAME은 ORDER BY에 의한 정렬 부하도 제거할 수 있습니다.