SQL 필수 구문 레퍼런스 (Level 1)

코딩 테스트 SQL Level 1을 위한 기본 구문 정리

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 조건             -- 필터 조건
ORDER BYASC/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 두 열만 반환

-- 중복 제거
SELECT DISTINCT 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 IS NULL;             -- 이름 없는 동물
SELECT * FROM ANIMAL_INS WHERE NAME IS NOT NULL;         -- 이름 있는 동물

-- 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_INS
WHERE ANIMAL_TYPE IN ('Dog', 'Cat');                     -- 개 또는 고양이
-- 결과: ANIMAL_TYPE이 'Dog'이거나 'Cat'인 행만 반환

SELECT * FROM ANIMAL_INS
WHERE ANIMAL_TYPE NOT IN ('Dog', 'Cat');                 -- 개, 고양이 제외

-- BETWEEN: 범위 조건 (경계값 포함)
SELECT * FROM ANIMAL_INS
WHERE DATETIME BETWEEN '2022-01-01' AND '2022-12-31';
-- 결과: 2022년 한 해 동안 입양된 동물

-- 복합 조건: AND, OR, NOT
SELECT * FROM ANIMAL_INS
WHERE ANIMAL_TYPE = 'Dog' AND SEX_UPON_INTAKE LIKE 'Intact%';
-- 결과: 중성화되지 않은 개

SELECT * FROM ANIMAL_INS
WHERE ANIMAL_TYPE = 'Dog' OR ANIMAL_TYPE = 'Cat';
-- 결과: 개 또는 고양이 (= IN ('Dog', 'Cat'))

5 ORDER BY 정렬

-- 오름차순 (기본값)
SELECT * FROM ANIMAL_INS ORDER BY NAME;           -- 이름 오름차순 (A→Z)
SELECT * FROM ANIMAL_INS ORDER BY NAME ASC;       -- 동일

-- 내림차순
SELECT * FROM ANIMAL_INS ORDER BY DATETIME DESC;  -- 최근 입소 순

-- 다중 정렬 (1순위 → 2순위)
SELECT * FROM ANIMAL_INS
ORDER BY ANIMAL_TYPE ASC, NAME DESC;
-- 동물 종류 오름차순, 같은 종류면 이름 내림차순

-- LIMIT: 상위 N개
SELECT NAME FROM ANIMAL_INS ORDER BY DATETIME LIMIT 1;
-- 가장 먼저 입소한 동물 이름 1건

SELECT NAME FROM ANIMAL_INS ORDER BY DATETIME DESC LIMIT 3;
-- 가장 최근에 입소한 동물 이름 3건

6 기본 집계 함수

-- 입력 테이블: ANIMAL_INS (총 10행, Dog 6마리, Cat 4마리)

-- COUNT(*):  전체 행 수
-- COUNT(열): NULL이 아닌 행 수
-- SUM(열):   합계
-- AVG(열):   평균
-- MAX(열):   최댓값
-- MIN(열):   최솟값

-- 전체 동물 수
SELECT COUNT(*) AS total FROM ANIMAL_INS;
-- 결과: total = 10

-- 이름이 있는 동물 수 (NULL 제외)
SELECT COUNT(NAME) AS named FROM ANIMAL_INS;
-- 결과: named = 8  (이름 없는 동물 2마리 제외)

-- COUNT DISTINCT: 중복 제외한 고유 값 수
SELECT COUNT(DISTINCT ANIMAL_TYPE) FROM ANIMAL_INS;
-- 결과: 2 (Dog, Cat)

-- 최근 / 가장 오래된 입소일
SELECT MAX(DATETIME) AS latest, MIN(DATETIME) AS oldest
FROM ANIMAL_INS;
-- 결과: latest = '2023-05-10', oldest = '2020-01-03'

-- GROUP BY: 그룹별 집계
SELECT ANIMAL_TYPE, COUNT(*) AS cnt
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE;
-- 결과:
-- ANIMAL_TYPE | cnt
-- ------------|----
-- Dog         | 6
-- Cat         | 4

7 숫자 함수 (Level 1 빈출)

-- ROUND: 반올림 (Programmers Lv.1 평균 반올림 문제 단골)
SELECT ROUND(AVG(DAILY_FEE), 0) FROM CAR_RENTAL;
-- 평균을 정수로 반올림 (소수 자리 0 = 정수)

SELECT ROUND(3.14159, 2);    -- → 3.14 (소수 2자리)
SELECT ROUND(1234.5, -2);    -- → 1200 (10의 자리)

-- FLOOR / CEIL: 내림 / 올림
SELECT FLOOR(3.9);    -- → 3
SELECT CEIL(3.1);     -- → 4

-- TRUNCATE: 버림 (반올림 아님)
SELECT TRUNCATE(3.789, 1);    -- → 3.7

-- ABS: 절댓값
SELECT ABS(-5);    -- → 5

-- MOD: 나머지 (짝수/홀수 판별)
SELECT * FROM products WHERE MOD(id, 2) = 0;    -- 짝수 ID만

8 날짜 함수

-- YEAR, MONTH, DAY 추출
SELECT NAME, YEAR(DATETIME) AS yr FROM ANIMAL_INS;
-- DATETIME = '2022-03-15' → yr = 2022

