SQL 함수 총정리
SQLD 시험 출제 범위의 문자열·숫자·날짜·변환·NULL 함수를 한눈에 정리
1. 문자열 함수
문자열 함수 정리
| 함수명 | 설명 | 예시 | 결과 |
|---|---|---|---|
| UPPER | 대문자로 변환 | UPPER('sql') | SQL |
| LOWER | 소문자로 변환 | LOWER('SQL') | sql |
| SUBSTR / SUBSTRING | 문자열 일부 추출 | SUBSTR('HELLO',1,3) | HEL |
| LENGTH / LEN | 문자열 길이 반환 | LENGTH('SQL') | 3 |
| LTRIM | 왼쪽 공백(또는 지정 문자) 제거 | LTRIM(' AB') | AB |
| RTRIM | 오른쪽 공백(또는 지정 문자) 제거 | RTRIM('AB ') | AB |
| TRIM | 양쪽 공백(또는 지정 문자) 제거 | TRIM(' AB ') | AB |
| LPAD | 왼쪽을 지정 문자로 채움 | LPAD('5',3,'0') | 005 |
| RPAD | 오른쪽을 지정 문자로 채움 | RPAD('A',3,'*') | A** |
| REPLACE | 문자열 치환 | REPLACE('ABC','B','X') | AXC |
| CONCAT | 문자열 연결 (2개만) | CONCAT('A','B') | AB |
| CHR / CHAR | ASCII 코드 → 문자 | CHR(65) | A |
| ASCII | 문자 → ASCII 코드 | ASCII('A') | 65 |
Oracle vs SQL Server 문자열 함수 차이
| 기능 | Oracle | SQL Server |
|---|---|---|
| 부분 문자열 | SUBSTR | SUBSTRING |
| 문자열 길이 | LENGTH | LEN |
| 문자열 연결 | || (파이프) | + (더하기) |
| ASCII → 문자 | CHR | CHAR |
2. 숫자 함수
숫자 함수 정리
| 함수명 | 설명 | 예시 | 결과 |
|---|---|---|---|
| ABS | 절댓값 | ABS(-15) | 15 |
| SIGN | 부호 판별 (1/0/-1) | SIGN(-5) | -1 |
| MOD | 나머지 반환 | MOD(7,3) | 1 |
| CEIL / CEILING | 올림 (크거나 같은 최소 정수) | CEIL(3.2) | 4 |
| FLOOR | 내림 (작거나 같은 최대 정수) | FLOOR(3.8) | 3 |
| ROUND | 반올림 (자릿수 지정 가능) | ROUND(3.456, 1) | 3.5 |
| TRUNC | 버림 (자릿수 지정 가능) | TRUNC(3.456, 1) | 3.4 |
| POWER | 거듭제곱 | POWER(2, 3) | 8 |
| SQRT | 제곱근 | SQRT(16) | 4 |
ROUND vs TRUNC 비교
ROUND는 반올림, TRUNC는 버림입니다. 두 번째 인자(자릿수)가 음수이면 정수 자리에서 처리합니다.
| 함수 | 예시 | 결과 |
|---|---|---|
| ROUND | ROUND(1256.78, -2) | 1300 |
| TRUNC | TRUNC(1256.78, -2) | 1200 |
3. 날짜 함수
날짜 함수 정리
| 기능 | Oracle | SQL Server | 설명 |
|---|---|---|---|
| 현재 날짜 | SYSDATE | GETDATE() | 현재 날짜/시간 반환 |
| 날짜 요소 추출 | EXTRACT(YEAR FROM d) | DATEPART(YEAR, d) | 연/월/일 등 추출 |
| 월 더하기 | ADD_MONTHS(d, n) | DATEADD(MONTH, n, d) | 날짜에 n개월 더하기 |
| 월 차이 | MONTHS_BETWEEN(d1, d2) | DATEDIFF(MONTH, d2, d1) | 두 날짜 간 월 수 차이 |
| 문자→날짜 | TO_DATE('문자', '형식') | CONVERT(DATE, '문자') | 문자열을 날짜로 변환 |
| 날짜→문자 | TO_CHAR(d, '형식') | CONVERT(VARCHAR, d, 스타일) | 날짜를 문자열로 변환 |
Oracle 날짜 연산
Oracle에서는 날짜에 숫자를 직접 더하거나 빼서 일(day) 단위 계산이 가능합니다.
- • SYSDATE + 1 → 내일
- • SYSDATE - 7 → 일주일 전
- • 날짜1 - 날짜2 → 두 날짜 간 일수 차이 (숫자 반환)
- • SYSDATE + 1/24 → 1시간 후
4. 변환 함수
명시적 변환 vs 암시적 변환
명시적 변환은 변환 함수를 직접 사용하는 것이고, 암시적 변환은 DBMS가 자동으로 타입을 변환하는 것입니다. 시험에서는 암시적 변환의 성능 문제와 예기치 않은 결과를 묻는 문제가 자주 출제됩니다.
Oracle 변환 함수
| 함수명 | 설명 | 예시 | 결과 |
|---|---|---|---|
| TO_CHAR(숫자) | 숫자 → 문자 | TO_CHAR(1234, '9,999') | 1,234 |
| TO_CHAR(날짜) | 날짜 → 문자 | TO_CHAR(SYSDATE, 'YYYY-MM-DD') | 2026-03-28 |
| TO_NUMBER | 문자 → 숫자 | TO_NUMBER('123') | 123 |
| TO_DATE | 문자 → 날짜 | TO_DATE('20260328', 'YYYYMMDD') | 2026-03-28 |
CAST / CONVERT 비교
| 함수 | 지원 | 문법 | 예시 |
|---|---|---|---|
| CAST | Oracle / SQL Server 공통 | CAST(값 AS 타입) | CAST(123 AS VARCHAR(10)) |
| CONVERT | SQL Server 전용 | CONVERT(타입, 값, 스타일) | CONVERT(VARCHAR, GETDATE(), 112) |
5. NULL 관련 함수
NULL의 특성
- • NULL은 '값이 없음'을 의미 (0이나 공백과 다름)
- • NULL과의 모든 연산 결과는 NULL
- • NULL과의 비교 결과는 항상 UNKNOWN (= NULL, > NULL 모두 불가)
- • WHERE절에서 NULL 비교는 IS NULL / IS NOT NULL 사용
- • 집계함수(SUM, AVG 등)는 NULL을 제외하고 계산
NULL 관련 함수 정리
| 기능 | Oracle | SQL Server | 설명 |
|---|---|---|---|
| NULL 대체 | NVL(a, b) | ISNULL(a, b) | a가 NULL이면 b 반환 |
| NULL 여부 분기 | NVL2(a, b, c) | - | a가 NULL이 아니면 b, NULL이면 c |
| 같으면 NULL | NULLIF(a, b) — 공통 | a와 b가 같으면 NULL, 다르면 a 반환 | |
| 첫 번째 비NULL | COALESCE(a, b, c, ...) — 공통 | 인자 중 첫 번째 NULL이 아닌 값 반환 | |
NVL vs COALESCE 차이
| 항목 | NVL / ISNULL | COALESCE |
|---|---|---|
| 인자 수 | 2개 고정 | 2개 이상 가능 |
| 표준 | DBMS 고유 함수 | ANSI 표준 |
| 평가 방식 | 두 인자 모두 평가 | 순서대로 평가, 비NULL 찾으면 중단 |
6. 시험 출제 포인트
자주 나오는 함정 문제
- 1. CONCAT은 인자가 2개만 가능 — 3개 이상 연결하려면 || (Oracle) 또는 + (SQL Server) 또는 CONCAT 중첩 필요
- 2. SUBSTR의 시작 위치는 1부터 — 0을 넣으면 1로 처리됨 (Oracle), SQL Server SUBSTRING도 1부터
- 3. MOD(음수) 주의 — Oracle: MOD(-7, 3) = -1, SQL Server: -7 % 3 = -1 (부호는 피제수를 따름)
- 4. ROUND/TRUNC 음수 자릿수 — ROUND(1256, -2) = 1300, TRUNC(1256, -2) = 1200 (정수 자리 처리)
- 5. NULL 연산 함정 — 1000 + NULL = NULL, NULL = NULL은 UNKNOWN (TRUE가 아님)
- 6. NVL2 vs NVL 혼동 — NVL(NULL, 'B') = 'B'이지만 NVL2(NULL, 'B', 'C') = 'C' (세 번째 인자 반환)
- 7. NULLIF 결과 — NULLIF(10, 10) = NULL, NULLIF(10, 20) = 10
- 8. Oracle SYSDATE는 괄호 없음 — SYSDATE (O), SYSDATE() (X) / SQL Server는 GETDATE() 괄호 필수
Oracle vs SQL Server 전체 비교
| 기능 | Oracle | SQL Server |
|---|---|---|
| 부분 문자열 | SUBSTR | SUBSTRING |
| 문자열 길이 | LENGTH | LEN |
| 문자열 연결 | || | + |
| 현재 날짜 | SYSDATE | GETDATE() |
| 날짜 추출 | EXTRACT | DATEPART |
| 월 더하기 | ADD_MONTHS | DATEADD |
| 월 차이 | MONTHS_BETWEEN | DATEDIFF |
| NULL 대체 | NVL | ISNULL |
| 타입 변환 | TO_CHAR, TO_NUMBER, TO_DATE | CONVERT, CAST |
| 올림 | CEIL | CEILING |
| ASCII→문자 | CHR | CHAR |
개념을 확인했다면 문제로 실력을 검증해보세요