[Oracle] SQL의 단일행 함수 정리(문자열 관련, 숫자 관련, 날짜 관련, 형변환 관련, NULL 처리, 선택 관련 함수), 그룹 함수 정리
함수 : 자바의 메소드와 같은 의미.
종류
- 단일행 함수 : n개의 데이터 값을 읽어서 n개의 결과 값을 출력
- 그룹함수 : n 개의 데이터 값을 읽어서 1개의 결과를 출력( 따라서 group by 로 묶였을 경우, 그룹 당 함수를 실행 하고 결과를 반환하게 됨)
* 주의사항으로 단일행 함수와 그룹 함수는 함께 사용될 수 없음. 왜냐하면 결과로써 출력되는 행의 갯수 자체가 다르기 때문.
단일행 함수
1. 문자열 관련 함수
- LENGTH(STR) : STR(문자열) 데이터의 글자 수를 반환함
- LEGNTHB(STR) : STR(문자열) 데이터의 바이트 수를 반환함
* 한글의 경우 한 글자 당 3바이트로 취급되며, 영문-숫자-특수문자 등은 한 글자 당 1바이트로 취급됨
- INSTR(STR, '특정 문자', 찾을 위치의 시작값, 순번) : STR(문자열)의 '특정 문자'를 시작 값부터(앞 or 뒤) 시작해 n(순번)째 값의 위치인덱스를 NUMBER 데이터 타입으로 반환한다.
찾을 위치의 시작값 :
1 : 가장 앞 인덱스부터 찾는다. (기본값)
-1 : 가장 뒤 인덱스부터 찾는다.
순번 : 생략 시의 기본값은 1.
- SUBSTR(STR, POSITION, LENGTH) : 문자열로부터 특정 문자열을 추출해서 반환 (자바로 치면 문자열.substring() 메소드와 유사) 결과값은 CHARACTER 타입으로 반환된다. (문자열 형태)
LENGTH 는 생략 가능 (생략 시 끝까지 잘라냄)
- STR : '문자열 리터럴' / 문자열 타입의 컬럼명
- POSITION : 문자열 추출을 시작할 위치값, POSITION 번째 문자부터 추출하겠다.
- LENGTH : 추출할 문자 갯수
- LPAD/RPAD (STR(문자열or 문자열 타입의 컬럼), 최종적으로반환할문자열의길이(바이트), '덧붙이고자하는문자')
: 제시한 문자열에 임의의 문자를 왼쪽 또는 오른쪽에 덧붙여서 최종 N 길이만큼의 문자열을 반환
결과값은 CHARACTER 타입으로 반환 (문자열 형태)
덧붙이고자하는문자 : 생략 가능 (DEFAULT 값이 있음)
- LTRIM/RTRIM (STR, '제거시키고자 하는 문자') : STR(문자열)에서 '제거시키고자 하는 문자'를 제거함. 결과값은 CHARACTER 타입으로 반환 (문자열 형태)
제거시키고자하는문자 : 생략 가능 (DEFAULT 값이 있음)
- TRIM ( BOTH/LEADING/TRAILING '제거시키고자 하는 문자' FROM STR)
: 문자열의 양쪽/앞쪽/뒤쪽에 있는 특정 문자를 제거한 나머지 문자열을 반환
결과값은 CHARACTER 타입으로 반환 (문자열 형태)
BOTH : 양쪽에 있는 해당문자를 다 제거하겠다. (생략 시 기본값)
LEADING : 앞쪽에 있는 해당문자를 다 제거하겠다. (LTRIM 과 동일한 역할)
TRAILING : 뒤쪽에 있는 해당문자를 다 제거하겠다. (RTRIM 과 동일한 역할)
- CONCAT (STR1, STR2) : 전달된 두개의 문자열을 하나로 합친 결과를 반환. 결과값은 CHARACTER 타입으로 반환
- REPLACE (STR, '찾을문자', '바꿀문자') : STR 로 부터 '찾을문자' 를 찾아서 '바꿀문자' 로 바꾼 문자열을 반환. 결과값은 CHARACTER 타입으로 반환
2. 숫자 관련 함수
- ABS ( NUMBER ) : NUMBER 타입 데이터를 절대값으로 변환
- MOD ( NUMBER1, NUMBER2 ) : NUMBER1 을 NUMBER2 로 나누고 난 뒤의 나머지 값을 반환
- ROUND ( NUMBER, 위치 ) : NUMBER 타입 데이터를 위치 기준으로 반올림해주는 함수
위치
- 0, 1, 2... : 0은 기본값. 값이 커질수록 소수점 첫째 자리, 둘째 자리 순으로 늘어가게 됨.
- -1, -2... : 음수 값으로 갈수록 일의 자리, 십의 자리 순으로 자릿수가 줄어들게 됨
- CEIL (NUMBER) : 소숫점 아래의 수를 무조건 올림처리 해주는 함수
- FLOOR (NUMBER) : 소숫점 아래의 수를 무조건 버림처리 해주는 함수 (소숫점 절삭)
- TRUNC (NUMBER, 위치) : 위치 지정가능한 버림 처리를 해주는 함수
위치
- 0, 1, 2... : 0은 기본값. 값이 커질수록 소수점 첫째 자리, 둘째 자리 순으로 늘어가게 됨.
- -1, -2... : 음수 값으로 갈수록 일의 자리, 십의 자리 순으로 자릿수가 줄어들게 됨
3. 날짜 관련 함수
** DATE 타입 : 년, 월, 일, 시, 분, 초 를 다 포함한 자료형
- SYSDATE : 오늘날짜, 현재 내 컴퓨터의 시스템 날짜
- MONTHS_BETWEEN (DATE1, DATE2) : 두 날짜 사이의 개월수 반환, NUMBER 타입 반환
* 일, 시, 분, 초 가 소숫점으로 나옴.
* DATE1이 DATE2 보다 미래일 경우 양수값이 나오고, 반대로 과거일 경우 음수값이 나옴
- ADD_MONTHS (DATE, NUMBER) : 특정 날짜에 해당 숫자만큼의 개월수를 더한 날짜를 반환, DATE 타입 반환
- NEXT_DAY (DATE, 요일(문자/숫자)) : 특정 날짜에서 가장 가까운 해당 요일을 찾아서 그 날짜를 반환
* 요일의 경우 일요일을 1로 시작하여 월요일은 2... 일요일은 7로 정의된다.
* 현재의 기준 언어가 한글이기 때문에 '일' OR '일요일'이라고 적어도 함수가 작동한다.
만약 영어로 사용하고 싶다면 DDL 의 언어 변경 코드를 작성해주어야 한다.
해당 코드는 => ALTER SESSION SET NLS_LANGUAGE = AMERICAN; 와 같다.
- LAST_DAY (DATE) : 특정 날짜가 속한 달의 마지막 날짜를 구해서 반환, DATE 타입 반환
- EXTRACT : 년도 또는 월 또는 일 정보를 추출해서 반환 (NUMBER 타입 반환)
- EXTRACT (YEAR FROM DATE) : 특정 날짜로부터 년도만 추출
- EXTRACT (MONTH FROM DATE) : 특정 날짜로부터 월만 추출
- EXTRACT (DAY FROM DATE) : 특정 날짜로부터 일만 추출
4. 형 변환 관련 함수
1. NUMBER 타입 데이터를 문자열 데이터로 변환
- TO_CHAR (NUMBER/DATE, '포맷') : 숫자형 또는 날짜형 데이터를 문자형 타입으로 변환 (CHARACTER 타입 반환)
포맷 :
- 포맷을 입력하지 않았을 경우, NUMBER가 그대로 문자열로 변환되어 출력된다.
ex) TO_CHAR(1234) == '1234'
- 포맷에 '0'을 입력할 수 있다. 만약 NUMBER의 자릿수보다 0을 더 적었을 경우, 남는 자릿수만큼 0으로 대체된다.
ex) TO_CHAR(1234, '00000') == '01234'
- 포맷에 '9'을 입력할 수 있다. 만약 NUMBER의 자릿수보다 9을 더 적었더라도, NUMBER은 문자열로 출력된다.
ex) TO_CHAR(1234, '99999999') == '1234'
- 지역 화폐의 단위를 입력하고 싶다면 포맷에 'L'과 함께 0이나 9를 입력하면 된다. 'L00000'의 경우
ex) TO_CHAR(1234, 'L00000') == '\01234'
- 지역 화폐의 단위를 입력하고 싶다면 포맷에 'L'과 함께 0이나 9를 입력하면 된다. 'L99999'의 경우
ex) TO_CHAR(1234, 'L99999') == '\1234'
- 만약 화페의 자릿수를 3자리마다 , 로 구분하여 출력하고 싶다면 'L999,999~~~' 로 입력하면 된다.
ex) TO_CHAR(1234, 'L99,999') == '\1,234'
2. DATE 타입 데이터를 문자열 데이터로 변환
- TO_CHAR (SYSDATE) : 포맷을 지정 안한 경우에는 'YY/MM/DD' 형식으로 나옴
- TO_CHAR (SYSDATE, 'YYYY-MM-DD') : 2022-03-22 와 같이 출력된다.
- TO_CHAR (SYSDATE, 'PM HH:MI:SS' ) : 오전/오후 HH : MI : SS 로 출력
- TO_CHAR (SYSDATE, 'HH24:MI:SS' ) : 오전/오후 구분 없이 24시간 형식으로 HH : MI : SS 로 출력
그 외에도 원하는 대로 포맷을 커스터마이징 할 수 있다.
** 'YYYY' 의 경우 무조건 2000년부터 시작. 반면 'RRRR'의 경우 반올림을 적용해 1950~1999 AND 2000~2049를 적용함.
-- 년도로써 쓸 수 있는 포맷
- TO_CHAR (SYSDATE, 'YYYY') -- 2022
- TO_CHAR (SYSDATE, 'RRRR') -- 2022
- TO_CHAR (SYSDATE, 'YY') - 22
- TO_CHAR (SYSDATE, 'RR') - 22
- TO_CHAR (SYSDATE, 'YEAR') : 영어로 년도수를 출력
-- 월로써 쓸 수 있는 포맷
- TO_CHAR (SYSDATE, 'MM') -- 03
- TO_CHAR (SYSDATE, 'MON') -- 3월 // 세 자리의 약어로 된 월 이름(영문 설정일 경우)
- TO_CHAR (SYSDATE, 'MONTH') -- 3월 // 영문설정에서 아홉 자리를 위해 공백을 추가한 월 이름
- TO_CHAR (SYSDATE, 'RM') -- III 로마 숫자로 나타냄
-- 일로써 쓸 수 있는 포맷
- TO_CHAR (SYSDATE, 'D') -- 4 // D 는 1주일 기준으로 몇일째인지 (일요일부터)
- TO_CHAR (SYSDATE, 'DD') -- 23 // DD 는 1달 기준으로 몇일째인지
- TO_CHAR (SYSDATE, 'DDD') -- 082 // DDD 는 1년 기준으로 몇일째인지 알려주는 포맷
-- 요일로써 쓸 수 있는 포맷
- TO_CHAR (SYSDATE, 'DY') -- 수 // DY 는 '요일' 을 뺀 형태로 출력
- TO_CHAR (SYSDATE, 'DAY') -- 수요일 // DAY 는 '요일' 을 붙여서 출력 (월요일, 화요일, 수요일, ..)
그 외에도, 2022년 03월 21일 (월) 포맷으로 적용시키고 싶다면
- TO_CHAR (SYSDATE, 'YYYY"년" MM"월" DD"일" (DY)') 과 같이 쌍따옴표로 년, 월, 일을 묶어주면 된다.
3. NUMBER/CHARACTER 데이터를 DATE 데이터로 변환
- TO_DATE (NUMBER/CHARACTER, '포맷') : 숫자형 또는 문자형 데이터를 날짜형으로 변환, DATE 타입 반환
'포맷' :
- 값 지정이 없다면 YY/MM/DD 가 기본값으로 출력된다.
** 02/12/12와 같이 0으로 시작하는 년도의 경우 NUMBER 타입의 021212는 불가능하고, '021212'와 같이 반드시 작은 따옴표로 묶어줘야 한다.
- TO_DATE ('20100101', 'YYYYMMDD') -- 10/01/01
- TO_DATE ('041030 143021', 'YYMMDD HH24MISS') -- 04/10/30 14:30:21
- TO_DATE ('140630', 'YYMMDD') -- 14/06/30 (2014년 06월 30일)
- TO_DATE ('980630', 'YYMMDD') -- 98/06/30 ( 그러나 실제로는 2098년 06월 30일) // 두자리 년도에 대해서 YY 포맷을 적용시켰을 경우 현재 세기로 나타남 (98 을 제시했을 때 2098년으로 나온다) 따라서 'RRMMDD' 포맷을 사용해주어야 한다.
- TO_DATE ('980630', 'RRMMDD') -- 98/06/30 (1998년 06월 30일)
4. CHARACTER 데이터를 NUMBER 데이터로 변환
- TO_NUMBER (CHARACTER, '포맷') : 문자형 데이터를 숫자형으로 변환, NUMBER 타입 반환
SELECT '123' + '123'
FROM DUAL; -- 246 : 자동형변환 후 산술연산까지 진행
SELECT '10,000,000' + '550,000'
FROM DUAL; -- 문자(,) 가 포함되어있기 때문에 자동형변환이 진행되지 않음
SELECT TO_NUMBER('10,000,000', '999,999,999') + TO_NUMBER('550,000', '999,999')
FROM DUAL;
SELECT TO_NUMBER('0123')
FROM DUAL; -- 0123 / 123
5. NULL 관련 함수
- NVL (컬럼명, 해당 컬럼값이 NULL일 경우 반환할 반환 값)
: 해당 컬럼값이 존재할 경우 기존의 컬럼값을 반환, 해당 컬럼값이 NULL 인 경우 내가 제시한 특정값을 반환
- NVL2 (컬럼명, 결과값1, 결과값2)
: 해당 컬럼값이 존재할경우 결과값1 반환, 만약 해당 컬럼값이 NULL 일 경우 결과값2 반환
- NULLIF (비교대상1, 비교대상2)
: 비교대상1과 비교대상2가 동일할 경우는 NULL 값 자체를 반환, 두개의 값이 동일하지 않을 경우에는 비교대상1 값을 반환
6. 선택 관련 함수(DECODE, CASE WHEN... )
- DECODE (비교대상, 조건값1, 결과값1,
조건값2, 결과값2,
조건값3, 결과값3, ...,
조건값N, 결과값N,
결과값(아무것도 해당값이 없을 경우) )
* 자바의 SWITCH 구문과 비슷.
- CASE WHEN 조건식1 THEN 결과값1
WHEN 조건식2 THEN 결과값2
...
WHEN 조건식N THEN 결과값N
ELSE 결과값
END
* 자바의 IF - ELSE 구문과 비슷
두 구문의 차이점 : DECODE 선택함수와 비교하면 DECODE 는 해당 조건검사 시 동등비교만을 수행한다면
CASE WHEN THEN 구문으로는 특정 조건 제시시 내 맘대로 조건식을 기술 가능한 구문
그룹 함수
1. SUM (숫자타입의컬럼명) : 해당 컬럼값들의 총 합계를 반환해주는 함수
2. AVG (숫자타입의컬럼명) : 해당 컬럼값들의 평균값을 구해서 반환
3. MIN (아무타입컬럼명) : 해당 컬럼값들 중에 가장 작은값을 반환
4. MAX (아무타입컬럼명) : 해당 컬럼값들 중에 가장 큰값을 반환
5. COUNT (*/컬럼명/DISTINCT 컬럼명) : 조회된 행의 갯수를 세서 반환
-- COUNT (*) : 조회 결과에 해당하는 모든 행의 갯수를 세서 반환하겠다.
-- COUNT (컬럼명) : 내가 제시한 해당 컬럼값이 NULL 이 아닌것만 행의 갯수를 세서 반환하겠다.
-- COUNT (DISTINCT 컬럼명) : 제시한 컬럼값이 중복값이 있을 경우에는 하나로만 세서 행의 갯수를 반환하겠다. 단, NULL 포함 X