SELECT NAME, MONTH(DATETIME) AS mo FROM ANIMAL_INS;
-- DATETIME = '2022-03-15' → mo = 3

-- DATE_FORMAT: 날짜 포맷 변경
SELECT DATE_FORMAT(DATETIME, '%Y-%m-%d') AS date_str FROM ANIMAL_INS;
-- DATETIME = '2022-03-15 10:30:00' → date_str = '2022-03-15'

SELECT DATE_FORMAT(DATETIME, '%Y년 %m월') AS period FROM ANIMAL_INS;
-- → '2022년 03월'

-- 주요 포맷 지시자
-- %Y: 4자리 연도 (2024)    %y: 2자리 연도 (24)
-- %m: 2자리 월 (03)         %c: 월 (3, 0 없이)
-- %d: 2자리 일 (15)
-- %H: 24시간 시 (14)        %h: 12시간 시 (02)
-- %i: 분 (30)               %s: 초 (45)

-- DAY, DAYOFWEEK, DAYOFMONTH
SELECT DAY('2024-03-15');         -- → 15
SELECT DAYOFWEEK('2024-03-15');   -- → 6 (일=1, 월=2, ..., 토=7)

-- CURDATE: 오늘 날짜
SELECT CURDATE();    -- → '2024-03-15'

9 문자열 함수

-- LENGTH: 문자열 길이
SELECT NAME, LENGTH(NAME) AS name_len FROM ANIMAL_INS;
-- 'Toto' → 4

-- UPPER, LOWER
SELECT UPPER(NAME) FROM ANIMAL_INS;   -- 'toto' → 'TOTO'
SELECT LOWER(NAME) FROM ANIMAL_INS;   -- 'TOTO' → 'toto'

-- SUBSTR / SUBSTRING
SELECT SUBSTR(NAME, 1, 3) FROM ANIMAL_INS;  -- 'Toto' → 'Tot' (1번째부터 3글자)

-- CONCAT: 문자열 연결
SELECT CONCAT(NAME, ' (', ANIMAL_TYPE, ')') AS label FROM ANIMAL_INS;
-- → 'Toto (Dog)'

-- IFNULL: NULL이면 대체값
SELECT IFNULL(NAME, '이름 없음') AS name FROM ANIMAL_INS;
-- NAME=NULL → '이름 없음'

-- LEFT / RIGHT: 앞/뒤 N글자
SELECT LEFT('2024-03-15', 4);     -- → '2024'
SELECT RIGHT('hello', 3);         -- → 'llo'

-- REPLACE: 문자열 치환
SELECT REPLACE('010-1234-5678', '-', '');    -- → '01012345678'

-- TRIM: 좌우 공백 제거
SELECT TRIM('  hello  ');    -- → 'hello'

10 Level 1 빈출 패턴 모음

-- 패턴 1: 평균 반올림 (단골)
SELECT ROUND(AVG(DAILY_FEE), 0) AS AVG_FEE FROM CAR_RENTAL;

-- 패턴 2: NULL 치환 후 정렬
SELECT animal_id, IFNULL(name, 'No name') AS name, sex_upon_intake
FROM animal_ins
ORDER BY animal_id;

-- 패턴 3: 특정 연/월 필터 (3가지 방식)
SELECT * FROM orders WHERE YEAR(order_date) = 2024 AND MONTH(order_date) = 3;
SELECT * FROM orders WHERE DATE_FORMAT(order_date, '%Y-%m') = '2024-03';
SELECT * FROM orders WHERE order_date BETWEEN '2024-03-01' AND '2024-03-31';

-- 패턴 4: 최상/최하 1건
SELECT NAME FROM animal_ins ORDER BY datetime LIMIT 1;     -- 최초
SELECT MAX(datetime) FROM animal_ins;                      -- 값만 필요하면 MAX

-- 패턴 5: 중복 제거한 종류 수
SELECT COUNT(DISTINCT NAME) FROM animal_ins WHERE NAME IS NOT NULL;

11 유형별 패턴 매핑 (Level 1)

문제 유형 핵심 구문 패턴
특정 조건 필터링 WHERE WHERE 조건1 AND 조건2
NULL 처리 IS NULL / IS NOT NULL WHERE col IS NULL
패턴 검색 LIKE WHERE name LIKE '%키워드%'
중복 제거 수 COUNT DISTINCT SELECT COUNT(DISTINCT col)
최근/오래된 N개 ORDER BY + LIMIT ORDER BY col DESC LIMIT N
그룹별 집계 GROUP BY + 집계함수 GROUP BY col
NULL 대체 IFNULL IFNULL(col, 기본값)
날짜 포맷 DATE_FORMAT DATE_FORMAT(col, '%Y-%m-%d')
평균 반올림 ROUND + AVG ROUND(AVG(col), N)
짝·홀수 판별 MOD WHERE MOD(id, 2) = 0
연/월 필터 YEAR / MONTH YEAR(col) = 2024
부분 문자열 LEFT / SUBSTR LEFT(col, 4)

12 관련 문서

Subscribe

Enjoy this blog? Get notified of new posts by email: