단일행 함수
쉽게 말하면
단일행 함수는 줄 하나하나에 값을 바꿔 주는 도구예요. 글자를 자르거나(SUBSTR) 대문자로 바꾸고, 숫자를 반올림하고(ROUND), 날짜에 달을 더하는 식이에요. 열 줄을 넣으면 열 줄이 그대로 나와요. 여러 줄을 하나로 합치는 집계 함수와 다른 점이에요.
시험용 정의
단일행 함수는 행 하나마다 값 하나를 돌려주는 함수다. 다루는 값에 따라 문자 함수(SUBSTR, LENGTH, UPPER…), 숫자 함수(ROUND, TRUNC, MOD…), 날짜 함수(SYSDATE, ADD_MONTHS…), 변환 함수(TO_CHAR, TO_DATE, TO_NUMBER, CAST)로 나눈다. SELECT·WHERE·ORDER BY 어디서나 쓸 수 있고, 함수 안에 함수를 겹쳐 쓸 수 있다.
비유로 이해하기
행 하나하나를 차례로 통과시키는 기계다. 이름을 넣으면 소문자로 바꿔 내보내고, 숫자를 넣으면 반올림해 내보낸다. 들어간 행 수와 나온 행 수가 같다. 여러 행을 하나로 뭉치는 집계 함수와 다른 점이다.
자세히
먼저 알아 둘 말
| 말 | 뜻 |
|---|---|
| 인수 | 함수 괄호 안에 넣는 값. SUBSTR('ABC', 2, 1)에서 'ABC', 2, 1 |
| 단일행 함수 vs 다중행 함수 | 단일행은 행마다 결과 하나, 다중행(집계 함수 SUM·COUNT 등)은 여러 행을 묶어 결과 하나 |
| 형변환 | 문자 '100'을 숫자 100으로처럼 자료형을 바꾸는 것. 직접 하면 명시적, DBMS가 알아서 하면 암시적 |
| SYSDATE | Oracle에서 현재 날짜·시각. SQL Server는 GETDATE() |
문자 함수
| 함수 | 결과 예 | 메모 |
|---|---|---|
| LOWER / UPPER / INITCAP | LOWER('KIM') → kim | INITCAP은 첫 글자만 대문자 |
| LENGTH(s) | LENGTH('SQLD') → 4 | SQL Server는 LEN |
| SUBSTR(s, 시작, 길이) | SUBSTR('SQLD2026', 5, 2) → 20 | 시작이 음수면 뒤에서부터. SQL Server는 SUBSTRING |
| INSTR(s, 찾을것, 시작, n번째) | INSTR('BANANA', 'A', 1, 2) → 4 | 없으면 0 |
| LTRIM / RTRIM / TRIM | TRIM(' hi ') → hi | TRIM('x' FROM s)로 특정 문자 |
| LPAD / RPAD(s, 길이, 채울문자) | LPAD('9000', 6, '*') → **9000 | |
| REPLACE(s, a, b) | REPLACE('A-B-C', '-') → ABC | b를 생략하면 지운다 |
| CONCAT(a, b) | CONCAT('A', 'B') → AB | 인수 두 개만 |
숫자 함수
| 함수 | 결과 예 | 메모 |
|---|---|---|
| ROUND(n, 자리) | ROUND(1234.567, 1) → 1234.6 | 음수 자리는 정수부에서 반올림 |
| TRUNC(n, 자리) | TRUNC(1234.567, 1) → 1234.5 | 버림. SQL Server는 ROUND(n, d, 1) |
| CEIL / FLOOR | CEIL(12.1) → 13, FLOOR(-12.1) → -13 | CEIL은 같거나 큰 최소 정수, FLOOR는 같거나 작은 최대 정수. SQL Server는 CEILING |
| MOD(a, b) | MOD(17, 5) → 2 | 나머지. SQL Server는 a % b |
| ABS / SIGN / POWER / SQRT | SIGN(-3) → -1 | 절댓값, 부호, 거듭제곱, 제곱근 |
날짜와 변환 함수
| 함수 | 결과 예 | 메모 |
|---|---|---|
| SYSDATE | 현재 날짜 | SQL Server는 GETDATE() |
| 날짜 + 숫자 | hiredate + 1 → 다음 날 | 날짜 - 날짜 = 일수, 날짜 + 1/24 = 1시간 뒤 |
| ADD_MONTHS(d, n) | ADD_MONTHS('2023-08-01', 6) → 2024-02-01 | n개월 뒤 |
| EXTRACT(YEAR FROM d) | 2023 | SQL Server는 YEAR(d), DATEPART |
| TO_CHAR(d, 'YYYY.MM') | 2023.08 | 날짜·숫자 → 문자 |
| TO_DATE('20261114', 'YYYYMMDD') | 날짜 | 문자 → 날짜 |
| TO_NUMBER('100') / CAST(x AS 형) | 100 | 문자 → 숫자, 표준 형변환 |
암시적 형변환
숫자 열과 문자를 비교하면 Oracle은 문자를 숫자로 바꿔 비교한다. WHERE sal = '3000'은 동작하지만, 문자 열을 숫자와 비교하면(WHERE 문자열 = 100) 열 값 전체를 숫자로 바꾸느라 숫자가 아닌 값이 있으면 오류가 나고, 그 열의 인덱스도 쓰지 못한다. 형은 명시적으로 맞춰 쓰는 것이 좋다.
시험에 이렇게 나와요
- SUBSTR·INSTR·LENGTH·TRIM·LPAD 결과값 계산
- ROUND·TRUNC의 음수 자리, CEIL·FLOOR의 음수 처리
- 날짜 연산: 날짜 + 숫자(일), 날짜 - 날짜(일수), 1/24 = 1시간
- Oracle·SQL Server 함수 이름 차이 (SUBSTR/SUBSTRING, LENGTH/LEN, SYSDATE/GETDATE, CEIL/CEILING)
- 단일행 함수는 행 수를 바꾸지 않음, 중첩 가능
출제 범위·공식 안내 기반
확인 문제
Q1. SELECT ROUND(1234.567, -2) FROM DUAL의 결과는?
- 1200
- 1234
- 1234.57
- 1300
정답 보기
1번 1200
두 번째 인수가 음수면 소수점 왼쪽 자리에서 반올림한다. -2는 십의 자리에서 반올림해 백의 자리까지 남기므로 1234.567 → 1200.
Q2. SELECT SUBSTR('DATABASE', 3, 4) FROM DUAL의 결과는?
- TABA
- DATA
- BASE
- ABAS
정답 보기
1번 TABA
3번째 글자 T부터 4글자 → TABA.
Q3. INSTR('CORPORATE FLOOR', 'OR', 3, 2)의 결과는?
- 0
- 2
- 5
- 14
정답 보기
4번 14
3번째 글자부터 'OR'을 찾으면 5번째(CORPORATE)가 첫 번째, 14번째(FLOOR)가 두 번째다.
Q4. 결과가 나머지와 다른 것은?
- TRUNC(5.9)
- CEIL(4.1)
- ROUND(4.5)
- FLOOR(6.1)
정답 보기
4번 FLOOR(6.1)
CEIL(4.1) = 5, ROUND(4.5) = 5, TRUNC(5.9) = 5, FLOOR(6.1) = 6.
Q5. SQL Server 함수와 Oracle 함수의 짝이 틀린 것은?
- GETDATE() - SYSDATE
- SUBSTRING - SUBSTR
- LEN - LENGTH
- CEIL - FLOOR
정답 보기
4번 CEIL - FLOOR
SQL Server의 CEILING이 Oracle의 CEIL과 짝이다. FLOOR는 둘 다 FLOOR.
헷갈리기 쉬운 O·X
단일행 함수는 여러 행을 묶어 결과를 하나만 돌려준다.
정답 보기
X 그것은 집계(다중행) 함수다. 단일행 함수는 행마다 결과 하나.
Oracle에서 날짜에 숫자 1을 더하면 하루 뒤가 된다.
정답 보기
O 날짜 연산의 단위는 일(day)이다. 1/24는 1시간.
FLOOR(-12.1)의 결과는 -12다.
정답 보기
X FLOOR는 같거나 작은 최대 정수라 -13이다.