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) |
주의점 | - 실수가 발생하기 쉽다 |