Oracle(오라클)에서 제공하는 다양한 내장 함수들을 사용하면 복잡한 데이터 처리를 아주 간단하게 해결할 수 있습니다. 이번 포스트에서는 오라클 데이터베이스에서 가장 유용하고 실무에서 자주 사용되는 함수들을 알아보고, 실제 예제와 함께 어떻게 활용할 수 있는지 살펴보겠습니다.

 

1. 오라클 함수의 종류와 특징

오라클 데이터베이스에서 제공하는 함수는 크게 단일 행 함수(Single-Row Functions)와 그룹 함수(Group Functions)로 나눌 수 있습니다.

단일 행 함수(Single-Row Functions)

단일 행 함수는 쿼리에서 처리되는 각 행마다 하나의 결과를 반환합니다. 이러한 함수들은 SELECT 목록, WHERE 절, START WITH 및 CONNECT BY 절, 그리고 HAVING 절에서 사용될 수 있습니다.

단일 행 함수는 다음과 같은 유형으로 분류됩니다:

  • 숫자 함수(Numeric Functions): 숫자 입력을 받아 숫자 값을 반환합니다.
  • 문자 함수(Character Functions): 문자 입력을 받아 문자 또는 숫자 값을 반환합니다.
  • 날짜 함수(Date Functions): 날짜 타입의 입력을 받아 날짜 또는 숫자 값을 반환합니다.
  • 변환 함수(Conversion Functions): 한 형태의 값을 다른 형태로 변환합니다.

그룹 함수(Group Functions)

그룹 함수는 행 그룹에 대한 계산을 수행하여 그룹당 하나의 결과를 반환합니다. 이러한 함수들은 주로 GROUP BY 절과 함께 사용되어 데이터를 그룹화하고 요약하는 데 활용됩니다. 대표적인 그룹 함수로는 SUM, AVG, COUNT, MAX, MIN 등이 있습니다.

이제 각 함수 유형별로 가장 유용한 함수들을 자세히 살펴보겠습니다.

 

2. 숫자 함수(Numeric Functions)

숫자 함수는 수학적 연산을 수행하기 위한 함수들로, 숫자 데이터를 처리할 때 매우 유용합니다.

ABS(n)

절대값을 반환하는 함수입니다.

SELECT ABS(-15) AS "절대값" FROM DUAL;

결과: 15

ROUND(n [, integer])

지정된 소수점 자릿수로 반올림합니다.

SELECT ROUND(15.193, 1) AS "반올림" FROM DUAL;

결과: 15.2

TRUNC(n [, integer])

지정된 소수점 자릿수로 버림합니다.

SELECT TRUNC(15.193, 1) AS "버림" FROM DUAL;

결과: 15.1

MOD(m, n)

m을 n으로 나눈 나머지를 반환합니다.

SELECT MOD(10, 3) AS "나머지" FROM DUAL;

결과: 1

POWER(m, n)

m의 n승을 계산합니다.

SELECT POWER(2, 3) AS "2의 3승" FROM DUAL;

결과: 8

SQRT(n)

제곱근을 계산합니다.

SELECT SQRT(16) AS "제곱근" FROM DUAL;

결과: 4

실무에서는 이러한 숫자 함수를 활용하여 재고 수량, 금액 계산, 통계 처리 등 다양한 수치 계산을 효율적으로 수행할 수 있습니다.

 

3. 문자 함수(Character Functions)

문자 함수는 텍스트 데이터를 조작하는 데 사용됩니다. 문자열 추출, 변환, 검색 등의 작업에 유용합니다.

SUBSTR(char, position [, length])

문자열의 일부를 추출합니다.

SELECT SUBSTR('Hello World', 1, 5) AS "부분 문자열" FROM DUAL;

결과: Hello

이 함수는 문자열(char)에서 지정된 위치(position)부터 시작하여 지정된 길이(length)만큼의 부분 문자열을 반환합니다. 시작 위치는 1부터 시작하며, 길이를 생략하면 문자열의 끝까지 반환합니다.

-- 문자열 끝에서부터 추출 (음수 위치 사용)
SELECT SUBSTR('Hello World', -5) AS "끝에서부터" FROM DUAL;

결과: World

INSTR(string, substring [, position [, occurrence]])

문자열 내에서 특정 부분 문자열의 위치를 찾습니다.

SELECT INSTR('Hello World', 'o') AS "위치" FROM DUAL;

