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

DB 설치 없이 Oracle DB 실습하기.

SQL에서 부족한 점이 느껴져서 공부 하려고 했는데 Oracle DB를 어디에 설치할지 고민이였음,
BUT!! Oracle에서 설치 없이 SQL을 돌릴 수 있는 웹 기반 서비스가 있었음..
당연히 오라클 계정이 있어야 함.
https://livesql.oracle.com/

세션, 쿠키, JS 기반으로 테이블과 데이터들을 정의하고, 일정 시간이 지나면 데이터가 삭제 되는 듯?

Oracle 테스트 데이터인 HR을 사용하고 싶다면,
https://livesql.oracle.com/apex/livesql/file/content_GV8MU6SITA2V3VYI179FAJUCY.html로 접속,
RUN SCRIPT 버튼을 눌러주면 내 계정에서 사용이 가능함.

https://livesql.oracle.com/apex/f?p=590:49:::NO:::로 접속 하면 그 외 샘플 데이터와 학습 자료들이 있음.
단점이라면 영어라는것..?

728x90
반응형

'Database' 카테고리의 다른 글

[SQL] 데이터를 가공하기 위한 DB 함수들  (0) 2019.12.26
[SQL] 조건절 WHERE  (0) 2019.12.24
[SQL] 데이터 조회 SELECT  (0) 2019.12.23
DB(Database)란  (0) 2019.12.23
nodejs mysql 연동 에러  (0) 2019.12.11

+ Recent posts