단일행 함수는 행마다 한 번씩 계산해 결과를 하나씩 돌려줍니다. 인자는 여러 개일 수 있습니다. 문자·숫자·날짜를 다루는 함수와, 값의 형(데이터 타입)을 바꾸는 변환 함수가 있습니다.
이름에서 성만 떼고, 금액을 반올림하고, 날짜에 석 달을 더하듯 저장된 값을 다듬어 보일 때 함수(function)를 씁니다.
SUBSTR(ENAME, 1, 1)의 ENAME·1·1처럼 함수에 넘기는 값을 인자(argument)라 합니다.
여러 행을 값 하나로 줄이는 집계 함수(aggregate function)와 달리, 단일행 함수(single-row function)는 SELECT·WHERE·ORDER BY 어디에 써도 행마다 따로 계산합니다.
1문자 함수
문자 함수는 글자 자리를 1부터 세고, 공백도 한 글자로 셉니다.
| 함수 | 하는 일 |
|---|---|
SUBSTR(문자, m, n) | m째 글자부터 n글자를 자름. n을 빼면 끝까지, m이 음수면 뒤에서 셈 |
LENGTH · INSTR(문자, 글자) | 글자 수 · 그 글자가 처음 나오는 자리 |
UPPER · LOWER | 대문자로 · 소문자로 |
LTRIM · RTRIM · TRIM | 왼쪽 · 오른쪽 · 양쪽 끝에서 지정한 글자를 지움(없으면 공백) |
REPLACE(문자, a, b) | a를 b로 바꿈 |
LPAD(문자, n, c) | 왼쪽을 c로 채워 n자리로. 한글은 한 글자가 두 자리 |
ASCII · CHR | 글자의 코드 · 코드의 글자 |
CONCAT(a, b) | 두 문자열을 이음(Oracle 23부터는 셋 이상도). NULL은 건너뜀 |
LTRIM·RTRIM의 둘째 인자는 글자 묶음이라 그 안의 어느 글자든 끝에서 이어지는 동안 지웁니다.
2숫자 함수
ROUND·TRUNC의 둘째 인자는 남길 자리입니다. 소수 첫째 자리가 1, 일의 자리가 0, 백의 자리가 -2이고, 빼면 0입니다.
1256.78의 자리 | ROUND | TRUNC |
|---|---|---|
| 1 | 1256.8 | 1256.7 |
| 0 | 1257 | 1256 |
| -2 | 1300 | 1200 |
CEIL은 그 수보다 크거나 같은 정수로 올리고, FLOOR는 작거나 같은 정수로 내립니다.
TRUNC는 버리기만 해서 음수도 0 쪽으로 잘립니다. TRUNC(-1.5)는 -1이라 FLOOR(-1.5)의 -2와 다릅니다.
MOD(m, n)은 나머지, ABS는 절댓값이고, SIGN은 양수면 1, 0이면 0, 음수면 -1입니다.
3날짜 함수
날짜에 더하는 1은 하루라서 1/24는 한 시간입니다. 날짜에서 날짜를 빼면 일수가 나오고, 날짜끼리 더하면 ORA-00975 오류입니다.
| 함수 | 하는 일 |
|---|---|
ADD_MONTHS(날짜, n) | n달 뒤. 결과 달에 그 날이 없거나 시작일이 말일이면 결과 달의 말일 |
LAST_DAY(날짜) | 그달의 마지막 날 |
MONTHS_BETWEEN(앞, 뒤) | 앞에서 뒤를 뺀 개월 수. 앞이 이르면 음수 |
EXTRACT(MONTH FROM 날짜) | 연·월·일 같은 부분을 숫자로 |
4변환 함수와 함수 중첩
TO_ 변환 함수는 이름 끝에 바꾼 뒤의 형이 붙습니다. 날짜·숫자 → 문자는 TO_CHAR, 문자 → 날짜는 TO_DATE, 문자 → 숫자는 TO_NUMBER이고, 둘째 인자인 형식('YYYYMMDD' 같은)은 어느 쪽이든 문자 쪽의 꼴을 적습니다.
변환 함수로 바꾸는 것을 명시적 형변환(explicit conversion), '10' + 1처럼 DBMS가 알아서 바꾸는 것을 암시적 형변환(implicit conversion)이라 합니다. 숫자로 못 바꾸는 'A' + 1은 ORA-01722 오류입니다.
TO_CHAR(ADD_MONTHS(…))처럼 겹친 함수는 안쪽 결과가 바깥 함수의 인자가 됩니다.
SQL Server는 같은 함수를 다른 이름으로 씁니다.
| 하는 일 | Oracle | SQL Server |
|---|---|---|
| 자르기 · 글자 수 | SUBSTR · LENGTH | SUBSTRING · LEN |
| 올림 · 나머지 | CEIL · MOD | CEILING · % |
| 코드의 글자 | CHR | CHAR |
| 지금 날짜와 시각 | SYSDATE | GETDATE() |
| 형 바꾸기 | TO_CHAR · TO_DATE · TO_NUMBER · CAST | CAST · CONVERT |
예제
날짜는 결과가 늘 같도록 SYSDATE(지금 날짜와 시각) 대신 DATE '2026-10-12'를 쓰고, TO_CHAR로 꼴을 정했습니다.
SELECT SUBSTR('SQL Developer',
5, 3) AS A,
SUBSTR('SQL Developer',
5) AS B,
SUBSTR('SQL Developer',
-3) AS C,
INSTR('SQL Developer',
'e') AS D
FROM DUAL;
| A | B | C | D |
|---|---|---|---|
| Dev | Developer | per | 6 |
SELECT LTRIM('xxSQLxx', 'x')
AS L,
RTRIM('xxSQLxx', 'x') AS R,
TRIM('x' FROM 'xxSQLxx')
AS T,
LTRIM('xyxSQL', 'xy') AS XY
FROM DUAL;
| L | R | T | XY |
|---|---|---|---|
| SQLxx | xxSQL | SQL | SQL |
TRIM은 지울 글자를 한 글자만 받아서, TRIM('xy' FROM 'xySQLxy')는 ORA-30001 오류입니다.
SELECT CEIL(-1.5) AS C,
FLOOR(-1.5) AS F,
TRUNC(-1.5) AS T,
MOD(7, 3) AS M
FROM DUAL;
| C | F | T | M |
|---|---|---|---|
| -1 | -2 | -1 | 1 |
SELECT TO_CHAR(ADD_MONTHS(
DATE '2026-01-31', 1),
'YYYY-MM-DD') AS A,
TO_CHAR(ADD_MONTHS(
DATE '2026-02-28', 1),
'YYYY-MM-DD') AS B,
MONTHS_BETWEEN(
DATE '2026-10-12',
DATE '2027-01-12') AS C
FROM DUAL;
| A | B | C |
|---|---|---|
| 2026-02-28 | 2026-03-31 | -3 |
A는 2월에 31일이 없어서, B는 2월 28일이 말일이라서 말일이 됩니다.
SELECT DATE '2026-12-25'
- DATE '2026-10-12'
AS DAYS,
TO_CHAR(
DATE '2026-10-12' + 1/24,
'HH24:MI') AS PLUS_1H,
EXTRACT(MONTH FROM
DATE '2026-10-12') AS MON
FROM DUAL;
| DAYS | PLUS_1H | MON |
|---|---|---|
| 74 | 01:00 | 10 |
SELECT TO_CHAR(
DATE '2026-10-12',
'YYYY.MM.DD') AS A,
TO_CHAR(1256.7, 'FM9999.00')
AS B,
TO_NUMBER('1,234', '9,999')
+ 1 AS C,
'10' + 1 AS D
FROM DUAL;
| A | B | C | D |
|---|---|---|---|
| 2026.10.12 | 1256.70 | 1235 | 11 |
- B:
9999.00은 소수 둘째 자리까지 0을 채우고,FM은 앞 공백을 없앱니다. - C: 쉼표가 든
'1,234'는 형식'9,999'로 읽어야 숫자가 됩니다.
시험 포인트
- 단일행 함수는 인자가 여럿이어도 행마다 결과가 하나이고, 겹쳐 쓰면 안쪽부터 계산합니다.
- 글자 자리는 1부터 세고 공백도 한 글자입니다.
LTRIM·RTRIM의 둘째 인자는 글자 묶음이고,TRIM에 두 글자를 주면 오류입니다. ROUND·TRUNC의 자리가 음수면 소수점 왼쪽에서 자릅니다. 음수의CEIL·FLOOR·TRUNC를 헷갈리게 냅니다.- 날짜 + 숫자는 날짜, 날짜 - 날짜는 일수, 날짜 + 날짜는 오류입니다.
ADD_MONTHS의 말일 규칙과MONTHS_BETWEEN의 인자 차례가 함정입니다. - 변환 방향을 바꿔 냅니다.
TO_CHAR는 날짜·숫자 → 문자,TO_DATE·TO_NUMBER는 문자 → 날짜·숫자입니다. - SQL Server는 SUBSTRING·LEN·CEILING·GETDATE()처럼 이름이 다릅니다.
확인 문제
1. 다음 쿼리의 결과 네 값은 무엇일까요?
SELECT ROUND(345.678, -1)
AS A,
TRUNC(345.678, 2) AS B,
CEIL(-2.3) AS C,
FLOOR(-2.3) AS D
FROM DUAL;
정답
| A | B | C | D |
|---|---|---|---|
| 350 | 345.67 | -2 | -3 |
- A: 자리 -1은 십의 자리까지 남기므로, 일의 자리 5에서 올려 350입니다.
- B: 소수 둘째 자리까지 남기고 8은 버립니다.
- C·D: -2.3에서 오른쪽 정수는 -2, 왼쪽 정수는 -3입니다.
2. 다음 쿼리의 결과 세 값은 무엇일까요?
SELECT SUBSTR(
'DATABASE', 3, 4) AS A,
LENGTH('DATA BASE') AS B,
INSTR('DATABASE', 'A') AS C
FROM DUAL;
정답
| A | B | C |
|---|---|---|
| TABA | 9 | 2 |
- A: 셋째 글자 T부터 네 글자입니다.
- B: 가운데 공백까지 9글자입니다.
- C: A는 둘째 글자에 처음 나옵니다.
3. 다음 쿼리의 결과 두 값은 무엇일까요?
SELECT TO_CHAR(ADD_MONTHS(
DATE '2026-10-31', 1),
'YYYY-MM-DD') AS A,
TO_DATE('20261101',
'YYYYMMDD')
- DATE '2026-10-12' AS B
FROM DUAL;
정답
| A | B |
|---|---|
| 2026-11-30 | 20 |
- A: 11월에는 31일이 없어서 11월의 말일입니다.
- B:
TO_DATE가 문자'20261101'을'YYYYMMDD'꼴로 읽어 날짜로 바꿉니다. 날짜끼리 빼면 일수라, 10월 12일에서 11월 1일까지 20일입니다.