본문으로 건너뛰기

단일행 함수

SQLD 목차SQL 기본레슨 14 / 35

목차

단일행 함수는 행마다 한 번씩 계산해 결과를 하나씩 돌려줍니다. 인자는 여러 개일 수 있습니다. 문자·숫자·날짜를 다루는 함수와, 값의 형(데이터 타입)을 바꾸는 변환 함수가 있습니다.

이름에서 성만 떼고, 금액을 반올림하고, 날짜에 석 달을 더하듯 저장된 값을 다듬어 보일 때 함수(function)를 씁니다. SUBSTR(ENAME, 1, 1)의 ENAME·1·1처럼 함수에 넘기는 값을 인자(argument)라 합니다. 여러 행을 값 하나로 줄이는 집계 함수(aggregate function)와 달리, 단일행 함수(single-row function)는 SELECT·WHERE·ORDER BY 어디에 써도 행마다 따로 계산합니다.

7단계 중 1단계. 단일행 함수는 인자가 여럿이어도 행마다 결과를 하나씩 돌려주므로, 6행이 들어가면 6행이 나옵니다.

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의 자리ROUNDTRUNC
11256.81256.7
012571256
-213001200

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는 같은 함수를 다른 이름으로 씁니다.

하는 일OracleSQL Server
자르기 · 글자 수SUBSTR · LENGTHSUBSTRING · LEN
올림 · 나머지CEIL · MODCEILING · %
코드의 글자CHRCHAR
지금 날짜와 시각SYSDATEGETDATE()
형 바꾸기TO_CHAR · TO_DATE · TO_NUMBER · CASTCAST · 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;
ABCD
DevDeveloperper6
SELECT LTRIM('xxSQLxx', 'x')
    AS L,
  RTRIM('xxSQLxx', 'x') AS R,
  TRIM('x' FROM 'xxSQLxx')
    AS T,
  LTRIM('xyxSQL', 'xy') AS XY
FROM DUAL;
LRTXY
SQLxxxxSQLSQLSQL

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;
CFTM
-1-2-11
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;
ABC
2026-02-282026-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;
DAYSPLUS_1HMON
7401:0010
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;
ABCD
2026.10.121256.70123511
  • 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;
정답
ABCD
350345.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;
정답
ABC
TABA92
  • 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;
정답
AB
2026-11-3020
  • A: 11월에는 31일이 없어서 11월의 말일입니다.
  • B: TO_DATE가 문자 '20261101'을 'YYYYMMDD' 꼴로 읽어 날짜로 바꿉니다. 날짜끼리 빼면 일수라, 10월 12일에서 11월 1일까지 20일입니다.

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

SQLD 목차로