함수(Function)
하나의 큰 프로그램에서 반복적으로 사용되는 부분들을 분리하여 작성해놓은 작은 서브프로그램
자바의 메서드와 같은 존재라고 볼 수 있다
호출하며 값을 전달하면 결과를 리턴하는 방식으로 사용한다
크게 아래 두가지로 나뉜다
- 단일행 함수 : n개의 값을 읽어서 n개의 결과를 리턴 (매 행마다 함수 실행 후 결과 반환)
- 그룹 함수 : n개의 값을 읽어서 1개의 결과를 리턴(하나의 그룹별로 함수 실행 후 결과 반환)
단일행 함수와 그룹함수는 결과 행의 갯수가 다르기 때문에 SELECT절에는 이 둘을 함께 사용할 수 없다
단일 행 함수
각 행마다 반복적으로 적용되어 입력받은 행의 개수만큼 결과를 반환하는 함수이다
[ 문자 처리 함수 ]
구분 |
입력 값 |
리턴 값 |
설명 |
LENGTH(CHAR | STRING) |
CHARACTER |
NUMBER |
문자열 길이 반환 |
LENGTHB |
문자열의 바이트 크기 반환 |
INSTR(STRING, STR, [POSITION,[OCCURRENCE]]) |
특정 문자의 위치 반환 |
INSTRB |
특정 문자의 위치 바이트 크기 반환 |
LPAD / RPAD(STRING, N, [STR]) |
CHARACTER |
지정 문자열을 입력한 크기만큼 본 문자열의 왼쪽 / 오른쪽부터 채워서 생성된 문자열 리턴 |
LTRIM / RTRIM(STRING, STR) |
왼쪽 / 오른쪽부터 지정한 문자를 잘라내고 남은 문자 리턴 |
TRIM( LEADING | TRAILING | BOTH [CHAR] FROM STRING) |
왼쪽 / 오른쪽 / 양쪽부터 지정한 문자를 잘라내고 남은 문자 리턴 |
SUBSTR( STRING, POSITION, [LENGTH] ) |
지정한 위치에서 지정한 길이만큼 문자 잘라내어 리턴 |
SUBSTRB |
지정한 위치에서 지정한 바이트만큼 문자를 잘라내어 리턴 |
LOWER(STRING) |
전달받은 문자 / 문자열을 소문자로 변환하여 리턴 |
UPPER(STRING) |
전달받은 문자 / 문자열을 대문자로 변환하여 리턴 |
INITCAP(STRING) |
전달받은 문자 / 문자열의 첫 글자만 대문자로, 나머지는 소문자로 변환하여 리턴 |
CONCAT(STRING, STRING) |
인자로 전달받은 두 개의 문자 / 문자열을 합쳐서 리턴 |
REPLACE(STRING, STR1, STR2) |
전달받은 문자열 중에서 지정한 문자를 인자로 전달받은 문자로 변환하여 리턴 |
LENGTH : NUMBER
SELECT
LENGTH('오라클 쉽네'), -- 6
LENGTHB('오라클 야호') -- 11
FROM
DUAL;
-- 가상 테이블(DUMMY TABLE) : 산술 연산이나 가상칼럼값등 한번만 출력하고 싶을 때 사용하는 테이블
- LENGTH() : 해당 전달된 문자열의 글자 수 반환
- LENGTHB () : 매개변수로 전달된 문자열의 바이트 수 반환
- 한글 : 3byte
- 영문, 숫자, 특수문자 : 1byte
- 인코딩 설정에따라 모두 동일하게 2byte로 취급될수도 있다
- 표현법 :
LENGTH (CHAR | STRING)
-
CHAR |
STRING : 문자 타입 컬럼명 또는 문자열 |
INSTR : NUMBER
SELECT
INSTR('AABAACAABBAA', 'B'), -- 3
INSTR('AABAACAABBAA', 'B', - 1), -- 10
INSTR('AABAACAABBAA', 'B', - 1, 2), -- 9
- 지정한 위치부터 지정한 숫자 번째로 나타나는 문자의 시작위치를 반환한다
- SQL은 숫자의 처음을 0 부터가 아닌 1부터 세는것을 감안하여 결과를 생각해야 한다
- POSITION이 -1 이라고 해서 맨 끝의 글자부터 1로 세는 것이 아님을 주의
=> 찾을 문자를 끝에서 시작방향으로 하여 찾는것은 맞으나 반환하는 것은 첫글자부터 1로 차례대로 센 위치의 숫자 값이다
- 표현법 :
INSTR(STRING, STR, [POSITION,[OCCURRENCE]])
- =
INSTR(문자열, 특정 문자, 찾을 위치의 시작값, 순번)
- STRING : 문자 타입 컬럼 또는 문자열
- STR : 찾으려는 문자열
- POSITION : 찾을 위치 시작 값(기본 값 1 , -1)
=> 1 : STRING의 시작부터 끝 방향으로 찾음
=> -1 : STRING의 끝부터 시작 방향으로 찾음
- OCCURRENCE : 문자열 안에서 STR이 반복될 때 지정하는 위치(기본 값 1), 0 이하 사용 불가
=> POSITION으로 정해진 찾는 방향을 기준으로 몇 번째 문자의 위치를 반환할 것인지를 나타낸다
LPAD / RPAD : CHARACTER
SELECT
LPAD(EMAIL, 16),
RPAD(EMAIL, 16)
- 주어진 컬럼/문자열에 임의의 문자열을 왼쪽/오른쪽에 덧붙여 최종 길이 N의 문자열을 반환한다
- 덧붙이고자 하는 문자를 따로 명시하지 않았다면 기본으로 공백이 덧붙여진다
- 중요한 정보들은 애초에 암호화되어 db에 들어오기 때문에 이러한 처리를 할 일이 거의 없다
=> 사소한 정보들 가공에 조금씩 쓰이고 그다지 많이 사용되는 함수는 아님
- 표현법 :
LPAD(STRING, N, [STR]) / RPAD(STRING, N, [STR])
- =
LPAD /RPAD (문자열, 최종적으로 반환할 문자의 길이 (BYTE), 덧붙이고자 하는 문자)
- STRING : 문자 타입 컬럼 또는 문자열
- N : 반환할 문자(열)의 길이(바이트), 원래 STRING의 길이보다 작다면 N만큼 잘라서 표시
- STR : 덧붙이려는 문자(열), 생략 시 공백문자
LTRIM / RTRIM : CHARACTER
SELECT
LTRIM(' D D D '), -- 'D D D '
RTRIM('0001230456000855000', '0'), -- '0001230456000855'
LTRIM('11332212312KH123123', '123') -- 'KH123123'
- 주어진 컬럼/문자열의 왼쪽/오른쪽에서 지정한 STR에 포함된 모든 문자를 제거한 나머지를 반환한다
- 제거하고자 하는 문자를 명시하지 않으면 기본으로 공백을 제거한다
- 제거하고자 하는 문자열을 명시 했을 때 그 문자열을 통으로 지워주는 것이 아니다
=> 문자 하나하나 검사를 하면서 현재 문자가 지우고자하는 문자열 안에 포함되어있다면 지워준다
- 표현법 :
LTRIM(STRING, STR) / RTRIM(STRING, STR)
- =
LTRIM / RTRIM (문자열, 제거시키고자 하는 문자)
- STRING : 문자 타입 컬럼 또는 문자열
- STR : 제거하려는 문자(열), 생략 시 공백문자
TRIM : CHARACTER
SELECT
TRIM(' F F '), -- 'F F'
TRIM('Z' FROM 'ZZZZZZFFZZZZZZ'), -- 'FF'
TRIM(LEADING 'Z' FROM 'ZZZZZZFFZZZZZZ'), -- 'FFZZZZZZ'
- 주어진 컬럼/문자열의 앞/뒤/양쪽에 있는 지정한 문자를 제거한 나머지를 반환한다
- 지정 문자는 한 하나의 문자만 가능하다
- 표현법 :
TRIM( LEADING | TRAILING | BOTH [CHAR] FROM STRING)
- =
TRIM(BOTH | LEADING | TRAILING '제거하고자 하는 문자' FROM '문자열')
- STRING : 문자 타입 컬럼 또는 문자열
- CHAR : 제거하려는 문자(열), 생략 시 공백문자
- LEADING : TRIM할 CHAR의 위치 지정, 앞(LEADING) / 뒤(TRAILING) / 양쪽(BOTH) 지정 가능(기본 값 양쪽)
SUBSTR : CHARACTER
SELECT
SUBSTR('ORACLEDATABASE', 7), -- 'DATABASE'
SUBSTR('ORACLEDATABASE', 7, 4), -- 'DATA'
SUBSTR('ORACLEDATABASE', - 8, 3) -- 'DAT'
- 컬럼/문자열에서 지정한 위치부터 지정한 개수의 문자열을 잘라내어 반환한다
- 추출할 문자 갯수를 명시하지 않으면 해당 문자열 끝까지 출력된다
- 처음위치는 음수로도 제시 가능하다
=> 뒤에서부터 N번째 위치로부터 문자를 추출함
- 표현법 :
SUBSTR( STRING, POSITION, [LENGTH] )
- =
SUBSTR (문자열, 처음위치, 추출할 문자갯수)
- STRING : 문자 타입 컬럼 또는 문자열
- POSITION : 문자열을 잘라낼 위치로 양수면 시작방향에서 지정한 수만큼, 음수면 끝 방향에서 지정한 수만큼의 위치 의미
- LENGTH : 반환할 문자 개수(생략 시 문자열의 끝까지 의미, 음수면 NULL 리턴)
LOWER / UPPER / INITCAP : CHARACTER
SELECT
LOWER('WELCOME TO C CLASS'), -- 'welcome to c class'
UPPER('wellcom to c class'), -- 'WELLCOM TO C CLASS'
INITCAP('welcom to c class') -- 'Welcom To C Class'
- 컬럼/문자열을 소문자/대문자/첫 글자만 대문자로 변환하여 반환한다
- LOWER(문자열) : 소문자로 변경
- UPPER(문자열) : 대문자로 변경
- INITCAP(문자열) : 각 단어의 첫글자만 대문자로 변환
- 표현법 :
LOWER(STRING) / UPPER(STRING) / INITCAP(STRING)
CONCAT : CHARACTER
SELECT
CONCAT('가나다', '라마바사') -- '가나다라마바사'
- 컬럼/문자열을 두개 전달받아 하나로 합친 후 반환한다
- 매개 문자열은 두개까지밖에 입력하지 못한다
||
연결 연산자와 동일한 역할이라고 할 수 있다
- 표현법 :
CONCAT(STRING, STRING)
REPLACE : CHARACTER
SELECT REPLACE('서울시 강남구 역삼동 56번길 강남빌딩 3층', '3층', '2층 C 클래스')
-- 서울시 강남구 역삼동 56번길 강남빌딩 2층 C 클래스
- 컬럼/문자열에서 특정문자(열)을 지정한 문자(열)로 바꾼 후 반환한다
- 표현법 :
REPLACE(STRING, STR1, STR2)
- =
REPLACE (문자열, 찾을문자, 바꿀문자)
- STRING : 문자 타입 컬럼 또는 문자열
- STR1 : 변경하려고 하는 문자 혹은 문자열
- STR2 : 변경하고자 하는 문자 혹은 문자열
[ 숫자 처리 함수 ]
구분 |
입력 값 |
리턴 값 |
설명 |
ABS(NUMBER) |
NUMBER |
NUMBER |
절대 값 리턴 |
MOD(NUMBER, DIVISION) |
입력 받은 수를 나눈 나머지 값 반환 |
ROUND(NUMBER, [POSITION]) |
특정 자릿수에서 반올림 |
FLOOR(NUMBER) |
버림(소수점 아래를 잘라냄) |
TRUNC(NUMBER, [POSITION]) |
특정 자릿수에서 잘라냄 |
CEIL(NUMBER) |
올림(소수점 아래에서 올림) |
ABS : NUMBER
SELECT ABS(- 10.9) -- 10.9
- 인자로 전달받은 숫자의 절대값을 반환한다
- 표현법 :
ABS(NUMBER)
MOD : NUMBER
SELECT
MOD(10, 3) -- 1
MOD(- 10, 3) -- -1
MOD(10.9, 3) -- 1.9
- 인자로 전달받은 숫자를 나누어 나머지값을 반환한다
- 자바에서의 % 연산자와 비슷한 기능이라고 할 수 있다
- 표현법 :
MOD(NUMBER, DIVISION)
- =
MOD(숫자, 나눔값)
- NUMBER : 숫자 혹은 숫자 데이터 컬럼
- DIVISION : 나눌 수 혹은 나눌 숫자 데이터 컬럼
ROUND : NUMBER
SELECT
ROUND(123.556) -- 124
ROUND(123.556, 1) -- 123.6
ROUND(125.556, - 1) -- 130
- 소수점 기준 지정한 위치부터 반올림하여 값을 반환한다
- 반올림 위치 : 소수점 기준으로 아래 N번째 수에서 반올림 한다
=> 반올림할 위치 생략시 기본값인 0으로 자동 진행된다 (=소숫점을 없앤 양수를 반환)
- 표현법 :
ROUND(NUMBER, [POSITION])
- =
ROUND(반올림 하고자하는 수 , 반올림할 위치)
- NUMBER : 숫자 혹은 숫자 데이터 컬럼
- POSITION : 반올림할 위치(생략 시 기본 값 0)
FLOOR : NUMBER
SELECT FLOOR(207.9999) -- 207
- 소숫점 아래의 수를 버림하여 값을 반환한다
- 표현법 :
FLOOR(NUMBER)
TRUNC : NUMBER
SELECT
TRUNC(123.789, - 1) -- 120
TRUNC(123.789, 2) -- 123.78
- 지정한 위치부터 버림처리하여 값을 반환한다
- 위치는 생략가능하며 생략시 기본값은 0으로 되어 FLOOR함수와 동일하게 동작한다
- 표현법 :
TRUNC(NUMBER, [POSITION])
- =
TRUNC(버림처리할 숫자, 위치)
- POSITION : 버릴 위치(생략 시 기본 값 0)
CEIL : NUMBER
SELECT CEIL(123.00001) -- 124
- 소숫점 아래의 수를 올림하여 값을 반환한다
- 표현법 :
CEIL(NUMBER)
[ 날짜 처리 함수 ]
구분 |
입력 값 |
리턴 값 |
설명 |
SYSDATE |
DATE |
DATE |
시스템에 저장된 현재 날짜 반환 |
MONTHS_BETWEEN |
NUMBER |
두 날짜를 전달받아 몇 개월 차이인지 계산하여 반환 |
ADD_MONTHS |
DATE |
DATE |
특정 날짜에 개월 수를 더하여 반환 |
NEXT_DAY |
특정 날짜에서 인자로 받은 요일이 최초로 다가오는 날짜 반환 |
LAST_DAY |
해당 달의 마지막 날짜 반환 |
EXTRACT |
NUMBER |
년, 월, 일 정보를 추출하여 반환 |
구분 |
입력 값 |
리턴 값 |
설명 |
SYSDATE |
DATE |
DATE |
시스템에 저장된 현재 날짜 반환 |
MONTHS_BETWEEN(DATE1, DATE2) |
NUMBER |
두 날짜를 전달받아 몇 개월 차이인지 계산하여 반환 |
ADD_MONTHS(DATE, NUMBER) |
DATE |
DATE |
특정 날짜에 개월 수를 더하여 반환 |
NEXT_DAY(DATE, STRING [OR NUMBER]) |
특정 날짜에서 인자로 받은 요일이 최초로 다가오는 날짜 반환 |
LAST_DAY(DATE) |
해당 달의 마지막 날짜 반환 |
EXTRACT(YEAR | MONTH | DAY FROM DATE) |
년, 월, 일 정보를 추출하여 반환 |
</table>
SYSDATE : DATE
SELECT SYSDATE -- 00/00/00 형태로 현재 시간 반환
- 시스템에 저장되어있는 현재 날짜를 반환한다
- DATE 자료형으로 년도, 월, 일, 시, 분 ,초 를 다 포함하고 있다
MONTHS_BETWEEN : NUMBER
SELECT
MONTHS_BETWEEN('22/01/22' , '22/11/07') -- -9.51612903225806451612903225806451612903
MONTHS_BETWEEN('22/11/07' , '22/01/22') -- 9.51612903225806451612903225806451612903
- 인자로 날짜 두 개를 전달받아 개월 수 차이를 NUMBER 타입으로 반환한다
- 두번째 날짜인자가 첫번째 날짜보다 미래일 경우 음수를 반환한다
- 표현법 :
MONTHS_BETWEEN(DATE1, DATE2)
- DATE1 : 기준이 되는 날짜
- DATE2 : 개월 수를 구하려는 날짜
ADD_MONTHS : DATE
SELECT ADD_MONTHS('22/12/18', 6) -- 23/06/18
- 특정 날짜에 인자로 받은 숫자만큼 개월수를 더한 날짜를 반환한다
- 표현법 :
ADD_MONTHS(DATE, NUMBER)
- DATE : 기준이 되는 날짜
- NUMBER : 더하려는 개월 수
NEXT_DAY : DATE
SELECT NEXT_DAY('22/12/18', '토') -- 22/12/24
- 특정 날짜에서 가장 가까운 요일을 찾아 해당 날짜를 반환한다
- 표현법 :
NEXT_DAY (DATE, STRING [OR NUMBER])
- =
NEXT_DAY(DATE, 요일(문자/숫자))
- DATE : 기준이 되는 날짜
- STRING[OR NUMBER] : 구하려는 요일
=> 숫자의 경우 1 = 일요일, 2 = 월요일, …., 7 = 토요일
=> 문자의 경우 한국어로 설정된 상태이기 때문에 ‘월’, ‘월요일’ 모두 가능하나 ‘MONDAY’, ‘MON’은 인식하지 않는다
=> ALTER SESSION SET NLS_LANGUAGE = AMERICAN;
로 언어설정을 변경후엔 ‘MONDAY’, ‘MON’ 인식이 가능하다
LAST_DAY : DATE
SELECT LAST_DAY('22/12/18') -- 22/12/31
- 인자로 전달받은 날짜가 속한 달의 마지막 날짜를 반환한다
- 표현법 :
LAST_DAY (DATE)
SELECT
EXTRACT(YEAR FROM '22/12/18'), -- 2022
EXTRACT(MONTH FROM '22/12/18'), -- 12
EXTRACT(DAY FROM '22/12/18') -- 18
- 년, 월, 일 정보를 추출해서 반환한다
- 표현법 :
EXTRACT(YEAR | MONTH | DAY FROM DATE)
[ 형 변환 함수 ]
구분 |
입력 값 |
리턴 값 |
설명 |
TO_CHAR |
DATE / NUMBER |
VARCHAR2 |
날짜형 혹은 숫자형을 문자형으로 변환 |
TO_DATE |
CHARACTER / NUMBER |
DATE |
문자형 혹은 숫자형을 날짜형으로 변환 |
TO_NUMBER |
CHARACTER |
NUMBER |
문자형을 숫자형으로 변환 |
구분 |
형식 |
의미 |
숫자형 |
0 => '0000' |
앞의 빈자리를 0으로 채움 |
9 => '9999' |
일반적인 숫자 |
$ => '$9999' |
‘$’(dollar) 표시를 나타냄 |
L => 'L9999' |
₩등 지역 통화 단위를 표시 |
. => '99.99' |
소수점을 표시함 |
, => '9,999' |
천단위를 표시함 |
날짜형 |
SCC |
세기를 표시 S는 기원전(BC) |
YEAR |
연도를 알파벳(영어)로 표시 |
RRRR |
50년 기준 작으면 2000년대로 크면 1900년대로 4자리 표시 |
RR |
끝 2자리 연도 표시(50년을 기준으로 앞 2자리 년대가 바뀌는 것은 동일) |
YYYY |
4자리 연도 표시(기본 2000년대) |
YY |
끝 2자리 연도 표시(기본 2000년대) |
MONTH |
월을 표시 |
MON |
월의 약자로 표시(한글일 경우 MONTH와 다르지 않음) |
MM |
월을 2자리 숫자로 표시 |
DAY |
날짜에 해당하는 요일 표시 |
DY |
날짜에 해당하는 요일을 약자로 표시 |
DDD |
연도 기준으로 몇 번째 날 인지 표시(1-366) |
DD |
월 기준으로 몇 번째 날 인지 표시(1-31) |
D |
주 기준으로 몇 번째 날 인지 표시(1-7), 요일을 나타냄(일요일부터 1로 시작) |
HH, HH24 |
12시간 기준, 24시간 기준으로 시간을 표시 |
MI |
분을 표시 |
SS |
초를 표시 |
AM, PM |
오전이나 오후를 표시 |
- 날짜형의 FORMAT들은 문자를 날짜로 변활할때도 같은 형식을 사용한다
- 날짜형 FORMAT 중 R이 뜻하는 단어 : ROUND(반올림)
=> 50년을 기준으로 작으면 2000년대 , 크면 1900년대로 표시된다
TO_CHAR : VARCHAR2
SELECT
TO_CHAR(123456), -- '123456'
TO_CHAR(123, '00000') -- '00123'
TO_CHAR(123, '99999') -- '123'
TO_CHAR(1234, 'L00000') -- '₩01234'
TO_CHAR(1234, 'L99,999') -- '₩1,234'
TO_CHAR(SYSDATE, 'YYYY"년" MM"월" DD"일" (DY)') -- '2022년 01월 01일 (토)' (2022/01/01 기준)
TO_CHAR(SYSDATE, 'FMYYYY"년" MM"월" DD"일" (DY)') -- '2022년 1월 1일 (토)' (2022/01/01 기준)
- 날짜/숫자형 데이터를 문자형 데이터로 변환하여 반환한다
- 데이터 변환시 원하는 FORMAT을 지정할 수 있다
- FORMAT 지정 중 FORMAT 형식에는 없는 의미없는 문자를 넣어주고 싶다면 “” 로 감싸서 넣어주면 된다
- 날짜형 데이터 변환시 날짜에 붙는 앞자리 0을 없애고 싶다면
FM
키워드를 앞에 붙여주면 된다
- 날짜형/숫자형 FORMAT형식 사용 가능
- 표현식 :
TO_CHAR( NUMBER / DATE [, FORMAT] )
TO_DATE : DATE
SELECT
TO_DATE('20221104') -- 22/11/04 (2000년대)
TO_DATE('000101')
-- 0으로 시작하는 년도를 다룰때는 반드시 홀따옴표를 붙여서 문자열처럼 다뤄줘야한다
-- TO_DATE(000101)은 정수값중에 0으로 시작하는 숫자는 없기 때문에 literal does not match format string 에러발생 => 101로 인식하기 때문
TO_DATE('20201104', 'YYYYMMDD') -- 20/11/04 (2000년대)
-- YYYYMMDD 로 형식을 지정했음에도 20/11/04로 출력되는 이유는
-- 옆의 FORMAT이 해당 데이터가 저런 형식으로 되어있다고 알려주기 위함이지 저렇게 만들어달라는 뜻이 아니기 때문이다
TO_DATE('091129 143050', 'YYMMDD HH24:MI:SS') -- 09/11/29 (2000년대)
- 숫자/문자형 데이터를 날짜형 데이터로 변환하여 반환한다
- 날짜형 FORMAT형식 사용가능
- 표현법 :
TO_DATE(CHARACTER/NUMBER [, FORMAT]
TO_NUMBER : NUMBER
SELECT
TO_NUMBER('0123') -- 123
'123' + '123', -- 246 (자동 형변환)
'10,000,000' + '550,000' -- 오류발생
-- ',' 문자를 포함하고 있기때문에 숫자로 자동형변환이 되지 않는다
TO_NUMBER('10,000,000') + TO_NUMBER('550,000')
-- 형식을 지정해주지 않았기 때문에 위와 똑같은 오류가 발생한다
TO_NUMBER('10,000,000', '99,999,999') + TO_NUMBER('550,000', '999,999') -- 10550000
- 날짜/문자형 데이터를 숫자형 데이터로 변환하여 반환한다
- 첫글자에 0이 있다면 다 날려버리고 0이 아닌 숫자부터 시작된다
- 숫자가 아닌 다른 문자를 포함하고 있는 데이터가 들어온다면 해당 데이터를 어떤식으로 읽어야 할지 FORMAT을 꼭 지정해주어야 한다
- 오라클 SQL에선 문자열 -> 숫자 로의 자동형변환이 많이 이루어진다
- 숫자형 FORMAT형식 사용가능
- 표현법 :
TO_NUMBER(CHARACTER [, FORMAT])
[ NULL 처리 함수 ]
NVL(exp1, exp2)
SELECT NVL(BONUS, 0) -- BONUS가 NULL일 경우 0을 출력
- NULL로 되어있는 컬럼의 값을 인자로 지정한 숫자/문자로 변경하여 반환한다
- 인자로 지정한 값에 따라 NUMBER/CHARACTER 타입을 반환하게 된다
- 표현식 :
NVL(exp1, exp2)
- =
NVL (컬럼명, 해당 컬럼값이 NULL일 경우 반환할 반환 값)
- exp1 : NULL데이터를 처리할 컬럼명 혹은 값
- exp2 : NULL값을 대체하고자 하는 값
NVL2(exp1, exp2, exp3)
SELECT NVL2(BONUS, '보너스 있음', '보너스 없음')
-- BONUS가 NULL일 경우 '보너스 없음', 값이 있을 경우 '보너스 있음' 출력
- 주어진 컬럼의 값이 NULL일경우와 아닐경우에 반환할 값을 모두 인자로 받아 상황에 따라 반환해준다
- 표현식 :
NVL2(exp1, exp2, exp3)
- =
NVL2(컬럼명, 결과값1, 결과값2)
- exp1 : NULL데이터를 처리할 컬럼명 혹은 값
- exp2 : NULL이 아닐 경우 반환할 값
- exp3 : NULL값을 대체하고자 하는 값
NULLIF(exp1, exp2)
SELECT NULLIF('456', '123') -- 456
- 동등비교를 수행하며 두 값이 동일할 경우 NULL, 동일하지 않을 경우 첫번째 인자를 반환한다
- 표현식 :
NULLIF(exp1, exp2)
- =
NULLIF(비교대상1, 비교대상2)
- exp1 : 두 인자 값이 동일하지 않을 경우 반환될 값
[ 선택 함수 ]
DECODE
SELECT DECODE(SUBSTR('041208-1XXXXXX', 8,1), 1, '남', 2, '여', '성별을 알 수 없습니다') -- 남
- 비교하고자 하는 값/컬럼이 조건식과 같으면(동등비교) 결과 값을 반환한다
- 비교 대상에는 컬럼명, 산술연산, 함수가 들어갈 수 있다
- 자바에서의 switch 문과 작동방식이 유사하다
- 표현법 :
DECODE(표현식, 조건1, 결과1, 조건2, 결과2, …, DEFAULT)
- 표현식 : 값에 따라 선택을 다르게 할 컬럼 혹은 값
- 조건 : 해당 값이 참인지 거짓인지 여부 판단
- 결과 : 해당 조건과 일치하는 경우 반환할 값
- DEFAULT : 모든 조건이 불일치 시 반환할 값
CASE WHEN THEN
SELECT
CASE WHEN SALARY > 5000000 THEN '고급'
WHEN SALARY > 3500000 THEN '중급'
ELSE '초급' END
- 비교하고자 하는 값 또는 컬럼이 조건식과 같으면 결과 값을 반환(조건은 범위 값이 가능하다)
- DECODE와는 다르게 조건을 자유롭게 제시할 수 있다 (DECODE는 하나의 조건으로 동등비교만을 수행)
- 자바에서의 if else if 문과 작동방식이 유사하다
- 표현법 :
CASE WHEN 조건1 THEN 결과1 WHEN 조건2 THEN 결과2… ELSE 결과(DEFAULT) END
- 조건 : 해당 값이 참인지 거짓인지 여부 판단
- 결과 : 해당 조건과 일치하는 경우 반환할 값
- DEFAULT : 모든 조건이 불일치 시 반환할 값
그룹 함수
구분 |
설명 |
SUM(NUMBER) |
그룹의 누적 합계 반환 |
AVG(NUMBER) |
그룹의 평균 반환 |
COUNT() |
그룹의 총 개수 반환 |
MAX(ANY) |
그룹의 최대 값 반환 |
MIN(ANY) |
그룹의 최소 값 반환 |
- 하나 이상의 행을 그룹으로 묶어 연산하며 총합, 평균 등을 하나의 컬럼으로 반환하는 함수이다
- N개의 값을 읽어서 1개의 결과를 반환한다
- 하나의 그룹별로 함수를 실행하고 그 결과를 반환한다
- WHERE절에서는 사용하지 못한다
SUM
SELECT SUM(SALARY), -- SALARY 컬럼의 총 합
SUM(SALARY + (SALARY*NVL(BONUS, 0))*12) -- SALARY컬럼의 보너스 포함 연봉의 총 합
- 해당 컬럼 값들의 총합을 반환한다
- 인자로 연산식과 함수를 넣을 수 있다
- null 값을 가진 행은 연산의 대상에서 제외된다
=> 따라서 동일 컬럼 내의 연산 진행중, null값이 있다고 전체 결과가 null이되는 것을 방지하기 위해 SUM(NVL(COL1,0))
이런식의 처리는 하지 않아도 된다(오히려 불필요한 연산이 늘어남)
=> 최종 결과가 null일경우 공백으로 화면이 출력되어보이므로 이런 결과를 방지하고 싶다면 NVL(SUM(COL1),0)
과 같이 해주는 것도 좋다
- 다만 여러 컬럼들을 조합하여 연산을 수행할 때는 의도와 다른 결과가 나올 수 있으므로 꼭 null 처리를 해주자
- 표현법 :
SUM (숫자타입의 컬럼)
AVG
SELECT AVG(SALARY), -- SALARY 컬럼의 평균
AVG(SALARY + (SALARY*NVL(BONUS, 0))*12) -- SALARY컬럼의 보너스 포함 연봉의 평균
- 해당 컬럼 값들의 평균을 구해서 반환한다
- NVL처리를 하지 않을 시 null 가진 행은 평균 계산에서 제외되어 계산된다
- 표현법 :
AVG(숫자타입컬럼)
MAX / MIN
SELECT MAX(SALARY), MIN(SALARY), -- SALARY 컬럼의 최대값, 최소값
MAX(HIRE_DATE), MIN(HIRE_DATE) -- HIRE_DATE컬럼의 가장 오래된 날짜, 가장 최근 날짜
- 해당 컬럼 내에서 가장 큰값(MAX)/작은 값(MIN)을 반환한다
- 표현법 :
MAX(ANY타입) / MIN(ANY타입)
COUNT
SELECT COUNT(*), -- 조회된 행의 전체 갯수
COUNT(SALARY), -- 제시한 컴럼의 값이 null이 아닌것의 갯수
COUNT(DISTINCT SALARY) -- 제시한 해당 컬럼값에 중복값이 있을 경우 하나로만 세서 반환
- 조회된 행의 갯수를 반환한다
- 표현법 :
COUNT( * | 컬럼이름 | DISTINCT 컬럼이름 )
- COUNT(*) : 조회 결과에 해당하는 모든 행의 개수를 반환
- COUNT(컬럼이름) : 제시한 컬럼 값이 null이 아닌 것의 개수를 반환
- COUNT(DISTINCT 컬럼이름) : 제시한 컬럼에 중복값이 있을 경우 하나로만 카운트 하여 총 개수 반환 (null은 개수에 포함하지 않는다)
댓글남기기