[SQL] 함수

📁 함수

특정 값을 읽어서 계산한 결과를 리턴

  • 단일 행 함수
    N개의 값을 읽어서 N개의 결과값 리턴
    - 문자 관련 함수, 숫자 관련 함수, 날짜 관련 함수, 형변환 함수
  • 그룹 함수
    N개의 값을 읽어서 1개의 결과 리턴

단일 행 함수와 그룹 함수는 같이 쓸 수 없음
Result Set에 올라갈 행의 갯수가 다르기 때문

📁 단일 행 함수

1) 문자 관련 함수

LENGTH

문자열 길이 반환

SELECT LENGTH('ABC') FROM DUAL;		-- 3
SELECT LENGTH('오라클') FROM DUAL;	-- 3

LENGTHB

문자열의 바이트수 반환

SELECT LENGTHB('ABC') FROM DUAL;	-- 3
SELECT LENGTHB('오라클') FROM DUAL;	-- 9

INSTR

해당 문자열의 위치 반환
인덱스는 1부터 시작되며 문자열이 없으면 0 반환

SELECT INSTR('12345678', '2') FROM DUAL;		-- 2
SELECT INSTR('123454321', '4', -1) FROM DUAL;	-- 6

LPAD, RPAD

문자열의 길이를 지정하고 좌우로 남은 공간은 지정한 문자열로 치환

SELECT LPAD('12345', 10) FROM DUAL;			--      12345
SELECT RPAD('12345', 10, '#') FROM DUAL;	-- 12345#####

LTRIM, RTRIM

각각 좌우측의 공백 혹은 지정 문자를 삭제

SELECT LTRIM('  AA') FROM DUAL;					-- AA
SELECT LTRIM('3210AA0123', '0123') FROM DUAL;	-- AA0123
SELECT RTRIM('  AA  ') FROM DUAL;				-- AA
SELECT RTRIM('3210AA0123', '0123') FROM DUAL;	-- 3210AA

TRIM

LTRIM, RTRIM과 기능적으로 유사하지만 형식이 다르고 오직 하나의 문자만 지울 수 있음

  • LEADING : 왼쪽 문자만 지움
  • BOTH : 양쪽 문자를 모두 지움
SELECT TRIM('   AA   ') FROM DUAL;						-- AA
SELECT TRIM(LEADING 'A' FROM 'ABBAABBA') FROM DUAL;	-- BBAABBA
SELECT TRIM(BOTH 'A' FROM 'ABBAABBA') FROM DUAL;		-- BBAABB

SUBSTR

문자열의 일부를 반환

SELECT SUBSTR('123456789', 7) FROM DUAL;		-- 789
SELECT SUBSTR('123456789', 5, 2) FROM DUAL;		-- 56
SELECT SUBSTR('123456789', 5, 0) FROM DUAL;		-- NULL
SELECT SUBSTR('123456789', -8, 3) FROM DUAL;	-- 234

LOWER, UPPER, INITCAP

문자열을 소문자, 대문자, 혹은 단어 단위로 변환

SELECT LOWER('ABC DEF') FROM DUAL;		-- abc def
SELECT UPPER('abc def') FROM DUAL;		-- ABC DEF
SELECT INITCAP('abc DEF') FROM DUAL;	-- Abc Def

CONCAT

문자열과 문자열을 이어붙임

SELECT CONCAT('가나다라', '1234') FROM DUAL;	-- 가나다라1234

REPLACE

지정된 문자열을 다른 문자열로 대체

SELECT REPLACE('서울시 강남구 역삼동', '역삼동', '삼성동') FROM DUAL;	-- 서울시 강남구 삼성동

2) 숫자 관련 함수

ABS

절댓값 반환

SELECT ABS(-1) FROM DUAL;	-- 1

MOD

두 값을 나눈 나머지. 부호는 나누어지는 수의 것을 따라감

SELECT MOD(10, 3) FROM DUAL;	-- 3
SELECT MOD(-10, 3) FROM DUAL;	-- -3

