본문 바로가기
DB

[DB / Oracle] Chapter 8. SQL 함수

by nyeoo 2023. 11. 28.

- SQL 함수 : SELECT 절, WHERE 절, UPDATE 절 등에서 사용가능

1. 단일행 함수

▶ 숫자 함수

함수 기능 사용 예
SIN, COS, TAN 삼각함수(싸인, 코싸인, 탄젠트 결과값을 반환) SIN(1), COS(1), TAN(1)
ASIN, ACOS, ATAN 삼각함수의 역함수(범위 : -1 ~ 1) ASIN(0.5), ACOS(0.5), ATAN(0.5)
ROUND(숫자, n) n 자리를 기준으로 반올림을 처리해주는 함수 ROUND(48.678, 2) → 소수점 이하 둘(두번째 파라미터 값)째자리까지 표현 / ROUND(48.674, 0) → 정수로 표현(0은 생략가능) / ROUND(48.674, -1) → 10의 자리까지 표현
TRUNC 절삭으로 처리해 주는 함수(버림) ROUND 함수와 사용방법 동일함
MOD 나머지를 반환하는 함수 MOD(5,2) → 5를 2로 나눈 나머지 반환
POWER(숫자, n) n제곱한 결과를 반환하는 함수 POWER(5,3) → 5의 3승을 결과값으로 반환
SQRT n제곱근 결과값을 반환하는 함수 SQRT(2) → 루트 2에 대한 결과값 반환
LOG(m,n) 밑을 m으로 한 n의 로그 값을 반환 LOG(10,20)
LN 자연 로그 함수로 밑수가 e인 로그 함수 LN(95)
SIGN 연산 결과값이 양수이면 1, 0이면 0, 음수면 -1 반환하는 함수. ※매출이나 수지와 관련하여 적자 및 흑자의 개념을 나타낼 때 종종 사용 SIGN(5-2)

▶ 문자 함수

함수 기능 사용 예
ASCII 매개변수로 넘겨받은 문자 → 아스키코드값 반환 ASCII('A')
CHR 매개변수로 넘겨받은 아스키코드값 → 문자 반환 CHR(65)
CONCAT(s1, s2) 문자열 기반으로 데이터 결합을 수행하는 함수. 2개의 문자열만 결합가능. 내부적으로 숫자나 날짜를 문자로 변환해주는 과정이 포함되어 있음(최종적으로 문자형태로 결합) CONCAT(ENAME, JOB,DEPTNO) / CONCAT(’배가’,’고프다’ )
LOWER 모두 소문자로 반환 LOWER('oRaCLe')
UPPER 모두 대문자로 반환 UPPER('oRaCLe')
INITCAP 첫 글자만 대문자로 하고 나머지는 모두 소문자로 변환하여 반환 INITCAP('oRaCLe')
LPAD(s,n,c) Byte 를 확보하여 왼쪽부터 문자로 채우는 기능을 가진 함수 LPAD('ORACLE',10,'*') → 10Byte 공간 확보 후 ORACLE 문자열을 담고 남아있는 Byte 공간을 세 번째 파라미터 값으로 왼쪽부터 채움
RPAD(s,n,c) Byte 를 확보하여 오른쪽부터 문자로 채우는 기능을 가진 함수 RPAD('ORACLE',10,'*') → 10Byte 공간 확보 후 ORACLE 문자열을 담고 남아있는 Byte 공간을 세 번째 파라미터 값으로 오른쪽부터 채움
LTRIM(s1,s2) 대상 문자열(s1)의 왼쪽부터 지정한 문자를 제거하여 반환. 대소문자 구분하며, 공백을 제거하는 함수로 많이 사용함 LTRIM('AAAAORACLEORACLE', 'ORA') = CLEORACLE
RTRIM(s1,s2) 대상 문자열(s1)의 오른쪽부터 지정한 문자를 제거하여 반환 LTRIM 함수와 사용방법 동일함
TRIM(c FROM s) 대상 문자열(s)의 양쪽에서 지정된 문자를 삭제. 파라미터 값으로 문자열만 넣으면 양쪽 공백 제거 TRIM(' TEST ')
TRANSLATE 1:1 로 바꿔줌 ('010-9322-9543','0123456789','공일이삼사오육칠팔구') = 공일공-구삼이이-구오사삼
REPLACE(s1, s2, s3) 두 번째 파라미터 값이 있으면 세 번째 파라미터 값으로 바꿈 REPLACE('MY ORACLE SERVER ORAHOME', 'ORA', '오라') = MY 오라CLE SERVER 오라HOME
SUBSTR 문자열을 추출하는 기능을 가진 함수. 첫 번째 파라미터 값은 대상 문자열, 두 번째 파라미터 값은 추출을 시작하는 위치(인덱스의 처음은 1), 세 번째 파라미터 값은 추출할 문자열의 갯수(생략시 끝까지) SUBSTR(ENAME, 1, 2)
SUBSTRB STBSTR 함수와 기능은 동일하나, 바이트 기반 STBSTR 함수와 사용방법 동일
LENGTH 글자 수 반환 LENGTH(ENAME)
LENGTHB 바이트 수 반환 LENGTHB(ENAME)
INSTR(s1, s2, n, k) 대상 문자열에서 해당 문자열이 나타나는 위치 반환. 첫 번째 파라미터 값은 대상문자열, 두 번째 파라미터 값은 해당 문자열, 세 번째 파라미터 값은 찾기 시작하는 위치, 네 번째 파라미터 값은 몇 번째 등장하는 값을 찾을 것인지에 대한 설정(값을 1로 설정할 경우 생략 가능) INSTR('ORACLE ORAHOME BIORA', 'ORA', 2, 1) = 8
REVERSE 대상 문자열을 거꾸로 반환. 단, 한글은 제외(사용불가) REVERSE('ORACLE')

