FUNCTION

DB에서 제공하는 미리 정의 된 기능.

  • 데이터 값을 계산하거나 조작. (단일 행 함수)
  • 열의 데이터 타입을 변환.
  • 행의 그룹에 대해 계산하거나 요약. (그룹 함수)

DUAL 테이블

쿼리문의 수행 결과가 하나의 ROW로 출력되기 위한 DUMMY 컬럼만 갖고 있음.
함수를 위한 임시 테이블 같은 개념.

단일 행 함수 : 데이터 값을 계산 혹은 조작

  • 각 행에 대해 수행.
  • 데이터 타입에 맞는 함수를 사용 해야 함.
  • 행렬로 하나의 결과를 반환.
  • SELECT, WHERE, ORDER BY 절 등에서 사용 가능.
  • 함수 속의 함수로 중첩해서 사용 가능.

단일 행 함수의 종류.

종류 DESC
문자 타입 문자를 입력받아 문자와 숫자를 반환.
숫자 타입 숫자를 입력받아 숫자를 반환.
날짜 타입 날짜 연산, 날짜 값 반환.
변환 타입 임의의 데이터 타입의 값을 다른 데이터 타입으로 변환.
일반 함수 NVL, DECODE, CASE, WHEN, 순위 함수 등.

문자 처리 함수

     
lower 소문자 반환 lower('fuck DB') = 'fuck db'
upper 대문자 반환 upper('fuck DB') = 'FUCK DB'
initcap 문자열의 첫글자 대문자, 나머지 소문자 initcap('fuck DB') = 'Fuck Db'
substr 문자를 잘라 추출 (한글1byte) substr('Welcome to Oracle',4,3) = 'com' substr('Welcome to Oracle',-4,3) = 'acl'
substrb 문자를 잘라 추출 (한글 2byte) substr('웰컴투오라클',3,4) = 투오라클, substrb('웰컴투오라클’,3,4) = 컴투
concat 문자의 값을 연결 CONCAT('fuck', ' DB')
length 문자의 길이 반환 (한글 1byte) length('오라클’) = 3
lengthb 문자의 길이 반환 (한글 2byte) lengthb('오라클’) = 6
lpad / rpad 입력 받은 문자열과 기호를 정렬하여 특정 길이의 문자열로 반환 "lpad('oracle',10,'#') = '####oracle'"
trim / ltrim / rtrim 잘라내고 남은 문자 표시 rtrim(' oracle ') = ' oracle'trim('a' from 'aaaORACLEaaa') = 'ORACLE'
convert char set으로 변환  
chr ascii 코드 값으로 변환  
ascii ascii 코드값을 문자로 반환 ascii('Oracle')
replace 문자열에서 특정문자 변경  
instr 특정 문자의 위치 반환 instr('Welcome to Oracle', 'o') = 5instr(대상,찾을글자,시작위치,몇번째발견)

숫자 처리 함수

     
round 특정 자릿수에서 반올림. ( -시 정수값도 가능) round(대상,(-)자릿수)
trunc 특정 자릿수에서 버림, 절단.( -시 정수값도 가능) trunc(대상,(-)자릿수)
ceil 올림  
floor 버림  
'' '' ''
abs 절대값 반환  
cos cosine  
exp e의 n승  
floor 소수점 아래를 자름 (버림)  
log log값 반환  
power power(man) m의 n승 반환  
sign sign(n) n<0이면 -1 n=0이면 0,n>0이면 1
sin sine값 반환  
tan tangent값 반환  
mod 입력 받은 수를 나눈 나머지값 반환. mod(대상,2) = 1 (java 에서 %)

날짜 처리 함수

날짜 연산

날짜 연산 DESC 반환값
Date + Number 날짜에 일수를 더한다. Date
Date - Number 날짜에 일수를 뺀다. Date
Date - Date 날짜에서 날짜를 뺀다. 일 수
Date + Number / 24 날짜에 시간을 더할 때는 시간을 24로 나누어서 날짜에 더한다. Date
SELECT
  TO_CHAR( SYSDATE, 'YY/MM/DD/HH24:MI' ),
  SYSDATE + 1,
  SYSDATE - 1,
  (SYSDATE + 1) - (SYSDATE - 7),
  SYSDATE + 13 / 24
FROM
  DUAL;

날짜 처리 함수

MONTH_BETWEEN 함수 외에는 모두 날짜 타입을 반환함.

     
sysdate 시스템상 현재 날짜 반환 sysdate+1 = 내일날짜
months_between 두 날짜 사이가 몇 개월인지 반환 between(date1, date2)
add_months 특정 날짜에 개월수 더함 add_months(date, number)
next_day 특정 날짜에서 최초 요일의 날짜 반환 next_day(date, 요일)sysdate, next_day(sysdate, '수')09.01.17, 09.01.21
last_day 해당 달의 마지막달 반환 last_day(sysdate) = 18.07.31
round 인자로 받은 날짜를 특정 기준으로 반올림 round(date, format)round(hiredate, month) = day < 16 = 이달.01, day > 16 = 담달.01
trunc 인자로 받은 날짜를 특정 기준으로 버림 trunc(date, format)

MONTHS_BETWEEN

두 날짜 사이의 개월 수 계산

  MONTHS_BETWEEN( 날짜, 날짜 )
SELECT
  SYSDATE, hire_date, MONTHS_BETWEEN( SYSDATE, hire_date )
FROM
  employees
WHERE
  department_id = 100;

ADD_MONTHS

월에 날짜 더하기

  ADD_MONTHS( 날짜, 숫자 )
SELECT
  hire_date,
  ADD_MONTHS( hire_date, 3),
  ADD_MONTHS( hire_date, -3)
FROM
  employees
WHERE
  department_id BETWEEN 100 AND 106; 

NEXT_DAY

돌아오는 요일의 날짜 개산하기

  NEXT_DAY( 날자, '요일' or 숫자 )
SELECT
  hire_date,
  NEXT_DAY( hire_date, 'Friday'),
  NEXT_DAY( hire_date, 6)
FROM
  employees
WHERE
  department_id BETWEEN 100 AND 106; 

LAST_DAY

돌아오는 월의 마지막 날짜 계산하기

  LAST_DAY( 날짜 )
SELECT
  hire_date,
  LAST_DAY( hire_date )
FROM
  employees
WHERE
  department_id BETWEEN 100 AND 106; 

ROUND, TRUNC

날짜를 반올림 혹은 절삭

  ROUND or TRUNC ( 날짜, 지정 값[MONTH, YEAR등] )
SELECT
  hire_date,
  ROUND( hire_date, 'MONTH' ),
  ROUND( hire_date, 'YEAR' ),
  TRUNC( hire_date, 'MONTH' ),
  TRUNC( hire_date, 'YEAR' )
FROM
  employees
WHERE
  department_id BETWEEN 100 AND 106; 

형 변환 함수

TO_DATE

날짜를 나타내는 문자열을 명시도니 날짜 형식으로 변환하는 함수

  TO_DATE( 문자열, '지정형식' )
SELECT
  TO_DATE( '20111217', 'YYYYMMDD')
FROM
  DUAL;

TO_NUMBER

숫자 타입의 문자열을 숫자 데이터 타입으로 변환하는 함수. 데이터 타입만 바뀜.

  TO_NUMBER( '숫자' )
SELECT
  TO_NUMBER('1234')
FROM
  DUAL;

TO_CHAR

숫자 값을 지정한 데이터 형식의 문자열로 변환

  TO_CHAR( 숫자 데이터 타입, '지정 형식' )
지정 형식 DESC EX RESULT
9 9로 출력 자릿수 지정 TO_CHAR( 42000, '99999999' ) ' 42000'
0 자릿수 만큼 0을 출력 TO_CHAR( 42000, '09999999' ) 00042000
$ 달러 TO_CHAR( 42000, '$9999999' ) $42000
L 지역 화폐 기호 TO_CHAR( 42000, 'L9999999' ) $42000
, 명시한 위치에 쉼표 TO_CHAR( 42000, '9,999,999' ) 43,000
. 명시한 위치에 소수점 TO_CHAR( 42000, '9999999.99' ) 42000.00

TO_CHAR

날자 값을 지정한 형식의 문자열 타입으로 면환

  TO_CHAR( 날짜 데이터 타입, '지정 형식' )
지정 형식 DESC
CC 세기
YY 연도
YEAR 문자 연도
Q 분기
MM 숫자값 월
MONTH 문자값 월
MON 문자값 약어 월
RM 로마자 월
W 년월의 주
DD 년월주의 일
DAY 요일이름
DY 요일 이름 약어

일반 함수

NVL

  NVL( 열이름, '치환 값' )

NULL 값을 치환 값으로 처리함.

SELECT
  salary * NVL( commission_pct, 1 )
FROM
  employees
ORDER BY
  commission_pct;

NVL2

  NVL2( COLUMN1, COLUMN2, COLUMN3 )

COLUMN1의 값이 NULL이면 COLUMN3를 출력 NULL이라면 COLUMN2를 출력.

DECODE

조건 논리 처리.
3항 연산과 같음.

  DECODE( 열 이름, 조건 값, 치환 값, 기본 값 )
SELECT
  first_name,
  last_name,
  department_id,
  salary as 급여,
  DECODE( department_id, 60, salary * 1.1, salary )   as 조정급여,
  DECODE( department_id, 60, '10%인상', '미인상' )    as 인상여부
FROM
  employees;
ORDER BY
  commission_pct;

CASE

복잡한 조건 논리처리 하기

CASE
  WHEN  조건 1  THEN  출력 값 1
  WHEN  조건 3  THEN  출력 값 2
  ...
  ELSE  출력 값 3
END
SELECT
  employee_id, first_name, last_name, salary,
  CASE
    WHEN salary >= 9000 THEN 'TOP'
    WHEN salary BETWEEN 6000 AND 8999 THEN 'MID'
    ELSE 'LOW'
  END AS salary_grade
FROM
  employees
WHERE
  job_id = 'IT_PROG';

RANK, DENSE_RANK, ROW_NUMBER

데이터 값에 순위 매기기

FUNC DESC EX
RANK 공동 순위를 출력하되, 공동 순위만큼 건너 뛰어 다음 순위 출력. 1, 2, 2, 4, ...
DENSE_RANK 공동 순위를 출력하되, 건너 뛰지 않고 이어서 다음 순위 출력. 1, 2, 2, 3, ...
ROW_NUMBER 공동 순위없이 순위 출력. 1, 2, 3, 4, ...
  RANK () OVER ( [PARTITION BY 열 이름] ORDER BY 열 이름)
SELECT
  employee_id, salary,
  RANK()       OVER( ORDER BY salary DESC ) AS RANK_SALARY,
  DENSE_RANK() OVER( ORDER BY salary DESC ) AS DENSE_RANK_SALARY,
  ROW_NUMBER() OVER( ORDER BY salary DESC ) AS ROW_NUMBER_SALARY
FROM
  employees;
SELECT
  A.employee_id, A.department_id, B.department_name, A.salary,
  RANK()       OVER( PARTITION BY A.department_id ORDER BY salary DESC ) AS RANK_SALARY,
  DENSE_RANK() OVER( PARTITION BY A.department_id ORDER BY salary DESC ) AS DENSE_RANK_SALARY,
  ROW_NUMBER() OVER( PARTITION BY A.department_id ORDER BY salary DESC ) AS ROW_NUMBER_SALARY
FROM
  employees A, departments B
WHERE
  A.department_id = B.department_id
ORDER BY B.department_id, A.salary DESC;

그룹 함수

집계 함수라고도 함.
단일 행 함수와 달리 여러 행에 대해 함수가 적용되어 하나의 결과를 나타내는 함수.
기준 열에 대해 같은 데이터 값 기리 그룹으로 묶고,
묶은 행의 집합에 대해 그룹 함수 연산이 필요하다면 GROUP BY 절을 이용하여 처리할 수 있음.
묶은 그룹에 대해 조건이 필요하다면 HAVING 절을 이용함.

그룹 함수의 사용법

  SELECT  그룹함수( 열 이름 )
  FROM    테이블 이름
  [WHERE 조건식]
  [ORDER BY 열 이름]

주요 그룹 함수

예제 생략

FUNC DESC EX  
count 행 개수를 셈 count(comm) NULL값도 셈
sum 합계 sum(comm)  
avg 그룹의 평균 avg(salary)  
max 그룹의 최댓값 max(salary)  
min 그룹의 최소값 min(salary)  
stddev 그룹의 표준편차    
variance 그룹의 분산    
728x90
반응형

'Database' 카테고리의 다른 글

[SQL] JOIN  (0) 2019.12.27
[SQL] GROUP  (0) 2019.12.26
[SQL] 조건절 WHERE  (0) 2019.12.24
[SQL] 데이터 조회 SELECT  (0) 2019.12.23
DB(Database)란  (0) 2019.12.23

+ Recent posts