ROUND

인자를 반올림해서 반환. 두번째 인자는 올림할 자리

SELECT ROUND(123.456) FROM DUAL;	-- 123
SELECT ROUND(123.456, 1) FROM DUAL;	-- 123.5

CEIL, FLOOR

올림, 버림

SELECT CEIL(1234.56) FROM DUAL;		-- 1235
SELECT FLOOR(1234.56) FROM DUAL;	-- 1234

TRUNC

절삭. 수학적 의미의 버림과는 다름

SELECT TRUNC(-1234.56) FROM DUAL;	-- -1234
SELECT TRUNC(1234.56, 1) FROM DUAL;	-- 1234.5

3) 날짜 관련 함수

SYSDATE

현재 날짜를 반환

SELECT SYSDATE FROM DUAL;

MONTHS_BETWEEN

두 날짜의 시간차를 개월수로 반환
앞에 인자가 최근 날짜여야 양수로 반환

SELECT MONTHS_BETWEEN(SYSDATE, BIRTHDAY) FROM PERSON;

ADD_MONTHS

날짜에 지정한 개월수를 더함

SELECT ADD_MONTHS(SYSDATE, 2) FROM DUAL;

NEXT_DAY

날짜에서 가장 가까운 지정한 요일의 날

SELECT SYSDATE, NEXT_DAY(SYSDATE, '목요일') FROM DUAL;
SELECT SYSDATE, NEXT_DAY(SYSDATE, '목') FROM DUAL;
SELECT SYSDATE, NEXT_DAY(SYSDATE, '5') FROM DUAL;

LAST_DAY

날짜의 달에서 마지막 일

SELECT LAST_DAY(SYSDATE) FROM DUAL;

EXTRACT

날짜에서 년, 월, 일을 추출

SELECT EXTRACT(YEAR FROM SYSDATE),
	EXTRACT(MONTH FROM SYSDATE),
    EXTRACT(DAY FROM SYSDATE)
FROM DUAL;

4) 형변환 함수

TO_CHAR

숫자형, 날짜형을 문자형으로 변환

  • 숫자→문자
    숫자를 여러 종류의 문자열로 표현
SELECT TO_CHAR(1234) FROM DUAL;
SELECT TO_CHAR(1234, '99999') FROM DUAL;	--  1234
SELECT TO_CHAR(1234, '00000') FROM DUAL;	-- 01234

SELECT TO_CHAR(1234, 'FML99,999') FROM DUAL;	-- ₩1234
SELECT TO_CHAR(1234, 'FM$99,999') FROM DUAL;	-- $1,234
  • 날짜→문자
    날짜를 여러 종류의 문자열로 표현
SELECT
	TO_CHAR(SYSDATE, 'YYYY'),		-- 2022
    TO_CHAR(SYSDATE, 'YY'),			-- 22
    TO_CHAR(SYSDATE,'YEAR'),		-- TWENTY TWENTY-TWO
	
    TO_CHAR(SYSDATE, 'MM'),			-- 08
    TO_CHAR(SYSDATE, 'MON'),		-- 8월
    TO_CHAR(SYSDATE, 'MONTH'),		-- 8월
    TO_CHAR(SYSDATE, 'RM'),			-- VIII

	TO_CHAR(SYSDATE, 'DDD'),		-- 1년 기준
    TO_CHAR(SYSDATE, 'DD'),			-- 1달 기준
    TO_CHAR(SYSDATE, 'D'),			-- 1주 기준

	TO_CHAR(SYSDATE, 'Q'),			-- 분기
    TO_CHAR(SYSDATE, 'DAY'),		-- 요일
    TO_CHAR(SYSDATE, 'DY'),			-- 요일
    
    TO_CHAR(SYSDATE, 'AM')			-- 오전/오후 중 적절한 값
	TO_CHAR(SYSDATE, 'PM')			-- 오전/오후 중 적절한 값
    TO_CHAR(SYSDATE, 'HH'),			-- 시(12)
    TO_CHAR(SYSDATE, 'HH24'),		-- 시(24)
    TO_CHAR(SYSDATE, 'MI'),			-- 분
    TO_CHAR(SYSDATE, 'SS')			-- 초