▶ 날짜, 시간 함수

함수 기능 사용 예
ADD_MONTHS 개월 수를 더하거나 빼주는 함수 ADD_MONTHS(SYSDATE,2) → 현재시간에서 2개월 후
MONTHS_BETWEEN 첫 번째 인자값에서 두 번째 인자값을 뺀 개월 수를 반환. 반환된 값이 음수, 양수이냐에 따라 과거, 미래를 알 수 있음 MONTHS_BETWEEN(SYSDATE, TO_DATE('2002-05-31', 'YYYY-MM-DD'))
NEXT_DAY 첫번째 파라미터 값을 기준으로 가장 빠르게 돌아오는 요일 반환. 오라클안에 기본 세션 설정에서 국가 설정이 다르면 에러나는 경우가 있음. ALTER SESSION SET NLS_DATE_LANGUAGE = 'KOREAN'; NEXT_DAY(SYSDATE,'토')
LAST_DAY 해당 날짜가 포함되어 있는 그 달의 마지막 날을 반환 LAST_DAY(SYSDATE)
ROUND(DATE) 날짜 반올림하여 반환 ROUND(SYSDATE, 'YEAR') → 연도까지 반올림(상반기, 하반기 기준) / ROUND(SYSDATE, 'MONTH') → 월까지 반올림(15일 기준) / ROUND(SYSDATE, 'DD') → 일까지 반올림(정오 기준) / ROUND(SYSDATE, 'DAY') → 일까지 반올림(수요일 정오 기준)
TRUNC(DATE) 날짜 버림하여 반환 TRUNC(SYSDATE, 'YEAR') → 연도까지 버림 / TRUNC(SYSDATE, 'MONTH') → 월까지 버림 / TRUNC(SYSDATE, 'DD') → 일까지 버림 / TRUNC(SYSDATE, 'DAY') → 일까지 버림
EXTRACT 연도, 월, 일을 추출하여 숫자타입으로 반환 EXTRACT(YEAR FROM SYSDATE), EXTRACT(MONTH FROM SYSDATE), EXTRACT(DAY FROM SYSDATE)
TO_CHAR 연도, 월, 일을 추출하여 문자타입으로 반환 TO_CHAR(SYSDATE, 'YYYY'), TO_CHAR(SYSDATE, 'MM'), TO_CHAR(SYSDATE, 'DD')
TO_YMINTERVAL 연부터 월까지의 간격 SYSDATE + TO_YMINTERVAL('01-02') = 1년 2개월 후의 날짜
TO_DSINTERVAL 일부터 초까지의 간격 SYSDATE + TO_DSINTERVAL('003 04:05:06') = 3일 4시간 5분 6초 후의 날짜
SYSDATE 현재 날짜(시간)을 반환 SYSDATE

▶ 변환함수

함수 기능
TO_CHAR 숫자나 날짜 데이터를 문자 타입으로 변환시켜주는 함수
TO_DATE 문자 데이터를 날짜 타입으로 변환시켜주는 함수
TO_NUMBER 문자 데이터를 숫자 타입으로 변환시켜주는 함수

▷ TO_CHAR 활용

· 형식 맞춤 표기 결과값 반환

