Programmers SQL Level 1에서 반복적으로 등장하는 SELECT, WHERE, ORDER BY, 기본 집계 함수, ROUND·IFNULL·날짜 추출·문자열 함수를 실전 패턴 중심으로 정리한다.
Code Test
저자
Kwangmin Kim
공개
2026년 04월 15일
1 개요
SQL Level 1은 단일 테이블에서 필터링, 정렬, 기본 집계를 수행하는 능력을 평가한다. 복잡한 조인이나 윈도우 함수 없이 SELECTWHEREORDER BY 구조를 정확히 작성할 수 있으면 대부분 해결된다.
2 DS vs AIE 트랙 우선순위
구문
DS 우선순위
AIE 우선순위
설명
SELECT, FROM, WHERE
★★★
★★★
모든 쿼리의 기본
ORDER BY
★★★
★★★
정렬
LIMIT
★★★
★★☆
상위 N개
IS NULL / IS NOT NULL
★★★
★★☆
NULL 처리
LIKE
★★★
★☆☆
패턴 매칭
IN, NOT IN
★★★
★★☆
값 집합 조건
BETWEEN
★★★
★★☆
범위 조건
DISTINCT
★★★
★★☆
중복 제거
집계 함수 (COUNT, SUM, AVG, MAX, MIN)
★★★
★★☆
기본 집계
ROUND / FLOOR / CEIL
★★★
★★☆
반올림·내림·올림
IFNULL
★★★
★★☆
NULL → 기본값 치환
YEAR / MONTH / DATE_FORMAT
★★★
★★☆
날짜 추출·포맷
LENGTH / SUBSTR / CONCAT
★★☆
★☆☆
문자열 기본 조작
COUNT DISTINCT
★★★
★★☆
중복 제외 행 수
ABS
★★☆
★☆☆
절댓값
3 기본 SELECT 구조
-- 기본 구조SELECT 열1, 열2 -- 조회할 열FROM 테이블명 -- 대상 테이블WHERE 조건 -- 필터 조건ORDERBY 열 ASC/DESC-- 정렬LIMIT N; -- 상위 N개만-- 예시 테이블: ANIMAL_INS (ANIMAL_ID, ANIMAL_TYPE, NAME, SEX_UPON_INTAKE, DATETIME)-- 데이터: ('A001','Dog','Toto','Intact Male','2022-01-01')-- 모든 열 조회SELECT*FROM ANIMAL_INS;-- 결과: 전체 행과 열 반환-- 특정 열만 조회SELECT ANIMAL_ID, NAME FROM ANIMAL_INS;-- 결과: ANIMAL_ID와 NAME 두 열만 반환-- 중복 제거SELECTDISTINCT ANIMAL_TYPE FROM ANIMAL_INS;-- 결과: 고유한 동물 종류 목록 (Dog, Cat 등)
4 WHERE 조건문
-- 비교 연산자SELECT*FROM ANIMAL_INS WHERE ANIMAL_TYPE ='Dog'; -- 개만 조회SELECT*FROM ANIMAL_INS WHERE ANIMAL_TYPE !='Cat'; -- 고양이 제외-- NULL 처리 (= NULL은 동작하지 않으므로 IS NULL 사용)SELECT*FROM ANIMAL_INS WHERE NAME ISNULL; -- 이름 없는 동물SELECT*FROM ANIMAL_INS WHERE NAME ISNOTNULL; -- 이름 있는 동물-- LIKE: 패턴 매칭-- %: 0개 이상 임의 문자 / _: 정확히 1개 문자SELECT*FROM ANIMAL_INS WHERE NAME LIKE'L%'; -- L로 시작하는 이름SELECT*FROM ANIMAL_INS WHERE NAME LIKE'%ie'; -- ie로 끝나는 이름SELECT*FROM ANIMAL_INS WHERE NAME LIKE'%a%'; -- a가 포함된 이름-- IN / NOT IN: 값 집합 조건SELECT*FROM ANIMAL_INSWHERE ANIMAL_TYPE IN ('Dog', 'Cat'); -- 개 또는 고양이-- 결과: ANIMAL_TYPE이 'Dog'이거나 'Cat'인 행만 반환SELECT*FROM ANIMAL_INSWHERE ANIMAL_TYPE NOTIN ('Dog', 'Cat'); -- 개, 고양이 제외-- BETWEEN: 범위 조건 (경계값 포함)SELECT*FROM ANIMAL_INSWHERE DATETIME BETWEEN'2022-01-01'AND'2022-12-31';-- 결과: 2022년 한 해 동안 입양된 동물-- 복합 조건: AND, OR, NOTSELECT*FROM ANIMAL_INSWHERE ANIMAL_TYPE ='Dog'AND SEX_UPON_INTAKE LIKE'Intact%';-- 결과: 중성화되지 않은 개SELECT*FROM ANIMAL_INSWHERE ANIMAL_TYPE ='Dog'OR ANIMAL_TYPE ='Cat';-- 결과: 개 또는 고양이 (= IN ('Dog', 'Cat'))
5 ORDER BY 정렬
-- 오름차순 (기본값)SELECT*FROM ANIMAL_INS ORDERBY NAME; -- 이름 오름차순 (A→Z)SELECT*FROM ANIMAL_INS ORDERBY NAME ASC; -- 동일-- 내림차순SELECT*FROM ANIMAL_INS ORDERBY DATETIME DESC; -- 최근 입소 순-- 다중 정렬 (1순위 → 2순위)SELECT*FROM ANIMAL_INSORDERBY ANIMAL_TYPE ASC, NAME DESC;-- 동물 종류 오름차순, 같은 종류면 이름 내림차순-- LIMIT: 상위 N개SELECT NAME FROM ANIMAL_INS ORDERBY DATETIME LIMIT1;-- 가장 먼저 입소한 동물 이름 1건SELECT NAME FROM ANIMAL_INS ORDERBY DATETIME DESCLIMIT3;-- 가장 최근에 입소한 동물 이름 3건
6 기본 집계 함수
-- 입력 테이블: ANIMAL_INS (총 10행, Dog 6마리, Cat 4마리)-- COUNT(*): 전체 행 수-- COUNT(열): NULL이 아닌 행 수-- SUM(열): 합계-- AVG(열): 평균-- MAX(열): 최댓값-- MIN(열): 최솟값-- 전체 동물 수SELECTCOUNT(*) AS total FROM ANIMAL_INS;-- 결과: total = 10-- 이름이 있는 동물 수 (NULL 제외)SELECTCOUNT(NAME) ASnamedFROM ANIMAL_INS;-- 결과: named = 8 (이름 없는 동물 2마리 제외)-- COUNT DISTINCT: 중복 제외한 고유 값 수SELECTCOUNT(DISTINCT ANIMAL_TYPE) FROM ANIMAL_INS;-- 결과: 2 (Dog, Cat)-- 최근 / 가장 오래된 입소일SELECTMAX(DATETIME) AS latest, MIN(DATETIME) AS oldestFROM ANIMAL_INS;-- 결과: latest = '2023-05-10', oldest = '2020-01-03'-- GROUP BY: 그룹별 집계SELECT ANIMAL_TYPE, COUNT(*) AS cntFROM ANIMAL_INSGROUPBY ANIMAL_TYPE;-- 결과:-- ANIMAL_TYPE | cnt-- ------------|------ Dog | 6-- Cat | 4