--오라클의 내장함수(SQL함수)
-- -데이타에 대한 간단한계산
-- -날짜나 숫자의 형식을 반환
-- -개별 데이터의 수정
-- -행그룹에 대한 출력 결과 조작
--
--내장함수
-- - 단일 행 함수 : 행하나 하나마다 연산을 수행해서 결과를 반환한다.
-- 문자함수 : 텍스트 데이타에 대한 단순한 연산을 지원한다. 대/소문자변환, 길이, 특정문자의 위치, 잘라내기, 바꾸기
-- 문자값에 대한 간단한 처리를 지원하는 함수
-- 숫자함수 : 숫자데이타에 대한 단순한 연산을 지원한다. 반올림, 버리기, 나머지....
-- ROUND(컬럼/표현식,n)
-- 값을 n번째 자리로 반올림한다.
-- (n이 음수면 소숫점 왼쪽의 수가 반올림 된다.)
-- trunc(컬럼/표현식,n)
-- 값을 n번째 자리까지 남기고 버린다.
-- (h을 지정하지 않으면 기본값은 0)
-- mod(컬럼/표현식,n)
-- 값을 n으로 나눈 나머지 값을 반환한다.
-- floor(컬럼/표현식)
-- 값과 가장 근접한 작은정수
-- ceil(컬럼/표현식)
-- 값과 가장 근접한 큰 정수
-- 날짜함수 : 날짜데이타에 대한 단순한 연산을 지원한다, 현재시간 알아내기, 날짜간격
-- sysdate - 데이타베이스 서버의 현재 날짜 및 시간을 반환
-- - 새글 작성시, 예약할 때, 주문할때, 가입할때
-- months_between(날자1, 날자2)
-- 두날짜간의 개월수
-- add_months(날짜,n)
-- 날자에 n개월만큼 더한 날짜를 반환한다.
-- next_day(날짜,'요일')
-- 날짜보다 이후 날짜이며 지정된 요일에 해당하는 날짜
-- last_day(날짜)
-- 지정된 날짜가 포함된 날의 마지막 날짜
-- 날짜관련 연산
-- date + 숫자 => 숫자만큼의 이후 날짜
-- date + 숫자 => 숫자만큼의 이전 날짜
-- date - date => 두 날짜사이의 일 수
-- 변환함수 : '문자 <-> 숫자 ',' 문자 <-> 날짜 로 변환하는 함수
-- 일반함수 : 기타 다양한 기능을 지원하는 함수
-- - 복수 행 함수 : 행 그룹을 조작해서 행 그룹당 하나의 결과를 반환한다.(그룹함수)
--문자함수
SELECT LAST_NAME, UPPER(LAST_NAME) "대문자", LOWER(LAST_NAME) "소문자", CONCAT(FIRST_NAME, LAST_NAME) "이름합체",
LENGTH(LAST_NAME) "길이", LENGTHB(LAST_NAME) "바이트 길이", SUBSTR(LAST_NAME, 1, 2) "자르자", INSTR(LAST_NAME, 'L') "특정문자가몇번째?",
TRIM(LAST_NAME) "공백제거", REPLACE(LAST_NAME, 'A', 'Z') "바꾸자", LPAD(LAST_NAME, 10, '●') "왼쪽에 채우자",
RPAD(LAST_NAME, 10, '■') "오른쪽 채우자"
FROM EMPLOYEES
WHERE JOB_ID = 'IT_PROG';
--국번만 뽑기
SELECT TEL, SUBSTR(TEL,1, INSTR(TEL,')')-1) "국번"
FROM EMP2;
--주민번호 별표
SELECT REPLACE(SUBSTR(NAME,1,1), '서', '*') || SUBSTR(NAME,2,LENGTH(NAME))
FROM STUDENT;
--주민번호 별표
SELECT RPAD(SUBSTR(JUMIN,1,6)|| '-', 12, '*')
FROM STUDENT;
SELECT ROUND(45.925, 2), TRUNC(45.925, -1)
FROM DUAL;
SELECT ROUND(WEIGHT, 2)
FROM STUDENT;
--emp2 테이블에서 사원들의 월급을 출력하세요
SELECT EMPNO, (PAY/12) "월급"
FROM EMP2;
--(사원번호, 사원이름, 직위, 연봉, 월급을표시)
SELECT EMPNO, NAME, POSITION, PAY "연봉", (PAY/12) "월급"
FROM EMP2;
--(월급은 1000원 단위까지만 표시하시고 나머지는 버리세요.)
SELECT EMPNO, NAME, POSITION, PAY "연봉", TRUNC((PAY/12), -3) "월급"
FROM EMP2;
--number - 숫자(중수, 실수)
--char -고정길이 문자열
--varchar, varchar2 - 가변길이 문자열
--date - 날짜정도
--clob - 대용량 텍스트 데이타
--blob - 대용량 바이너리 데이타
SELECT ROUND(SYSDATE - to_date('1993-10-19','YYYY-MM-DD')) "얼마나 살았나 난"
FROM DUAL;
SELECT NAME, BIRTHDAY, ROUND(MONTHS_BETWEEN(SYSDATE, BIRTHDAY)) || '개월' "MONTHS"
FROM EMP2;
SELECT LAST_DAY(SYSDATE)--이번달의 마지막 날
FROM DUAL;
SELECT NEXT_DAY(SYSDATE, '월')
FROM DUAL;
--변환함수
-- to_char(날짜, '포맷형식')
-- 날짜 -> 문자
-- : 날짜정보를 적절한 형식의 텍스트로 변환
-- to_char(숫자, '포맷형식')
-- 숫자->문자
-- "숫자를3자리마다'.'를 넣어서 텍스트로 변환
-- 날짜포맷 형식
-- YYYY - 네자리 연도
-- MM - 두자리 값의 월
-- DD - 그달의 일
--
-- AM, PM - 오전/오후
-- HH, HH12, HH24 - 시간
-- M -분
-- SS -초
-- 숫자포맷 형식
-- 9 - 숫자를표시한다.
-- 0 - 0을강제로 표시한다.
-- $ - 달러표기를 표시한다.
-- . - 소수점을 표시한다.
-- , - 천단위 구분점을 표시한다.
--to_date(문자, '패턴')
-- 문자가 지정된 패턴으로 된 날짜표기라면 날짜로 변환한다.
--to_number(문자 '패턴')
-- 문자가 지정된 패턴으로 된 숫자 표기라면 숫자로 변환한다.
--날짜가 텍스트형태의 데이터 타입으로 변한것
SELECT TO_DATE('2014-04-25', 'YYYY-MM-DD')
FROM DUAL;
SELECT SYSDATE, TO_CHAR(SYSDATE, 'HH-MI-SS') "월일"
FROM DUAL;
SELECT NAME, TO_CHAR(BIRTHDAY, 'YY') || '년도생'
FROM EMP2;
SELECT NAME, TO_CHAR(BIRTHDAY, 'MM')
FROM EMP2;
--숫자가 콤마를 포함한 문자열로 변환 된것
SELECT TO_CHAR(1000000, '0,000,000')
FROM DUAL;
SELECT NAME, PAY, TO_CHAR(PAY, '00,000,000,000')
FROM EMP2;
--오라클의 묵시적 형변환
-- - 오라클이 알아서 값을 다른 형식을 변환하는것(단, 값이 변환하기에 적절한 값이라면)
SELECT *
FROM STUDENT
WHERE GRADE = '4';
--오라클의 명시적 형변환
-- 지정한 형식으로 사용자가 변환 하는것
-- 내가 살아온 일수를 계산하고싶어
-- (오늘 - 생일) -> (날짜) - (날짜)
SELECT ROUND(SYSDATE - TO_DATE('1984-10-21', 'YYYY-MM-DD'))
FROM DUAL;
--TO_NUMBER 문자 -> 숫자
SELECT TO_NUMBER('4') * TO_NUMBER('2,123', '9,999') AS 곱셈
FROM DUAL;
--기타함수
--NVL(NULL값이 존재한다면 지정한 값으로 대체)
--NULL 값이 계산에 참여하지 않게 하기위해
SELECT ENAME, NVL(COMM,0)
FROM EMP;
SELECT ENAME, SAL, (SAL*12) + NVL(COMM,0) AS PAY
FROM EMP;
SELECT ENAME, SAL, COMM, SAL*12 + NVL2(COMM,COMM + 200, 100) AS PAY
FROM EMP;
--DECODE
--IF문을 흉내낼 수 있다.
SELECT NAME, EMP_TYPE,
DECODE(
EMP_TYPE, '정규직', 200,
'계약직', 100,
'수습직', 70,
'인턴직', 50
) "뽀나리"
FROM EMP2;