결과: 5 (첫 번째 ‘o’의 위치)

SELECT INSTR('Hello World', 'o', 6) AS "두 번째 o의 위치" FROM DUAL;

결과: 8 (6번째 위치 이후의 첫 ‘o’의 위치)

REPLACE(string, search_string [, replacement_string])

문자열 내의 특정 부분을 다른 문자열로 대체합니다.

SELECT REPLACE('Hello World', 'World', 'Oracle') AS "변경 결과" FROM DUAL;

결과: Hello Oracle

UPPER(char), LOWER(char), INITCAP(char)

문자열을 대문자, 소문자 또는 첫 글자만 대문자로 변환합니다.

SELECT 
    UPPER('hello world') AS "대문자",
    LOWER('HELLO WORLD') AS "소문자",
    INITCAP('hello world') AS "첫글자 대문자"
FROM DUAL;

결과:

  • 대문자: HELLO WORLD
  • 소문자: hello world
  • 첫글자 대문자: Hello World

TRIM([LEADING|TRAILING|BOTH] [trim_character FROM] string)

문자열의 양쪽, 앞쪽 또는 뒤쪽에서 지정된 문자를 제거합니다.

SELECT 
    TRIM(' Hello World ') AS "양쪽 공백 제거",
    TRIM(LEADING '0' FROM '00123') AS "앞쪽 0 제거"
FROM DUAL;

결과:

  • 양쪽 공백 제거: Hello World
  • 앞쪽 0 제거: 123

CONCAT(string1, string2)

두 문자열을 연결합니다. || 연산자와 동일한 기능을 합니다.

SELECT 
    CONCAT('Hello', ' World') AS "연결1",
    'Hello' || ' World' AS "연결2"
FROM DUAL;

결과:

  • 연결1: Hello World
  • 연결2: Hello World

LENGTH(char)

문자열의 길이를 반환합니다.

SELECT LENGTH('Hello World') AS "길이" FROM DUAL;

결과: 11

실무 응용 예시: 이메일 도메인 추출하기

SELECT 
    email,
    SUBSTR(email, INSTR(email, '@') + 1) AS domain
FROM employees
WHERE INSTR(email, '@') > 0;

이 쿼리는 이메일 주소에서 @ 기호 이후의 도메인 부분을 추출합니다.

 

4. 날짜 함수(Date Functions)

오라클에서 날짜와 시간을 처리하는 함수들은 데이터 분석, 리포팅 등에서 매우 중요합니다.

SYSDATE

현재 날짜와 시간을 반환합니다.

SELECT SYSDATE AS "현재 날짜/시간" FROM DUAL;

결과: 2025-05-20 14:30:25 (실행 시점의 날짜와 시간)

ADD_MONTHS(date, integer)

지정된 날짜에 개월 수를 더합니다.

SELECT 
    SYSDATE AS "현재 날짜",
    ADD_MONTHS(SYSDATE, 3) AS "3개월 후"
FROM DUAL;

MONTHS_BETWEEN(date1, date2)

두 날짜 사이의 개월 수를 반환합니다.

SELECT MONTHS_BETWEEN(
    TO_DATE('2025-05-20', 'YYYY-MM-DD'),
    TO_DATE('2024-12-20', 'YYYY-MM-DD')
) AS "개월 차이"
FROM DUAL;

결과: 5

LAST_DAY(date)

지정된 날짜가 속한 월의 마지막 날짜를 반환합니다.

SELECT LAST_DAY(TO_DATE('2025-02-10', 'YYYY-MM-DD')) AS "2월 마지막 날" FROM DUAL;

결과: 2025-02-28

NEXT_DAY(date, char)

지정된 날짜 이후 가장 가까운 지정된 요일의 날짜를 반환합니다.

SELECT NEXT_DAY(SYSDATE, '금요일') AS "다음 금요일" FROM DUAL;

EXTRACT(datetime_field FROM datetime)

날짜에서 연, 월, 일 등의 특정 부분을 추출합니다.

SELECT 
    EXTRACT(YEAR FROM SYSDATE) AS "년도",
    EXTRACT(MONTH FROM SYSDATE) AS "월",
    EXTRACT(DAY FROM SYSDATE) AS "일"
FROM DUAL;

실무 응용 예시: 분기별 매출 계산하기

SELECT 
    TO_CHAR(sale_date, 'YYYY') AS "년도",
    TO_CHAR(sale_date, 'Q') AS "분기",
    SUM(amount) AS "총 매출"