FROM DUAL;
  • 날짜→형식화된 문자열
    원하는 형식으로 날짜 출력. 형식에 문자열이 들어갈 경우 ""로 감싸주어야
-- 2022.08.16(화) 오후 05:45:40
SELECT TO_CHAR(SYSDATE, 'YYYY.MM.DD(DY) AM HH:MI:SS') FROM DUAL;

-- 2022년 08월 16일 화요일 오후 05시 45분 40초
SELECT TO_CHAR(SYSDATE, 'YYYY"년" MM"월" DD"일" DAY AM HH"시" MI"분" SS"초"') FROM DUAL;

TO_DATE

문자나 숫자를 날짜 데이터로 변환

SELECT TO_DATE(20220818) FROM DUAL;
SELECT TO_DATE(20220818, 'YYYYMMDD') FROM DUAL;
SELECT TO_DATE('220818', 'YYMMDD') FROM DUAL;
  • RR : 1~50까지는 21세기로, 51~99까지는 20세기로 변환
SELECT TO_CHAR(TO_DATE('980630', 'YYMMDD'), 'YYYYMMDD') FROM DUAL;
SELECT TO_CHAR(TO_DATE('210818', 'YYMMDD'), 'YYYYMMDD') FROM DUAL;
SELECT TO_CHAR(TO_DATE('980630', 'RRMMDD'), 'YYYYMMDD') FROM DUAL;
SELECT TO_CHAR(TO_DATE('210818', 'RRMMDD'), 'YYYYMMDD') FROM DUAL;

TO_NUMBER

문자나 데이터를 숫자 데이터로 변환

SELECT TO_NUMBER('1,111', '9,999')+TO_NUMBER('2,222', '9,999') FROM DUAL;

5) NULL처리 함수

NVL

NULL값의 데이터를 대체값으로 변경

SELECT NAME, NVL(PANALTY, 0) FROM STUDENT;
SELECT NAME, NVL(DUAL_MAJOR, '단일전공') FROM STUDENT;

NVL2

NULL 여부에 따라 지정된 대체값을 출력

SELECT NAME WHERE NVL2(DUAL_MAJOR, '복수전공', '단일전공') FROM STUDENT;
SELECT NAME WHERE NVL2(DUAL_MAJOR, DUAL_MAJOR, '단일전공') FROM STUDENT;

NULLIF

특정한 값을 NULL로 변환

SELECT NULLIF(SCORE, 0) FROM STUDENT;

DECODE

특정 조건을 만족하는 값을 변환

SELECT DECODE(SCORE, 4, 'A', 3, 'B', 2, 'C') FROM STUDENT;
SELECT DECODE(SCORE, 4, 'A', 3, 'B', 2, 'C', 'F') FROM STUDENT;

CASE

특정 조건을 만족하는 값을 변환

SELECT
    CASE WHEN SCORE>=4 THEN '우수'
         WHEN SCORE>=2 THEN '보통'
         ELSE '미흡'
    END
FROM STUDENT;

📁 그룹 함수

하나의 결과값만을 반환하는 함수
반드시 GROUP BY 절과 함께 사용해야 한다.

SUM

컬럼의 합계 반환

SELECT SUM(SCORE) FROM STUDENT;

AVG

컬럼의 평균 반환

SELECT AVG(SCORE) FROM STUDENT;

MAX, MIN

컬럼의 행 중 최대값, 최소값 반환

SELECT MIN(NAME), MIN(SCORE), MIN(BIRTHDAY) FROM STUDENT

COUNT

NULL이 아닌 행의 갯수 반환

SELECT COUNT(*), COUNT(NAME) FROM STUDENT;