SQL 함수

- 칼럼의 값이나 데이터 타입의 변경하는 경우

- 숫자 또는 날짜 데이터의 출력 형식 변경하는 경우

- 하나 이상의 행에 대한 집계(aggregation)를 하는 경우

SQL 함수의 유형

- 단일 행 함수 : 테이블에 저장되어 있는 개별 행을 대상으로 함수를 적용하여 하나의 결과를 반환하는 함수

- 복수 행 함수 : 조건에 따라 여러 행을 그룹화하여 그룹별로 결과를 하나씩 반환하는 함수

 

 

단일 행 함수

- 데이터 값을 조작하는데 주로 사용

- 행별로 함수를 적용하여 하나의 결과를 반환하는 함수

 

 

단일 행 함수의 사용법

function_name (column | expression, [arg1, arg2, . . .])

– function_name : 단일행 함수 이름

– column : 칼럼 이름

– expression : 문자열 또는 표현식

– arg1, arg2 : 함수의 인수(상수, 변수, 칼럼 이름, 표현식)

 

 

문자 함수

– 문자 데이터를 입력하여 문자나 숫자를 결과로 반환하는 함수

 

문자 함수의 종류

– 대소문자변환 함수

– 문자조작 함수

– 문자열 길이 반환 함수

종류 의미 사용 예
INITCAP 문자열의 첫 번째문자만 대문자로 변환 INITCAP('student') → Student
LOWER 문자열 전체를 소문자로 변환 LOWER('STUDENT') →student
UPPER 문자열 전체를 대문자로 변환 UPPER('student')→STUDENT

 

문자열 길이 반환 함수

종류 의미 사용 예
LENGTH 문자열의 길이를 반환 LENGTH('홍길동') → 3
LENGTHB 문자의 바이트수를 반환 LENGTHB('홍길동') → 6

 

문자 조작 함수의 종류와 사용 예

종류 의미 사용 예
LENGTH 문자열의 길이를 반환 LENGTH('홍길동') → 3
LENGTHB 문자의 바이트수를 반환 LENGTHB('홍길동') → 6

 

문자 조작 함수의 종류와 사용 예

종류 의미 사용 예
CONCAT 두문자열을결합, '||'와 동일 CONCAT('sql', 'plus') → sqlplus
SUBSTR 특정문자 또는 문자열 일부를 추출 SUBSTR('SQL*Plus', 5, 4) → Plus
INSTR 특정 문자가 출현하는 첫번째위치를 반환 INSTR('SQL*Plus', '*') → 4
LPAD 오른쪽 정렬후 왼쪽으로 지정문자를 삽입 LPAD('sql', 5, '*') → **sql
RPAD 왼쪽 정렬후 오른쪽으로 지정문자를 삽입 RPAD('sql', 5, '*') → sql**
LTRIM 왼쪽 지정 문자를 삭제 LTRIM('*sql', '*') → sql
RTRIM 오른쪽 지정 문자를 삭제 RTRIM('sql*', '*') → sql

 

 

숫자 함수

- 숫자 데이터를 처리하기 위한 함수

종류 의미 사용 예
ROUND 지정한 소수점 자리로 값을 반올림 ROUND(123.17,1) → 123.2
TRUNC 지정한 소수점 자리까지 남기고 값을버림 TRUNC(123.17,1) → 123.1
MOD m을 n으로 나눈 나머지 MOD(12,10) → 2
CEIL 지정한 값보다 큰 수 중에서 가장 작은 정수 CEIL(123.17) → 124
FLOOR 지정한 값보다 작은 수 중에서 가장 큰 정수 FLOOR(123.17) → 123

 

 

날짜 함수(sql의 특징! 날짜 계산이 가능하다!)

날짜 함수의 종류

종류 의미 결과
SYSDATE 시스템의 현재 날짜 날짜
MONTHS_BETWEEN 날짜와 날짜 사이의 개월을 계산 숫자
ADD_MONTHS 날짜에 개월을 더힌 날짜 계산 날짜
NEXT_DAY 날짜후의 첫 요일의 날짜를 계산 날짜
LAST_DAY 월의 마지막 날짜를 계산 날짜
ROUND 날짜를 반올림 날짜
TRUNC 날짜를 절삭 날짜

 

날짜 연산 함수(날짜 함수)