FROM sales
GROUP BY TO_CHAR(sale_date, 'YYYY'), TO_CHAR(sale_date, 'Q')
ORDER BY 1, 2;

이 쿼리는 매출 데이터를 연도와 분기별로 그룹화하여 총 매출을 계산합니다.

 

5. 변환 함수(Conversion Functions)

데이터 타입을 변환하는 함수들은 다양한 데이터 타입 간의 호환성을 확보하고, 데이터를 원하는 형식으로 출력하는 데 사용됩니다.

TO_CHAR(date|number [, format])

날짜나 숫자를 지정된 형식의 문자열로 변환합니다.

-- 날짜를 문자열로 변환
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS "날짜 형식" FROM DUAL;

결과: 2025-05-20 14:30:25

-- 숫자를 문자열로 변환
SELECT TO_CHAR(1234.56, '9,999.99') AS "숫자 형식" FROM DUAL;

결과: 1,234.56

TO_DATE(char [, format])

문자열을 날짜로 변환합니다.

SELECT TO_DATE('2025-05-20', 'YYYY-MM-DD') AS "문자열에서 날짜로" FROM DUAL;

TO_DATE 함수는 특히 문자열 형태로 저장된 날짜 데이터를 날짜 타입으로 변환하여 날짜 연산을 수행할 때 매우 유용합니다. 다양한 날짜 형식을 지원하므로 여러 형태의 날짜 문자열을 처리할 수 있습니다.

-- 다양한 형식의 날짜 문자열 변환
SELECT 
    TO_DATE('20-MAY-2025', 'DD-MON-YYYY') AS "형식1",
    TO_DATE('05/20/2025', 'MM/DD/YYYY') AS "형식2",
    TO_DATE('20250520', 'YYYYMMDD') AS "형식3"
FROM DUAL;

TO_NUMBER(char [, format])

문자열을 숫자로 변환합니다.

SELECT TO_NUMBER('1,234.56', '9,999.99') AS "문자열에서 숫자로" FROM DUAL;

결과: 1234.56

NVL(expr1, expr2)

expr1이 NULL이면 expr2를 반환하고, 그렇지 않으면 expr1을 반환합니다.

SELECT 
    employee_id,
    NVL(commission_pct, 0) AS "커미션(NULL이면 0)"
FROM employees;

DECODE(expr, search1, result1 [, search2, result2]… [, default])

expr과 search 값을 비교하여 일치하는 경우 해당 result를 반환합니다. 일치하는 값이 없으면 default를 반환합니다.

SELECT 
    employee_id,
    DECODE(department_id, 
           10, 'Administration',
           20, 'Marketing',
           30, 'Purchasing',
           'Other') AS "부서명"
FROM employees;

CASE 표현식

DECODE보다 유연한 조건부 로직을 구현할 수 있습니다.

SELECT 
    employee_id,
    CASE 
        WHEN salary < 5000 THEN 'Low'
        WHEN salary BETWEEN 5000 AND 10000 THEN 'Medium'
        ELSE 'High'
    END AS "급여 등급"
FROM employees;

실무 응용 예시: 데이터 정제 및 형식 통일

-- 다양한 형식의 전화번호를 표준 형식으로 정리
SELECT 
    phone_number,
    CASE 
        WHEN REGEXP_LIKE(phone_number, '^[0-9]{3}-[0-9]{3}-[0-9]{4}$') THEN phone_number
        WHEN REGEXP_LIKE(phone_number, '^[0-9]{10}$') THEN 
            SUBSTR(phone_number, 1, 3) || '-' || 
            SUBSTR(phone_number, 4, 3) || '-' || 
            SUBSTR(phone_number, 7)
        ELSE 'Invalid Format'
    END AS "표준화된 전화번호"
FROM contacts;

이 쿼리는 다양한 형식으로 저장된 전화번호를 표준 형식(XXX-XXX-XXXX)으로 변환합니다.

 

6. 집계 함수(Aggregate Functions)

집계 함수는 행 그룹을 기반으로 하나의 결과 행을 반환합니다. 주로 GROUP BY 절과 함께 사용됩니다.

COUNT(expr)

지정된 표현식이 NULL이 아닌 행의 수를 반환합니다.

-- 부서별 직원 수 계산
SELECT 
    department_id,
    COUNT(*) AS "직원 수"
FROM employees
GROUP BY department_id
ORDER BY department_id;

