1) 단일행 함수(single-row function) : 데이터가 한 행씩 입력되고 입력된 한 행당 결과가 하나씩 나오는 함수
2) 다중행 함수(multiple-row function): 여러 행이 입력되어 하나의 행의 결과로 반환되는 함수
문자 데이터를 가공하는 문자함수
UPPER(): 소문자 -> 대문자
LOWER(): 대문자 -> 소문자
INITCAP: 첫글자만 대문자로

-- 이름을 대소문자 구분없이 조회
SELECT * FROM EMP WHERE UPPER(ENAME) LIKE UPPER('scott');
LENGTH(컬럼명): 문자열 길이
영문자 1자 - 1바이트
한글 1자 - 2바이트, 3바이트(UTF-8)
LENGTHB(컬럼명): 문자열의 바이트 수

참고) MySQL
LENGTH() - 문자열 바이트 수
CHAR_LENGTH() - 문자열 갯수
SUBSTR(컬럼, 시작위치, 추출길이)
SUBSTR(컬럼, 시작위치) - 시작 위치 부터 끝까지

시작위치

INSTR(컬럼,'찾는 키워드')
INSTR(컬럼,'찾는 키워드',검색 시작 위치)
1번 위치부터 시작
키워드를 못찾은 경우 0을 반환

LIKE와 비슷한 효과
ENAME LIKE %S%
=> INSTR(ENAME,'S') > 0

참고) indexOf()와 비슷
- 특정 문자열의 위치를 찾는 함수
- 0번 위치부터 시작
REPLACE(컬럼, '찾는 문자열', '치환될 문자열')

1) LPAD: 왼쪽 패딩
LPAD(컬럼 or 문자열, 자리수, '채워넣을 문자')

🔼비워있는 공간 왼쪽을0으로 채워넣음
2) RPAD: 오른쪽 패딩
RPAD(컬럼 or 문자열, 자리수, '채워넣을 문자')

이름 마스킹 처리할때 주로 사용


CONCAT에 CONCAT에 CONCAT ... 이런식으로 하면 좀 복잡하다.
컬럼1 || ':' || 컬럼2

--양쪽 공백 제거 ABCDEF
SELECT TRIM(' ABC ') || 'DEF' FROM DUAL;
TRIM(LEADING FROM 문자열): 왼쪽 여백 제거
TRIM(TRAILING FROM 문자열): 오른쪽 여백 제거
TRIM(LEADING '*' FROM 문자열): 왼쪽 '*'를 제거
--BOTH 옵션이 기본값 (양쪽 여백 제거)
SELECT TRIM(BOTH FROM' ABC ') || 'DEF' FROM DUAL;
--왼쪽 여백 제거 'ABCDEF '
SELECT TRIM(LEADING FROM' ABC ') || 'DEF' FROM DUAL;
--오른쪽 여백 제거' ABCDEF'
SELECT TRIM(TRAILING FROM' ABC ') || 'DEF' FROM DUAL;
-- 오른쪽 '_' 제거 '_____ ABCDEF'
SELECT TRIM(TRAILING '_' FROM'_____ABC_____') || 'DEF' FROM DUAL;
-- 왼쪽 * 제거 ABC*****
SELECT LTRIM('*****ABC*****','*') FROM DUAL;
ROUND-- 소수점 첫째짜리까지 출력 -> 소수점 둘째 자리에서 반올림 함
--123.5
SELECT ROUND(123.4567, 1) FROM DUAL;
-- 123.46
SELECT ROUND(123.4567, 2) FROM DUAL;

👩🏫자리수
1234.567 ===> 4자리가 0번, 왼쪽으로 -1 오른쪽으로 1
소수 부분이 양수
정수 부분이 음수
TRUNC: 절사
-- 0 기본값 생략 가능
SELECT TRUNC(12345.123456, 0) FROM DUAL; --12345
SELECT TRUNC(12345.123456, 1) FROM DUAL; --12345.1
SELECT TRUNC(12345,123456, -3) FROM DUAL --12000
CEIL: 올림
SELECT CEIL(123.4567) FROM DUAL; --124
FLOOR: 버림
SELECT FLOOR(123.678) FROM DUAL; --123
MOD: 나머지
SELECT MOD(10,3) FROM DUAL; -- 나머지: 1

DATE형 데이터
1) 날짜 데이터 + 숫자
2) 날짜 데이터 - 숫자

3) 날짜 데이터 - 날짜 데이터
🔽 경과 일수

* SYSDATE: 현재 시스템의 날짜 시간
4) 날짜 데이터 + 날짜 데이터 (불가)
SYSDATE 함수를 사용하여 날짜 출력하기
몇 개월 이후 날짜를 구하는 ADD_MONTHS 함수

두 날짜 간의 개월 수 차이를 구하는 MONTHS_BETWEEN 함수

돌아오는 요일, 달의 마지막 날짜를 구하는 NEXT_DAY, LAST_DAY 함수
NEXT_DAY(날짜, 요일): 다음 요일의 날짜
SELECT NEXT_DAY(SYSDATE,'목') "다음 목요일" FROM DUAL;-- 2024-5-16
참고) DAY: 요일
LAST_DAY(날짜): 날짜에 해당하는 월의 마지막 일자
-- 이번 달의 마지막 일자 2024-05-31
SELECT LAST_DAY(SYSDATE) "마지막 일자" FROM DUAL;
'2024-05-09': 문자 -> DATE형 변환
'1000': 문자 연산시 -> NUMBER 형으로 변환
-- 문자 연산시 NUMBER형으로 변환
SELECT '1000' + 200 FROM DUAL; --1200
📅📆형식
- 년도
YYYY -> 4자리 연도 : 2024
YY -> 2자리 연도 : 24
-⏱현재 속해있는 연도로 나옴
ex) 90-05-09 -> 2090-05-09
RRRR -> 4자리 연도
RR -> 2자리 연도
-⏱가장 가까운 연도로 나옴
ex) 90-05-09 -> 1990-05-09- 월
MM: 월- 일
DD: 일- 시간
HH24: 24시간 표기 시간
HH12 / HH: 12시간 표기 시간- 분
MI: 분- 초
SS: 초
TO_CHAR(): 숫자, 날짜 -> 형식화된 문자열
TO_NUMBER: 문자로 되어있는 형식화된 숫자('1,000')를 숫자형으로 바꿔준다.
SELECT TO_NUMBER('1,000','999,999')+ 200 FROM DUAL; --1200
SELECT TO_NUMBER('1,000,000','999,999,999')+ 200 FROM DUAL; --1000200
TO_DATE: 문자로 형식화된 날짜를 날짜형식으로 바꿔준다.
TO_DATE(문자열, 날짜, 형식)
SELECT * FROM EMP
WHERE HIREDATE
BETWEEN TO_DATE('01-01-1981', 'MM-DD-YYYY')
AND TO_DATE('12/31/1981', 'MM/DD/YYYY');
NVL 함수
NVL(컬럼, 기본값)
NVL2 함수
삼항조건 연산자와 비슷
NVL2(컬럼, NULL이 아닐때 값, NULL일때 값)

SELECT EMPNO, ENAME, JOB, SAL,
DECODE(JOB,
'MANAGER', SAL * 1.1,
'SALESMAN', SAL * 1.05,
'ANALYST', SAL,
SAL * 1.03)"내년 급여"
FROM EMP;-- 해당하지 않으면 SAL * 1.03

CASE WHEN THEN 구문