종류 결과 의미
날짜 + 숫자 날짜 날짜에 일수를 가산하여 날짜 계산
날짜 – 숫자 날짜 날짜에 일수를 감산하여 날짜를 계산
날짜 – 날짜 일수 날짜와 날짜를 감산하여 일수를 계산
날짜 + 숫자/24 날짜 날짜에 시간을 가산하여 날짜 계산

 

종류 의미 사용예
MONTHS_BETWEEN date1과 date2 사이의 개월수를 계산 MONTHS_BETWEEN (date1, date2 )
ADD_MONTHS date에개월수를 더한 날짜계산 ADD_MONTHS (date, 개월수)
LAST_DAY date 날짜이후의 첫번째 'day'요일의 날짜를 계산 NEXT_DAY (date, ‘day’ )
NEXT_DAY date 날짜가 속한 달의 마지막 날짜를 계산 LAST_DAY (date)

 

데이터 타입의 변환

– 숫자나 날짜 타입을 문자와 함께 결합하거나 보고서 양식에 맞추기 위해 주로 사용

 

묵시적인 데이터 타입 변환

- 묵시적인 데이터 타입 변환은 정확한 연산을 위하여 오라클에서 데이터 타입을 내부적으로 변환하는 경우

WHERE A=B 일 때일 때(A는 칼럼, B는 상수)

A의 데이터 타입 B의 데이터 타입 변환 결과
NUMBER VARCHAR2또는CHAR
> NUMBER
B가 NUMBER 타입으로 변환
VARCHAR2또는CHAR
> NUMBER
NUMBER A가 NUMBER 타입으로 변환

– 문자 타입의 숫자 타입으로 변환은 문자열이 숫자로 구성된 경우에만 가능

 

명시적인 데이터 타입 변환

- 사용자가 데이터 타입 변환 함수를 이용하여 명시적으로 데이터 타입을 변환

종류 의미 사용 예 결과
TO_CHAR 숫자/날짜 타입을 문자로 변환 TO_CHAR('06/10',' YYYY-MM') 2006-10
TO_NUMBER 문자열을 숫자 타입으로 변환 TO_NUMBER(1000, '9.999') 1,000
TO_DATE 문자열을 날짜 타입으로 변환 TO_DATE('06/10', 'YYYY-MM') 2006-10
SQL> SELECT name, date
FROM table
WHERE date = TO_DATE('june 01, 01', 'MONTH DD', 'YY');

NAME   DATE
전은지 01/06/01

 

시간 표현 형식의 종류

종류 의미
AM 또는PM 오전(AM) 또는 오후(PM) 시각 표시
A.M 또는P.M 오전(A.M) 또는 오후(P.M)시각 표시
HH 또는HH12 시각(1-12)
HH24 24시간(0-23)
MI
SS

 

기타 날짜 표현 형식의 종류

종류 의미
“text” 결과와 함께 출력할 문자열을 인용 부호로 표시
TH 서수로 표시
SP 숫자(기수)를 영문으로 표시
SPTH 또는THSP 서수를 영문으로 표시

 

TO_CHAR 함수를 이용한 숫자 출력 형식 변환

종류 의미 사용 예 결과
9 한자리의 숫자 표시 (1234, '99999') 1234
0 앞부분을 0으로 표시 (1234, '099999') 001234
$ 달러 기호를 앞에 표시 (1234, '$99999') $1234
. 소수점을 표시 (1234, '99999.99') 1234.00
, 특정위치에 ','표시 (1234, '99,999') 1,234
MI 오른쪽으로 '-'기호 표시 (1234, '99999MI') 1234-
PR 음수값을 <>으로 표시 (1234, '99999PR') <1234>
EEEE 과학적 표기법으로 표시 (1234, '9.999EEEE') 1.234E+03
V 10n을 곱한값으로 표시 (1234, '9999V99') 123400
B 공백을 0으로 표시 (1234, 'B9999.99') 1234.00

 

중첩 함수

사용법

- F1함수의 결과 값은 F2의 인수로, F2의 결과 값은 F3의 인수로 사용된다.

F3(F2(F1(column, arg1), arg2), arg3)

사용 예

주민등록번호에서 생년월일을 추출하여 'YY/MM/DD'형태로 출력하여라

SQL> SELECT TO_CHAR(TO_DATE(SUBSTR(idnum, 1, 6), 'YYMMDD'), 'YY/MM/DD') BIRTHDATE
FROM table;

