프로그래머스 SQL 고득점 Kit의 SELECT 파트를 풀며 새롭게 알게 된 SQL 내장 함수와 쿼리 작성 팁들을 문법별로 정리해 보았습니다. 단순 조회를 넘어 데이터의 형식을 가공하고 예외(NULL)를 처리하는 기초 체력을 다지는 데 아주 유용했습니다.
데이터베이스에서 가장 잦은 오류를 유발하는 NULL 값을 다루는 방법을 확실히 짚고 넘어갔습니다.
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(컬럼명, 대체할값) 함수를 사용하면 매우 간결하게 처리할 수 있습니다.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
TLNO != NULL 처럼 등호 연산자를 쓰면 안 됩니다. NULL은 값이 존재하지 않는 상태이므로 반드시 IS NULL 또는 IS NOT NULL로 비교해야 한다는 SQL의 기본 원칙을 다졌습니다.기본적으로 제공되는 타임스탬프와 소수점 데이터를 요구사항에 맞게 예쁘게 가공하는 함수들을 익혔습니다.
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
DATETIME 타입에서 시간(시:분:초)을 떼어내고 연-월-일만 출력할 때는 DATE_FORMAT(컬럼명, '%Y-%m-%d')을 사용합니다.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)을 사용하여 정수로 깔끔하게 출력하는 방법을 익혔습니다.코드를 더 짧게 줄이거나, 데이터를 특정 기준으로 묶어 통계를 내는 방법을 학습했습니다.
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
WHERE MCDP_CD = 'CS' OR MCDP_CD = 'GS' 처럼 길어지는 OR 조건은 IN ('CS', 'GS')로 묶어서 간결하게 표현할 수 있습니다.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
GROUP BY 뒤에 쉼표로 연결(GROUP BY USER_ID, PRODUCT_ID)할 수 있습니다. 또한, 그룹화된 집계 결과(COUNT)에 조건을 걸 때는 WHERE가 아니라 반드시 HAVING을 써야 한다는 실행 순서의 차이를 명확히 이해했습니다.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)를 붙이고,SELECT나WHERE절에서테이블약어.컬럼명형식으로 접근해야 모호성(Ambiguity) 에러를 방지하고 가독성을 높일 수 있습니다.