Oracle SQL 함수 완전 정복: 필수 데이터 조작 가이드 🧙♂️
안녕하세요! 데이터를 다루는 데 있어 SQL 함수는 정말 강력한 도구입니다. 이번 포스팅에서는
Oracle 데이터베이스에서 데이터를 효율적으로 조작하고 분석하는 데 필수적인 SQL 함수들
을 예제와 함께 완벽하게 정리해 드릴게요.
1. SQL 함수란?
SQL 함수는 특정 작업을 수행하고 결과를 반환하는 데이터 처리의 기본 도구입니다. RDBMS마다 차이가 있지만, Oracle에서는 다양한 내장 함수를 통해 데이터를 가공하고 분석할 수 있습니다.
▶ 단일행 함수 (Single-Row Functions)
▶ 그룹 함수 (Group Functions) → 다음 포스팅에서 다룰 예정!
▶ 숫자 / 문자 / 날짜 / 기타 함수로도 분류 가능
2. 단일행 함수 (Single-Row Functions)
단일행 함수는 각 행에 대해 처리를 수행하고, 행 단위로 결과를 반환합니다. 즉, 행의 개수만큼 결과가 반환됩니다.
2.1 숫자 타입 함수
📌 CEIL (올림)
소수값을 가지는 컬럼에 대해 올림 처리된 정수값을 얻을 수 있습니다. 예를 들어, 92.1과 같은 소수도 CEIL을 적용하면 93이 됩니다.
SELECT stu_id, stu_name, CEIL(stu_avg) AS stu_avg
FROM stu_view;
| STU_ID | STU_NAME | STU_AVG |
|---|---|---|
| 2021001011 | 배순하 | 93 |
| 2021001009 | 정민기 | 91 |
| 2021001004 | 최진소 | 91 |
| 2021001003 | 이두원 | 90 |
| 2021001004 | 최진소 | 89 |
| 2021001008 | 이진화 | 89 |
| 2021001002 | 유인아 | 89 |
| 2021001004 | 최진소 | 87 |
📌 FLOOR (내림)
소수값을 가지는 컬럼에 대해 내림 처리된 정수값을 얻을 수 있습니다. 예를 들어, 92.9와 같은 소수도 FLOOR를 적용하면 92가 됩니다.
SELECT stu_id, stu_name, FLOOR(stu_avg) AS stu_avg
FROM stu_view;
| STU_ID | STU_NAME | STU_AVG |
|---|---|---|
| 2021001011 | 배순하 | 92 |
| 2021001009 | 정민기 | 91 |
| 2021001004 | 최진소 | 90 |
| 2021001003 | 이두원 | 89 |
| 2021001004 | 최진소 | 88 |
| 2021001008 | 이진화 | 88 |
| 2021001002 | 유인아 | 88 |
| 2021001004 | 최진소 | 87 |
📌 ROUND (반올림)
소수값을 가지는 컬럼에 대해 소수 몇째 자리에서 반올림한 값을 적용할 수 있습니다.
-- 소수 첫째 자리에서 반올림 (정수)
SELECT stu_id, stu_name, ROUND(stu_avg) AS stu_avg
FROM stu_view;
-- 소수 n째 자리에서 반올림
SELECT stu_id, stu_name, ROUND(stu_avg, 1) AS stu_avg_1, ROUND(stu_avg, 2) AS stu_avg_2
FROM stu_view;
📌 ABS (절댓값)
파라미터의 숫자값에 대해 절댓값(Absolute)을 적용해줍니다.
SELECT ABS(-30) AS abs_minus_30, ABS(15) AS abs_plus_15
FROM dual;
| ABS_MINUS_30 | ABS_PLUS_15 |
|---|---|
| 30 | 15 |
📌 MOD (나머지)
`MOD(m, n)` 형태로, $m$을 $n$으로 나누었을 때의 나머지 값을 리턴합니다.
SELECT MOD(10, 3) AS remainder
FROM dual;
| REMAINDER |
|---|
| 1 |
2.2 문자 타입 함수
📌 UPPER / LOWER
`UPPER`는 파라미터 내부 알파벳을 전부 대문자로 변환하고, `LOWER`는 전부 소문자로 변환시켜줍니다.
SELECT UPPER('SQLDeveloper') AS upper_case, LOWER('SQLDeveloper') AS lower_case
FROM dual;
| UPPER_CASE | LOWER_CASE |
|---|---|
| SQLDEVELOPER | sqldeveloper |
📌 REPLACE
문자열(VARCHAR2) 데이터에서 특정 문자를 변경할 수 있습니다.
SELECT REPLACE('재미없는 데이터베이스', '없', '있') AS replaceA
, REPLACE('데구이구터구베구이구스구 구수구업구', '구', '') AS replaceB
FROM dual;
| REPLACEA | REPLACEB |
|---|---|
| 재미있는 데이터베이스 | 데이터베이스 수업 |
📌 TRIM / LTRIM / RTRIM
문자열의 공백을 제거하는 함수들입니다.
- `LTRIM`: 문자열의 좌측에 존재하는 공백들 또는 지정한 문자를 제거합니다.
- `RTRIM`: 문자열의 우측에 존재하는 공백들 또는 지정한 문자를 제거합니다.
- `TRIM`: 문자열 좌, 우에 존재하는 공백들을 제거합니다.
SELECT REPLACE(' 공백을 제거하자!! ', ' ', '') AS replaceEx -- 공백을 전부 제거
, LTRIM(' 공백을 제거하자!! ') AS ltrimEx -- 좌측 공백 제거
, RTRIM(' 공백을 제거하자!! ') AS rtrimEx -- 우측 공백 제거
, TRIM(' 공백을 제거하자!! ') AS trimEx -- 좌우 공백 제거
FROM DUAL;
| REPLACEEX | LTRIMEX | RTRIMEX | TRIMEX |
|---|---|---|---|
| 공백을제거하자!! | 공백을 제거하자!! | 공백을 제거하자!! | 공백을 제거하자!! |
📌 SUBSTR (문자열 자르기)
문자열(VARCHAR2) 데이터에서 문자열을 자를 수 있습니다.
`SUBSTR(문자열, 인덱스, 길이)` 형태로, 해당 문자열의 인덱스부터 길이만큼 자른 문자열을 리턴합니다. Oracle 문자열 인덱스는 1부터 시작하며, 음수 인덱스는 문자열의 끝에서부터 카운트합니다.
SELECT SUBSTR('ABCDEFG', 1, 4) AS substr1 -- 'ABCDEFG'의 인덱스 1부터 4개만큼 선택 -> ABCD
, SUBSTR('ABCDEFG', 4, 3) AS substr2 -- 'ABCDEFG'의 인덱스 4부터 3개만큼 선택 -> DEF
, SUBSTR('ABCDEFG', -4, 2) AS substr3 -- 'ABCDEFG'의 뒤에서 4번째부터 2개만큼 선택 -> DE
, SUBSTR('ABCDEFG', -1, 2) AS substr4 -- 'ABCDEFG'의 뒤에서 1번째부터 2개만큼 선택 -> G (길이 2를 요청했지만 끝이 1자리라 G만 나옴)
, SUBSTR('ABCDEFG', 5) AS substr5 -- 'ABCDEFG'의 인덱스 5부터 끝까지 선택 -> EFG
FROM DUAL;
| SUBSTR1 | SUBSTR2 | SUBSTR3 | SUBSTR4 | SUBSTR5 |
|---|---|---|---|---|
| ABCD | DEF | DE | G | EFG |
📌 LPAD / RPAD (문자열 채우기)
숫자형 문자인 경우 문자 길이를 맞추는 경우가 있습니다.
`LPAD(문자열, 길이, 문자)`와 같은 형태로 `LPAD`는 왼쪽, `RPAD`는 오른쪽부터 주어진 길이만큼 지정한 문자를 채웁니다.
SELECT LPAD(9, 3, '0') AS lpad1 -- 9를 총 3자리로 만들고, 빈자리를 왼쪽에 '0'으로 채움 -> 009
, LPAD(31 , 3, '0') AS lpad2 -- 31을 총 3자리로 만들고, 빈자리를 왼쪽에 '0'으로 채움 -> 031
, RPAD(123, 5, '0') AS rpad1 -- 123을 총 5자리로 만들고, 빈자리를 오른쪽에 '0'으로 채움 -> 12300
, RPAD(12 , 5, '0') AS rpad2 -- 12를 총 5자리로 만들고, 빈자리를 오른쪽에 '0'으로 채움 -> 12000
FROM dual;
| LPAD1 | LPAD2 | RPAD1 | RPAD2 |
|---|---|---|---|
| 009 | 031 | 12300 | 12000 |
2.3 날짜 타입 함수
📌 TO_CHAR (날짜를 문자로 변환)
DATE 및 TIMESTAMP 타입의 날짜 데이터의 경우 출력되는 날짜의 형태(포맷)를 원하는 형태로 변경할 수 있습니다.
SELECT TO_CHAR(SYSDATE, 'YYYY/MM/DD HH24:MI:SS') AS dateA
, TO_CHAR(SYSDATE, 'YYYY.MM.DD AM HH:MI:SS') AS dateB
FROM dual;
| DATEA | DATEB |
|---|---|
| 2023/05/21 15:05:09 | 2023.05.21 오후 03:05:09 |
날짜 포맷 요소 예시:
- 세기 및 년도: `AD`, `BC`, `CC`, `YEAR`, `YYYY`, `YY`, `Y`
- 분기: `Q`
- 월: `MONTH`, `MON`, `MM`, `RM`
- 주차: `W`, `WW`, `IW`
- 일, 일차: `DDD`, `DD`, `D`, `J`
- 요일: `DAY`, `DY`, `D`
- 오전/오후: `AM`, `PM`, `A.M.`, `P.M.`
- 시간: `HH`, `HH12`, `HH24`
- 분: `MI`
- 초: `SS`, `SSSS` (자정 이후의 초 0 - 86399)
📌 TO_DATE / TO_TIMESTAMP (문자를 날짜 타입으로 변환)
VARCHAR2 타입으로 저장된 생년월일(예: 980713), 글작성일(예: 23/05/21 13:12) 등의 데이터를 날짜 타입으로 변경할 수 있습니다. 값의 날짜 형식에 대한 날짜 포맷을 정확히 맞춰주어야 합니다.
SELECT TO_DATE('980713', 'YYMMDD') AS dateA
, TO_TIMESTAMP('23/05/21 13:12', 'YY/MM/DD HH24:MI') AS dateB
FROM dual;
| DATEA | DATEB |
|---|---|
| 98/07/13 | 23/05/21 13:12:00.000000000 |
📌 날짜 연산 (`SYSDATE`, `ADD_MONTHS`)
DATE 및 TIMESTAMP 타입의 날짜 데이터에 N일 전/후, N달 전/후, N년 전/후 등의 날짜 연산을 할 수 있습니다. `SYSDATE`는 현재 날짜와 시간을 반환합니다.
-- 현재부터 N일 후/전 날짜
SELECT SYSDATE + 11 AS date_after_11_days
, SYSDATE - 7 AS date_before_7_days
FROM dual;
-- 현재부터 N달 후/전 날짜 (ADD_MONTHS)
SELECT ADD_MONTHS(SYSDATE, 3) AS date_after_3_months
, ADD_MONTHS(SYSDATE, -5) AS date_before_5_months
FROM dual;
-- 현재부터 N년 뒤 날짜 (ADD_MONTHS 함수를 이용하여 년도 계산)
SELECT ADD_MONTHS(SYSDATE, 2 * 12) AS date_after_2_years -- ADD_YEAR와 같은 함수는 없음
FROM dual;
2.4 기타 함수
📌 DUAL 테이블
`DUAL`은 하나의 행만을 포함하고 있는 테이블로, `FROM dual`을 이용하여 데이터베이스로부터 단일행 결과를 얻을 수 있습니다.
주로 현재 시간 확인, 함수 실행 결과 확인, WHERE 조건식 확인, 랜덤 값 생성 등에 사용됩니다.
SELECT SYSDATE FROM dual; -- 현재 시간 구하기
SELECT DBMS_RANDOM.VALUE FROM dual; -- 랜덤값 구하기 (0부터 1 사이의 랜덤 숫자 생성)
📌 DECODE (값 변환)
컬럼의 특정값을 다른 값으로 바꿔서 출력할 수 있습니다. `CASE`문과 유사한 용도로 사용됩니다.
`DECODE(컬럼, 값, 변환값)` 형태로 사용하며, 여러 개의 값에 대해 변환하려면 `DECODE(컬럼, 값1, 변환값1, 값2, 변환값2, ...)`와 같이 값과 변환값의 쌍을 추가해주면 됩니다.
SELECT bank_name
, DECODE(bank_year, null, 0, bank_year) AS bank_year -- bank_year 값이 null이면 0으로 변환, 그 외 나머지는 bank_year 값 유지
FROM bank;
| BANK_NAME | BANK_YEAR |
|---|---|
| 강잔웅 | 0 |
| 김나농 | 28 |
| 백성농 | 0 |
📌 NVL (NULL 값 처리)
컬럼에 존재하는 `null` 값에 대해 값을 변화시킬 수 있습니다.
`NVL(컬럼, 변환값)` 의 형태로, 컬럼에 저장된 데이터가 `null`값인 경우 변환값으로 변환하여 출력합니다.
SELECT bank_id
, bank_name
, bank_account
, bank_money
, NVL(bank_year, 0) AS bank_year -- bank_year가 null값인 경우 0으로 변경
FROM bank
WHERE bank_year IS NULL;
| BANK_ID | BANK_NAME | BANK_ACCOUNT | BANK_MONEY | BANK_YEAR |
|---|---|---|---|---|
| 730124-1429563 | 백성농 | 511-106103-10223-44 | 216570000 | 0 |
| 980026-2724068 | 이경호 | 837-4313-51044-32 | 422820000 | 0 |
- `WHERE bank_year IS NULL`: `bank_year`가 `null`인 데이터를 조회합니다.
- `WHERE bank_year IS NOT NULL`: `bank_year`가 `null`이 아닌 데이터를 조회합니다.
📌 NULLIF (특정 값 NULL로 변환)
컬럼 내 저장된 데이터가 특정값인 경우 `null`값으로 변환시킵니다.
`NULLIF(컬럼, 특정값)` 의 형태로, 컬럼에 저장된 데이터가 특정값인 경우 `null`값으로 변환하여 출력합니다.
SELECT NULLIF(100, 100) FROM dual; -- 100과 100이 같으므로 NULL 반환
SELECT NULLIF('A', 'B') FROM dual; -- 'A'와 'B'가 다르므로 'A' 반환
📌 DISTINCT (중복 제거)
컬럼 내 저장된 값에서 중복된 것이 있다면 하나만 조회되도록 합니다.
SELECT DISTINCT stu_name
FROM students;
| STU_NAME |
|---|
| 배순하 |
| 정민기 |
| 최진소 |
| 이두원 |
| 이진화 |
| 유인아 |
📚 마무리 정리
이 글에서는 Oracle SQL에서 가장 기본적이고 자주 사용하는 단일행 함수들을 예제와 함께 알아보았습니다. 실제 업무에서 데이터를 전처리하거나 보고서를 작성할 때 위 함수들을 적절히 조합하면 복잡한 로직도 간단하게 구현할 수 있습니다.
'Oracle' 카테고리의 다른 글
| Oracle.조인과 서브쿼리 (0) | 2025.05.31 |
|---|---|
| Oracle.그룹 쿼리와 집계함수 (1) | 2025.05.31 |
| Oracle.SQL기본(Table) (1) | 2025.05.31 |
| Oracle.데이터 베이스 객체 (0) | 2025.05.31 |
| Oracle.데이터 베이스 이해 (2) | 2025.05.25 |