주민등록번호(idnum)를 1~6번째 자리 생년월일 추출 후 DATE형식'YYMMDD'으로 바꾼 뒤 CHAR형식'YY/MM/DD'로 변환한다.

 

 

NVL 변환 함수: NVL

- NVL 함수는 NULL을 0 또는 다른 값으로 변환하기 위한 함수

사용법

NVL(expression1, expression2)

– expression1 : NULL을 포함하는 칼럼 또는 표현식

– expression2 : NULL을 대체하는 값

주의: expression1과 expression2는 반드시 동일한 데이터 타입 이어야 한다.

 

NVL2(NVL 확장 함수)

– NVL2 함수는 첫 번째 인수 값이 NULL이 아니면 두 번째 인수값을 출력하고, 첫 번째 인수값이 NULL이면 세 번째 인수값을 출력하는 함수

NVL2(expression1, expression2, expresion3)

– expression1 : NULL을 포함하는 칼럼 또는 표현식

– expression2 : expression1이 NULL이 아닐 때 반환되는 값

– expression3 : expression1이 NULL일 때 대체되는 값

 

NULLIF(NVL 확장 함수)

– NULLIF 함수는 두 개의 표현식을 비교하여 값이 동일하면 NULL을 반환하고, 일치하지 않으면 첫 번째 표현식의 값을 반환

NULLIF(expression1, expression2)

– expression1 : expression2와 비교하는 값

 

COALESCE 함수

– COALESCE 함수는 인수중에서 NULL이 아닌 첫 번째 인수를 반환하는 함수

COALESCE(expression-1, expression-2, … ,expression-n)

– expression-1 : expression-1이 NULL이 아니면 expression-1을 반환
– expression-2 : expression-1이 NULL이고 expression-2가 NULL이 아니면 expression-2를 반환
– expression-n : expression-1부터 expression-n-1까지의 값이 NULL이고 expression-n이 NULL이 아니면 expression-n을 반환

 

DECODE 함수

–DECODE 함수는 기존 프로그래밍 언어에서 IF문이나 CASE 문으로 표현되는 복잡한 알고리즘을 하나의 SQL 명령문으로 간단하게 표현할 수 있는 유용한 기능

–DECODE 함수에서 비교 연산자는'='만 가능

DECODE(expression | column, SEARCH1,
    RESULT1[, SEARCH2, RESULT2, …, ]
    [, DEFAULT])

–표현식 또는 칼럼의 값이 SEARCH1 값과 일치하면 RESULT1 값을 반환, SEARCH2 값과 일치하면 RESULT2 값 반환
–일치하는 값이 없거나 NULL인 경우에는 기본값 반환
–기본값이 없는 경우에는 NULL 반환

주의사항

ELSE없는 IF를 사용하라
가능한 그룹함수내에서 NVL을 사용하지 마라
가능한 반복해서 DECODE를 사용하지 마라(CASE문으로 대체하는 등)
펼칠 컬럼이 너무 많을때는 먼저 GROUP BY한 후 처리하라

 

 

CASE 함수

– CASE 함수는 DECODE 함수의 기능을 확장한 함수
– DECODE 함수는 표현식 또는 칼럼 값이'='비교를 통해 조건 과일 치하는 경우에만 다른 값으로 대치할 수 있지만, CASE 함수에서는 산술 연산, 관계 연산, 논리 연산과 같은 다양한 비교가 가능
– 또한 WHEN 절에서 표현식을 다양하게 정의
– 8.1.7에서부터 지원되었으며, 9i에서 SQL, PL/SQL에서 완벽히 지원
– DECODE 함수에 비해 직관적 인문 법체계와 다양한 비교 표현식 사용

 

  DECODE CASE WHEN
기능 - 조건단위 분기
- IF 문 대응
- 조건단위 분기
- SWITCH CASE 문대응
좋은 점 - 코드의 함축성 - 전형적인 구문으로 가독성 향상
- 비정형 비교 및 범위비교가 쉽다
불편한 점 - 여러 조건이 한꺼번에 뭉쳐질 때 복잡하다
- 범위 비교시 Sign함수 함께 사용으로 성능에 영향
- 비정형 비교시 코드생성이 어려워짐
- 가독성이 낮다
- 복잡해 질수록 라인 수 증가
-8i에서 부터 사용(PL/SQL에선 9i)
주의점 - 실수가 발생하기 쉽다  

 

 

+ Recent posts