SUM(expr)

지정된 표현식의 합계를 계산합니다.

-- 부서별 급여 총액 계산
SELECT 
    department_id,
    SUM(salary) AS "급여 총액"
FROM employees
GROUP BY department_id
ORDER BY department_id;

AVG(expr)

지정된 표현식의 평균값을 계산합니다.

-- 부서별 평균 급여 계산
SELECT 
    department_id,
    ROUND(AVG(salary), 2) AS "평균 급여"
FROM employees
GROUP BY department_id
ORDER BY department_id;

MAX(expr), MIN(expr)

지정된 표현식의 최대값과 최소값을 반환합니다.

-- 부서별 최대/최소 급여 계산
SELECT 
    department_id,
    MAX(salary) AS "최대 급여",
    MIN(salary) AS "최소 급여"
FROM employees
GROUP BY department_id
ORDER BY department_id;

LISTAGG(measure_expr [, delimiter]) WITHIN GROUP (order_by_clause)

그룹 내의 행 값을 연결하여 하나의 문자열로 반환합니다.

-- 부서별 직원 이름 목록 생성
SELECT 
    department_id,
    LISTAGG(first_name || ' ' || last_name, ', ') 
        WITHIN GROUP (ORDER BY first_name) AS "직원 목록"
FROM employees
GROUP BY department_id
ORDER BY department_id;

실무 응용 예시: 사업부별 분기 매출 요약 보고서

SELECT 
    d.division_name,
    TO_CHAR(s.sale_date, 'YYYY') AS "연도",
    TO_CHAR(s.sale_date, 'Q') AS "분기",
    COUNT(DISTINCT s.customer_id) AS "고객 수",
    SUM(s.amount) AS "총 매출",
    ROUND(AVG(s.amount), 2) AS "평균 거래액",
    MAX(s.amount) AS "최대 거래액"
FROM 
    sales s
JOIN 
    departments d ON s.department_id = d.department_id
GROUP BY 
    d.division_name,
    TO_CHAR(s.sale_date, 'YYYY'),
    TO_CHAR(s.sale_date, 'Q')
ORDER BY 
    d.division_name,
    "연도",
    "분기";

이 쿼리는 사업부별로 연도와 분기에 따른 고객 수, 총 매출, 평균 거래액, 최대 거래액을 계산하여 종합적인 매출 보고서를 생성합니다.

 

7. 분석 함수(Analytic Functions)

분석 함수는 행 그룹에 대한 계산을 수행하지만 집계 함수와 달리 각 행에 대한 결과를 반환하여 더 복잡한 분석이 가능합니다.

ROW_NUMBER() OVER (partition_by_clause order_by_clause)

결과 집합의 각 파티션 내에서 행에 일련번호를 할당합니다.

-- 부서별로 급여가 높은 순서대로 순위 매기기
SELECT 
    employee_id,
    department_id,
    salary,
    ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS "부서 내 급여 순위"
FROM employees
ORDER BY department_id, "부서 내 급여 순위";

RANK() OVER (partition_by_clause order_by_clause)

동일한 값을 가진 행에 동일한 순위를 부여합니다. 다음 순위는 동일한 순위의 행 수만큼 건너뜁니다.

-- 부서별 급여 순위 (동일 급여는 동일 순위)
SELECT 
    employee_id,
    department_id,
    salary,
    RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS "부서 내 급여 순위"
FROM employees
ORDER BY department_id, "부서 내 급여 순위";

DENSE_RANK() OVER (partition_by_clause order_by_clause)

동일한 값을 가진 행에 동일한 순위를 부여하지만, 다음 순위는 건너뛰지 않습니다.

-- 부서별 급여 순위 (동일 급여는 동일 순위, 순위 건너뛰기 없음)
SELECT 
    employee_id,
    department_id,
    salary,
    DENSE_RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS "부서 내 급여 순위"
FROM employees
ORDER BY department_id, "부서 내 급여 순위";

LEAD(expr [, offset [, default]]) OVER (partition_by_clause order_by_clause)

현재 행 기준으로 지정된 오프셋만큼 뒤에 있는 행의 값을 반환합니다.

-- 각 직원의 급여와 같은 부서 내 다음으로 급여가 높은 직원의 급여 차이 계산
SELECT 
    employee_id,
    department_id,
    salary,
    LEAD(salary, 1, salary) OVER (PARTITION BY department_id ORDER BY salary DESC) AS "다음 순위 급여",
    salary - LEAD(salary, 1, salary) OVER (PARTITION BY department_id ORDER BY salary DESC) AS "급여 차이"