SELECT TO_CHAR(60000, '99,999') "COL2"
, TO_CHAR(60000, '$99,999') "COL3"
, TO_CHAR(60000, 'L99,999') "COL4"        --> L : 어떤 통화가 들어갈지 모르는 영역을 비워둔 것
, LTRIM(TO_CHAR(60000, 'L99,999')) "COL4" --> (보통 왼쪽에 들어간 공백을 제거하고 조회함)
FROM DUAL;
--==>>
/*
 60,000
 $60,000
        ₩60,000
₩60,000
*/

 

·  날짜형 → 문자형

SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') "COL1"    -- 2023-10-23
      ,TO_CHAR(SYSDATE, 'YYYY') "COL2"          -- 2023
      ,TO_CHAR(SYSDATE, 'YEAR') "COL3"          -- TWENTY TWENTY-THREE
      ,TO_CHAR(SYSDATE, 'MM') "COL4"            -- 10
      ,TO_CHAR(SYSDATE, 'MONTH') "COL5"         -- 10월
      ,TO_CHAR(SYSDATE, 'MON') "COL6"           -- 10월
      ,TO_CHAR(SYSDATE, 'DD') "COL7"            -- 23
      ,TO_CHAR(SYSDATE, 'MM-DD') "COL8"         -- 10-23
      ,TO_CHAR(SYSDATE, 'DAY') "COL9"           -- 월요일
      ,TO_CHAR(SYSDATE, 'DY') "COL10"           -- 월
      ,TO_CHAR(SYSDATE, 'HH24') "COL11"         -- 10
      ,TO_CHAR(SYSDATE, 'HH') "COL12"           -- 10
      ,TO_CHAR(SYSDATE, 'HH AM') "COL13"        -- 10 오전
      ,TO_CHAR(SYSDATE, 'HH PM') "COL14"        -- 10 오전 (현재가 오전이면 오전으로 조회됨)
      ,TO_CHAR(SYSDATE, 'MI') "COL15"           -- 30
      ,TO_CHAR(SYSDATE, 'SS') "COL16"           -- 54
      ,TO_CHAR(SYSDATE, 'SSSSS') "COL17"        -- 37873
      ,TO_CHAR(SYSDATE, 'Q') "COL18"            -- 4 (4사분기)
FROM DUAL;

※ 'TO_DATE()' 함수를 통해 문자 타입을 날짜 타입으로 변환을 수행하는 과정에서 내부적으로 해당 날짜에 대한 유효성 검사가 이루어짐

▶ NULL 관련 함수

  • NULL 의 처리 : NULL 은 상태의 값을 의미하며 실제 존재하지 않는 값이기 때문에 NULL 이 연산에 포함 될 경우 결과는 무조건 NULL임. NULL 은 실제 존재하는 값이 아니기 때문에 일반 연산자를 활용하여 비교할 수 없음
함수 기능 사용 예
NVL 첫 번째 파라미터 값이 NULL 이면, 두 번째 파라미터 값을 반환하며, 첫 번째 파라미터 값이 NULL 이 아니면, 그 값을 그대로 반환 NVL(NULL, 10) = 10 / NVL(5, 10) = 5
NVL2 첫 번째 파라미터 값이 NULL 이 아닌 경우, 두 번째 파라미터 값을 반환하고 첫 번째 파라미터 값이 NULL 인 경우, 세 번째 파라미터 값을 반환 NVL2(COMM, SAL12+COMM, SAL12)
COALESCE 매개변수 제한이 없는 형태로 인지하고 활용. 맨 앞에 있는 매개변수부터 차례로 NULL 인지 아닌지 확인하여 NULL 인 경우에는 그 다음 매개변수의 값을 반환. NVL, NVL2과 비교했을 때 모든 경우의 수를 고려할 수 있다는 특징이 있음 COALESCE(NULL, NULL, 30, NULL, NULL, 60) = 30

2. 분석함수

  • 분석함수를 사용할 때는 OVER 절을 함께 사용해야 하며, OVER 절 내부에 PATITION BY 절을 사용하지 않으면 쿼리 결과 전체를 집계 (PARTITION BY 절을 사용하면 쿼리 결과에서 해당 칼럼을 그룹으로 묶어서 결과를 표시)
구분 함수
집계 COUNT, MAX, MIN, SUM, AVG
순위 ROW_NUMBER, RANK, DENSE_RANK
순서 FIRST_VALUE, LAST_VALUE, LAG, LEAD
통계 STDDEV, VARIANCE
비율 RATIO_TO_REPORT, CUME_DIST, PERCENT_RANK, NTITLE