[프로그래머스 SQL] SELECT 완벽 정리 및 핵심 문법 복기 (IFNULL, DATE_FORMAT 등)

이성진·2026년 3월 12일

프로그래머스 SQL

목록 보기
1/7

📌 개요

프로그래머스 SQL 고득점 Kit의 SELECT 파트를 풀며 새롭게 알게 된 SQL 내장 함수와 쿼리 작성 팁들을 문법별로 정리해 보았습니다. 단순 조회를 넘어 데이터의 형식을 가공하고 예외(NULL)를 처리하는 기초 체력을 다지는 데 아주 유용했습니다.


💡 1. NULL 처리 및 예외 필터링

데이터베이스에서 가장 잦은 오류를 유발하는 NULL 값을 다루는 방법을 확실히 짚고 넘어갔습니다.

📝 12세 이하인 여자 환자 목록 출력하기 (IFNULL)

SELECT PT_NAME, PT_NO, GEND_CD, AGE, IFNULL(TLNO, 'NONE')
FROM PATIENT
WHERE AGE <= 12 AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME ASC
  • 새로 배운 점: 전화번호(TLNO)가 없는 경우(NULL) 'NONE'이라는 문자열로 치환하여 출력해야 할 때 IFNULL(컬럼명, 대체할값) 함수를 사용하면 매우 간결하게 처리할 수 있습니다.

📝 3월에 태어난 여성 회원 목록 출력하기 (IS NOT NULL)

SELECT MEMBER_ID, MEMBER_NAME, GENDER, DATE_FORMAT(DATE_OF_BIRTH, '%Y-%m-%d') AS DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE MONTH(DATE_OF_BIRTH) = 3 AND GENDER = 'W' AND TLNO IS NOT NULL
ORDER BY MEMBER_ID
  • 새로 배운 점: 전화번호가 NULL이 아닌 데이터를 찾을 때 TLNO != NULL 처럼 등호 연산자를 쓰면 안 됩니다. NULL은 값이 존재하지 않는 상태이므로 반드시 IS NULL 또는 IS NOT NULL로 비교해야 한다는 SQL의 기본 원칙을 다졌습니다.

💡 2. 날짜 및 수치 데이터 가공

기본적으로 제공되는 타임스탬프와 소수점 데이터를 요구사항에 맞게 예쁘게 가공하는 함수들을 익혔습니다.

📝 조건에 맞는 도서 / 회원수 구하기 (DATE_FORMAT, YEAR)

-- 도서 리스트 출력 
SELECT BOOK_ID, DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM BOOK
WHERE YEAR(PUBLISHED_DATE) = 2021 AND CATEGORY = '인문'
ORDER BY PUBLISHED_DATE ASC

-- 회원수 구하기
SELECT COUNT(*) AS USERS
FROM USER_INFO
WHERE YEAR(JOINED) = 2021 AND AGE BETWEEN 20 AND 29
  • 새로 배운 점: 1. DATETIME 타입에서 시간(시:분:초)을 떼어내고 연-월-일만 출력할 때는 DATE_FORMAT(컬럼명, '%Y-%m-%d')을 사용합니다.
    1. 특정 연도나 월을 기준으로 필터링할 때는 LIKE 검색보다 YEAR(), MONTH() 같은 내장 함수를 사용하는 것이 훨씬 직관적입니다.

📝 평균 일일 대여 요금 구하기 (ROUND)

SELECT ROUND(AVG(DAILY_FEE), 0) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = 'SUV'
  • 새로 배운 점: 평균(AVG)을 구한 뒤 소수점 첫째 자리에서 반올림을 해야 할 때, ROUND(값, 0)을 사용하여 정수로 깔끔하게 출력하는 방법을 익혔습니다.

💡 3. 조건 축약 및 그룹화 심화

코드를 더 짧게 줄이거나, 데이터를 특정 기준으로 묶어 통계를 내는 방법을 학습했습니다.

📝 흉부외과/일반외과 의사 목록 & 상위 n개 레코드 (IN, LIMIT)

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

SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME ASC
LIMIT 1
  • 새로 배운 점:
    1. WHERE MCDP_CD = 'CS' OR MCDP_CD = 'GS' 처럼 길어지는 OR 조건은 IN ('CS', 'GS')로 묶어서 간결하게 표현할 수 있습니다.
    2. 최상위(또는 최하위) 데이터 1개만 뽑고 싶을 때는 서브 쿼리를 쓸 필요 없이 정렬 후 LIMIT 1을 사용하면 끝납니다.

📝 재구매가 일어난 상품과 회원 리스트 구하기 (GROUP BY, HAVING)

SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) >= 2
ORDER BY USER_ID ASC, PRODUCT_ID DESC
  • 새로 배운 점: 데이터를 그룹으로 묶을 때 기준이 2개 이상이면 GROUP BY 뒤에 쉼표로 연결(GROUP BY USER_ID, PRODUCT_ID)할 수 있습니다. 또한, 그룹화된 집계 결과(COUNT)에 조건을 걸 때는 WHERE가 아니라 반드시 HAVING을 써야 한다는 실행 순서의 차이를 명확히 이해했습니다.

📝 조건에 부합하는 중고거래 댓글 조회하기 (Table Alias)

SELECT B.TITLE, B.BOARD_ID, R.REPLY_ID, R.WRITER_ID, R.CONTENTS, DATE_FORMAT(R.CREATED_DATE, '%Y-%m-%d') AS CREATED_DATE
FROM USED_GOODS_BOARD B
JOIN USED_GOODS_REPLY R
ON B.BOARD_ID = R.BOARD_ID
WHERE DATE_FORMAT(B.CREATED_DATE, '%Y-%m') = '2022-10'
ORDER BY R.CREATED_DATE ASC, B.TITLE ASC
  • 새로 배운 점: 여러 테이블을 JOIN 할 때는 각 테이블에 약어(B, R)를 붙이고, SELECTWHERE 절에서 테이블약어.컬럼명 형식으로 접근해야 모호성(Ambiguity) 에러를 방지하고 가독성을 높일 수 있습니다.
profile
알고리즘과 cs지식 학습

0개의 댓글