FROM employees
ORDER BY department_id, salary DESC;

LAG(expr [, offset [, default]]) OVER (partition_by_clause order_by_clause)

현재 행 기준으로 지정된 오프셋만큼 앞에 있는 행의 값을 반환합니다.

-- 각 직원의 급여와 전년도 급여를 비교하여 인상률 계산
SELECT 
    employee_id,
    hire_date,
    salary,
    LAG(salary, 1, 0) OVER (PARTITION BY employee_id ORDER BY hire_date) AS "이전 급여",
    CASE 
        WHEN LAG(salary, 1, 0) OVER (PARTITION BY employee_id ORDER BY hire_date) = 0 THEN NULL
        ELSE ROUND((salary - LAG(salary, 1, 0) OVER (PARTITION BY employee_id ORDER BY hire_date)) / 
             LAG(salary, 1, 0) OVER (PARTITION BY employee_id ORDER BY hire_date) * 100, 2)
    END AS "인상률(%)"
FROM employee_salary_history
ORDER BY employee_id, hire_date;

실무 응용 예시: 매출 성장률 분석

SELECT 
    TO_CHAR(sale_date, 'YYYY-MM') AS "월",
    SUM(amount) AS "월 매출",
    LAG(SUM(amount), 1) OVER (ORDER BY TO_CHAR(sale_date, 'YYYY-MM')) AS "전월 매출",
    CASE 
        WHEN LAG(SUM(amount), 1) OVER (ORDER BY TO_CHAR(sale_date, 'YYYY-MM')) IS NULL THEN NULL
        ELSE ROUND((SUM(amount) - LAG(SUM(amount), 1) OVER (ORDER BY TO_CHAR(sale_date, 'YYYY-MM'))) / 
             LAG(SUM(amount), 1) OVER (ORDER BY TO_CHAR(sale_date, 'YYYY-MM')) * 100, 2)
    END AS "전월 대비 성장률(%)"
FROM sales
GROUP BY TO_CHAR(sale_date, 'YYYY-MM')
ORDER BY "월";

이 쿼리는 월별 매출을 집계하고, 전월 대비 성장률을 계산하여 시간에 따른 매출 추세를 분석합니다.

 

8. 자주 사용되는 함수 조합

실제 업무 환경에서는 종종 여러 함수를 함께 사용하여 복잡한 데이터 처리를 수행합니다. 다음은 몇 가지 실용적인 예제입니다.

데이터 정제 및 표준화

-- 이름 표준화 (앞뒤 공백 제거, 첫 글자만 대문자로)
UPDATE customers
SET 
    first_name = INITCAP(TRIM(first_name)),
    last_name = INITCAP(TRIM(last_name));

-- 이메일 주소에서 도메인별 고객 수 계산
SELECT 
    LOWER(SUBSTR(email, INSTR(email, '@') + 1)) AS "이메일 도메인",
    COUNT(*) AS "고객 수"
FROM customers
GROUP BY LOWER(SUBSTR(email, INSTR(email, '@') + 1))
ORDER BY "고객 수" DESC;

날짜 범위 쿼리 최적화

-- 특정 월의 모든 거래 조회 (인덱스 활용을 위한 최적화)
SELECT *
FROM transactions
WHERE 
    transaction_date >= TRUNC(TO_DATE('2025-05-01', 'YYYY-MM-DD'), 'MM')
    AND transaction_date < ADD_MONTHS(TRUNC(TO_DATE('2025-05-01', 'YYYY-MM-DD'), 'MM'), 1);

이 쿼리는 TRUNC 함수를 사용하여 지정된 날짜의 월의 첫날을 찾고, ADD_MONTHS 함수를 사용하여 다음 달의 첫날을 계산합니다. 이 방식은 날짜 인덱스를 효율적으로 활용할 수 있습니다.

누적 합계 계산

