• 데이터 항목을 조작합니다.
• 인수를 사용하고 하나의 값을 반환합니다.
• 반환되는 각 행에서 실행됩니다.
• 행당 하나의 결과를 반환합니다.
• 중첩될 수 있습니다.
• 단일 행 함수는 어떠한 레벨로도 중첩될 수 있습니다.
• 중첩 함수는 가장 깊은 레벨에서 덜 깊은 레벨로
평가됩니다.
- LOWER : 문자열 전부를 소문자로 변환
- UPPER : 문자열 전부를 대문자로 변환
- INITCAP : 앞 문자만 대문자, 나머지는 소문자 변환
- SUBSTR( '문자열', 처음 INDEX, 자를 문자열 길이 ) : 문자열 자를 때 사용하는 함수
- LENGTH( '문자열' ) : 문자열의 길이를 나타낼 때 사용하는 함수
- LENGTHB( '문자열' ) : 문자열의 길이를 BYTE로 나타낼 때 사용하는 함수
SELECT LENGTHB('홍길동'), LENGTH('홍길동') FROM DUAL;
- INSTR( '문자열', '문자' ) : 2번째 문자열 길이를 나타내는 함수
INSTR([대상 문자열 데이터(필수)], [위치를 찾으려는 부분 문자 (필수)], [위치 찾기를 시작할 대상 문자열 데이터 위치(선택, 기본값은 1)], [시작 위치에서 찾으려는 문자가 몇 번째인지 지정( 선택, 기본값은 1)])
- REPLACE 함수
REPLACE([문자열 데이터 또는 열 이름(필수)],[찾는 문자(필수)],[대체할 문자(선택)] ---------------------------------------------------------------------------- SELECT '010-1111-1111' AS REPLACE_BEFORE, REPLACE('010-1111-1111', '-', ' ') AS REPLACE_AFTER_1, REPLACE('010-1111-1111','-') AS REPLACE_AFTER_2 FROM DUAL;
- TRIM : 삭제할 문자가 생략될 경우에 DEFAULT로 공백을 제거.
TRIM([삭제 옵션(선택)][삭제할 문자(선택)]FROM [원본 문자열 데이터(필수)])
- LTRIM : 왼쪽 삭제할 문자가 있을 경우
- RTRIM : 오른쪽 삭제할 문자가 있을 경우
함수의 활용
- ADD_MONTHS를 사용해 1년후 - >
SELECT ADD_MONTHS(SYSDATE,12) FROM DUAL;
- 다음 날 날짜 뽑기 - >
SELECT (SYSDATE+1) FROM DUAL;
TO_CHAR 함수
: 날짜,숫자 등의 값을 문자열로 변환하는 함수
SELECT lnid, gender, bthday ,TO_CHAR(bthday,'MM/DD') ,TO_CHAR(bthday,'DD Month, YYYY') FROM tid WHERE id_typ = '1';
다양한 TO_CHAR의 활용법
- 날짜 포멧 변경 ( YYYY-MM-DD )
SELECT TO_CHAR(SYSDATE, 'YYYYMMDD') --20200723 , TO_CHAR(SYSDATE, 'YYYY/MM/DD') --2020/07/23 , TO_CHAR(SYSDATE, 'YYYY-MM-DD') --2020-07-23 , TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') --2020-07-23 11:10:52 FROM dual
--> YYYY: 년, MM: 월, DD: 일, HH24: 24시간, HH: 12시간, MI: 분, SS:초
- 소수점 변경
SELECT TO_CHAR(123.456, 'FM990.999') --123.456 , TO_CHAR(1234.56, 'FM9990.99') --1234.56 , TO_CHAR(0.12345, 'FM9990.99') --0.12 FROM dual
--> FM: 문자열의 공백제거 : 숫자의 최대 길이만큰 9999... 형식을 지정한다.
(9 : 값이 없으면 표시안함, 0: 값이 없으면 "0"으로 처리)
정수은 지정한 형식보다 값의 길이가 길면 오류, 소수 지정한 길이보다 길면 반올림
- 숫자의 천단위 콤마 찍기
SELECT TO_CHAR(123467, 'FM999,999') --123,467 , TO_CHAR(123467890, 'FM999,999,999') --123,467,890 , TO_CHAR(123467, 'FML999,999') --₩123,467 FROM dual
- 지정한 길이 만큼 "0"으로 채우기
SELECT TO_CHAR(123) --123 , TO_CHAR(123, 'FM00000') --00123 FROM dual
- 날짜의 "0" 없애기
SELECT TO_CHAR(SYSDATE, 'MM/DD') --07/03 , TO_CHAR(SYSDATE, 'FMMM/DD') --7/3 FROM dual
- 임의의 구분자로 날짜 형식 만들기
SELECT TO_CHAR(SYSDATE, '""YYYY"년 "MM"월 "DD"일"') --2020년 07월 23일 , TO_CHAR(SYSDATE, '""HH24"시 "MI"분 "SS"초"') --11시 12분 20초 FROM dual
- 시간의 오전, 오후 값 반환
SELECT TO_CHAR(SYSDATE, 'AM') --오전 , TO_CHAR(SYSDATE, 'AM HH:MI:SS') --오전 11:44:31 , TO_CHAR(SYSDATE, 'YYYY-MM-DD AMHH:MI:SS') --2020-07-23 오전11:44:31 FROM dual
- 날짜의 요일 반환
SELECT TO_CHAR(SYSDATE, 'D') --5 : 1(일)~7(토) , TO_CHAR(SYSDATE, 'DY') --목 , TO_CHAR(SYSDATE, 'DAY') --목요일 FROM dual
- 년기준 몇일, 몇주, 분기 반환
SELECT TO_CHAR(SYSDATE, 'DDD') --365일 기준 205일 , TO_CHAR(SYSDATE, 'WW') --1년 기준 30주 , TO_CHAR(SYSDATE, 'Q') --3분기 FROM dual
- 간편한 날짜 변환
SELECT TO_CHAR(SYSDATE, 'MON') --7월 , TO_CHAR(SYSDATE, 'DL') --2020년 7월 23일 목요일 FROM dual
- 다음은 TO_CHAR 함수와 함께 사용하여 숫자 값을 문자로
표시할 수 있는 몇 가지 형식 요소입니다.
- 기본적으로 데이터에는 값이 없으면 DEFAULT가 NULL 이다 그러므로 NVL 함수를 사용해 NULL 값을 0의 값으로 넣거나 원하는 값으로 임의로 넣어주는 함수
SELECT lnact, lnact_seq, acct_typ, lnid, ln_amt, rate ,TRUNC((ln_amt * rate) / 12) AS 이자1 ,TRUNC((ln_amt * NVL(rate,0)) / 12) AS 이자2 FROM tacct WHERE branch = '10';
- IF-THEN-ELSE 문 작업을 수행하여 조건부 조회를 편리하
게 수행하도록 합니다.SELECT lnid, bthday, score, gender, CASE gender WHEN '1' THEN '남' WHEN '2' THEN '여' ELSE '법인' END AS 성별 FROM tid WHERE id_typ = '1';
SELECT SUM(ln_amt), AVG(ln_amt),
MAX(ln_amt), MIN(ln_amt)
FROM tacct
WHERE lmt_typ IS NULL ;
SELECT MAX(ln_dt), MIN(ln_dt)
FROM tacct
WHERE lmt_typ IS NULL ;
SELECT branch, SUM(ln_amt)
FROM tacct
WHERE lmt_typ IS NULL
GROUP BY branch;
SELECT branch, prod_cd, SUM(ln_amt)
FROM tacct
WHERE lmt_typ IS NULL
GROUP BY branch, prod_cd ;
--> SELECT 하기위해 나타낼수 있는 컬럼의 수가 맞지 않아 나타나는 오류 ( 그룹함수를 통해 오류를 해결 )
• WHERE 절은 그룹을 제한하는 데 사용할 수 없습니다.
• 그룹을 제한하려면 HAVING 절을 사용합니다.
• WHERE 절에서 그룹 함수를 사용할 수 없습니다.
ROLLUP URL - https://velog.io/@dlghwns82/ORACLE-ROLLUP
-- > 이 그림을 보면, 두 테이블의 공통적인 컬럼을 통해 JOIN을 시켜 하나의 테이블 형태로 SELECT해서 가져 옴
SELECT a.lnid, a.id_typ, a.bthday,
b.lnact, b.lnact_seq, b.ln_dt, b.ln_amt
FROM tid a
JOIN tacct b
ON a.lnid = b.lnid
WHERE b.lmt_typ IS NULL
ORDER BY b.lnact, b.lnact_seq ;