-- 월별 누적 매출 계산
SELECT 
    TO_CHAR(sale_date, 'YYYY-MM') AS "월",
    SUM(amount) AS "월 매출",
    SUM(SUM(amount)) OVER (ORDER BY TO_CHAR(sale_date, 'YYYY-MM') 
        ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS "누적 매출"
FROM sales
GROUP BY TO_CHAR(sale_date, 'YYYY-MM')
ORDER BY "월";

복잡한 문자열 파싱

-- 쉼표로 구분된 태그 목록에서 특정 태그가 있는 제품 찾기
SELECT product_id, product_name, tags
FROM products
WHERE 
    REGEXP_LIKE(tags, '(^|,)discount($|,)')
    OR INSTR(',' || tags || ',', ',discount,') > 0;

이 쿼리는 제품 태그 목록에서 ‘discount’ 태그가 포함된 제품을 찾습니다. REGEXP_LIKE 함수는 정규 표현식을 사용하여 태그 목록의 시작, 중간 또는 끝에 있는 태그를 찾습니다.

피벗 쿼리(데이터 행을 열로 변환)

-- 분기별 부서 매출을 피벗 테이블로 표시
SELECT 
    department_id,
    SUM(DECODE(TO_CHAR(sale_date, 'Q'), '1', amount, 0)) AS "Q1",
    SUM(DECODE(TO_CHAR(sale_date, 'Q'), '2', amount, 0)) AS "Q2",
    SUM(DECODE(TO_CHAR(sale_date, 'Q'), '3', amount, 0)) AS "Q3",
    SUM(DECODE(TO_CHAR(sale_date, 'Q'), '4', amount, 0)) AS "Q4",
    SUM(amount) AS "연간 총액"
FROM sales
WHERE TO_CHAR(sale_date, 'YYYY') = '2025'
GROUP BY department_id
ORDER BY department_id;

이 쿼리는 DECODE 함수를 사용하여 행 형태의 매출 데이터를 분기별 열로 변환하는 피벗 테이블을 생성합니다.

 

9. 함수 사용 시 성능 고려사항

오라클 함수를 효율적으로 사용하기 위해 고려해야 할 성능 관련 팁을 알아봅시다.

인덱스 활용 제한

함수는 열에 직접 적용되면 해당 열의 인덱스 사용을 방해할 수 있습니다. 예를 들어:

-- 인덱스를 사용하지 못하는 쿼리
SELECT * FROM employees WHERE UPPER(last_name) = 'SMITH';

-- 인덱스를 사용할 수 있는 대안
SELECT * FROM employees WHERE last_name = UPPER('smith');

두 번째 쿼리에서는 함수가 상수에 적용되므로 인덱스를 활용할 수 있습니다.

함수 기반 인덱스 고려

자주 사용되는 함수 표현식에는 함수 기반 인덱스를 생성하는 것이 좋습니다.

-- 함수 기반 인덱스 생성
CREATE INDEX idx_upper_last_name ON employees (UPPER(last_name));

-- 이제 이 쿼리가 인덱스를 활용할 수 있습니다
SELECT * FROM employees WHERE UPPER(last_name) = 'SMITH';

묵시적 변환 피하기

데이터 타입의 묵시적 변환은 성능에 영향을 줄 수 있습니다. 명시적 변환 함수를 사용하여 의도를 명확히 하고 성능을 개선하세요.

-- 묵시적 변환(권장하지 않음)
SELECT * FROM employees WHERE hire_date = '01-JAN-2023';

-- 명시적 변환(권장)
SELECT * FROM employees WHERE hire_date = TO_DATE('01-JAN-2023', 'DD-MON-YYYY');

복잡한 연산 최소화

많은 행에 대해 복잡한 함수 연산을 수행하면 성능이 저하될 수 있습니다. 가능한 경우 계산 결과를 미리 저장하거나 최적화된 쿼리를 사용하세요.

-- 계산 결과를 저장하는 뷰 생성
CREATE OR REPLACE VIEW employee_details AS
SELECT 
    employee_id,
    first_name,
    last_name,
    salary,
    commission_pct,
    salary * (1 + NVL(commission_pct, 0)) AS total_compensation
FROM employees;

-- 이후 이 뷰를 사용하여 빠르게 조회
SELECT * FROM employee_details WHERE total_compensation > 10000;

 

오라클 SQL 함수는 데이터베이스 개발과 관리에 있어 필수적입니다. 하지만 함수 사용 시 성능 영향을 항상 고려해야 합니다. 특히 대용량 데이터를 다루는 환경에서는 함수의 효율적인 활용이 시스템 성능에 큰 영향을 미칠 수 있습니다.  이 포스트를 통하여 오라클 SQL 함수 활용 능력을 향상시키는 데 조금 이나마 도움이 되셨으면 합니다. 🙂

 

댓글 남기기