
๐โโ๏ธ ํจ์(Function)๋,
ํ๋์ ํฐ ํ๋ก๊ทธ๋จ์์ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ถ๋ถ๋ค์ ๋ถ๋ฆฌํ์ฌ ์์ฑํด ๋์
์์ ์๋ธ ํ๋ก๊ทธ๋จ
- ์ปฌ๋ผ ๊ฐ์ ์ฝ์ด์ ๊ณ์ฐํ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํด
 
๐โโ๏ธ ๊ทธ๋ฃน(GROUP)ํจ์ & ๋จ์ผํ(SINGLE ROW)ํจ์๋,
- ๊ทธ๋ฃน(GROUP)ํจ์ : ์ปฌ๋ผ์ ๊ธฐ๋ก๋ N๊ฐ์ ๊ฐ์ ์ฝ์ด์ ํ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํด
 - ๋จ์ผํ(SINGLE ROW)ํจ์ : ์ปฌ๋ผ์ ๊ธฐ๋ก๋ N๊ฐ์ ๊ฐ์ ์ฝ์ด์ N๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํด
 - ๋ ํจ์๊ฐ ๋ฆฌํดํ๋ ํ์ ๊ฐฏ์๊ฐ ๋ค๋ฅด๋ฏ๋ก SELECT์ ์ ๋จ์ผํ ํจ์์ ๊ทธ๋ฃน ํจ์๋ฅผ ํจ๊ป ์ฌ์ฉํ ์ ์์
 
๐ ๊ทธ๋ฃน ํจ์์ ์ข ๋ฅ
1) SUM
2) AVG
3) MAX
4) MIN
5) COUNT
SUM(์ซ์๊ฐ ๊ธฐ๋ก๋ ์ปฌ๋ผ๋ช
) : ํฉ๊ณ๋ฅผ ๊ตฌํ์ฌ ๋ฆฌํด
SELECT
		SUM(SALARY)
   FROM EMPLOYEE;
AVG(์ซ์๊ฐ ๊ธฐ๋ก๋ ์ปฌ๋ผ๋ช
) : ํ๊ท ์ ๊ตฌํ์ฌ ๋ฆฌํด
SELECT
		AVG(SALARY)
   FROM EMPLOYEE;
MAX(์ปฌ๋ผ๋ช
) : ์ปฌ๋ผ์์ ๊ฐ์ฅ ํฐ ๊ฐ ๋ฆฌํด. ์ทจ๊ธํ๋ ์๋ฃํ์ ANY TYPE.
SELECT
		MAX(EMAIL)
      , MAX(HIRE_DATE)
      , MAX(SALARY)
   FROM EMPLOYEE;
MIN(์ปฌ๋ผ๋ช
) : ์ปฌ๋ผ์์ ๊ฐ์ฅ ์์ ๊ฐ ๋ฆฌํด. ์ทจ๊ธํ๋ ์๋ฃํ์ ANY TYPE.
SELECT
        MIN(EMAIL)
      , MIN(HIRE_DATE)
      , MIN(SALARY)
   FROM EMPLOYEE;
COUNT(* or ์ปฌ๋ผ๋ช
) : ํ์ ๊ฐฏ์๋ฅผ ํค์๋ ค์ ๋ฆฌํด
COUNT(*) : NULL์ ํฌํจํ ์ ์ฒด ํ ๊ฐฏ์ ๋ฆฌํด
COOUNT(์ปฌ๋ผ๋ช
) : NULL์ ์ ์ธํ ์ค์  ๊ฐ์ด ๊ธฐ๋ก๋ ํ ๊ฐฏ์ ๋ฆฌํด
COUNT(DISTINCT ์ปฌ๋ผ๋ช
) : ์ค๋ณต์ ์ ๊ฑฐํ ํ ๊ฐฏ์ ๋ฆฌํด
SELECT
        COUNT(*) 
    ,   COUNT(DEPT_CODE)			>>> NULL ์ ์ธํ ๊ฐ์ ํ ๊ฐฏ์
    ,   COUNT(DISTINCT DEPT_CODE)	>>> ์ค๋ณต์ ์ ๊ฑฐํ ํ ๊ฐฏ์
   FROM EMPLOYEE;
๐ ๋ฌธ์ ๊ด๋ จ ํจ์์ ์ข ๋ฅ
1) LENGTH / LENGTHB
2) INSTR
3) LPAD / RPAD
4) LTRIM / RTRIM
5) TRIM
6) SUBSTR
7) SUBSTRB
8) LOWER / UPPER / INITCAP
9) CONCAT
10) REPLACE
๐โโ๏ธ LENGTH / LENGTHB๋,
์ฃผ์ด์ง ์ปฌ๋ผ ๊ฐ or ๋ฌธ์์ด์ ๊ธธ์ด(byte)๋ฅผ ๋ฐํํ๋ ํจ์
SELECT
       LENGTH('์ค๋ผํด')
     , LENGTHB('์ค๋ผํด') >>> LENGTHB : byteํฌ๊ธฐ๋ฅผ ํฌํจํ ๊ธธ์ด
     					>>> ํ๊ธ์ ๊ธ์ ๋น 3byte์ด๋ฏ๋ก 9 ์ถ๋ ฅ
  FROM DUAL;
SELECT
       LENGTH(EMAIL)	>>> ์ด๋ฉ์ผ(์๋ฌธ)์ ๊ธธ์ด์ธ 17์ถ๋ ฅ
     , LENGTHB(EMAIL)	>>> ์๋ฌธ์ ๊ธ์๋น 1byte
  FROM EMPLOYEE;
๐โโ๏ธ INSTR๋,
์ฐพ๋ ๋ฌธ์(์ด)์ด ์ง์ ํ ์์น๋ถํฐ ์ง์ ํ ํ์๋งํผ ๋ํ๋ ์์ ์์น๋ฅผ ๋ฐํํ๋ ํจ์
INSTR('๋ฌธ์์ด'or ์ปฌ๋ผ๋ช
, '๋ฌธ์', ์ฐพ์ ์์น์ ์์๊ฐ, ๋น๋)
SELECT
       EMAIL
     , INSTR(EMAIL, '@', -1) ์์น
  FROM EMPLOYEE; 
  
SELECT INSTR('AABAACAABBAA', 'B') FROM DUAL;
SELECT INSTR('AABAACAABBAA', 'B', 1) FROM DUAL;  
SELECT INSTR('AABAACAABBAA', 'B', -1) FROM DUAL;
SELECT INSTR('AABAACAABBAA', 'B', 1, 2) FROM DUAL; 	>>> 'AABAACAABBAA'์์ ๋ ๋ฒ์งธ B๋ฅผ 1๋ฒ ์๋ฆฌ์์๋ถํฐ ์ฐพ๊ธฐ
SELECT INSTR('AABAACAABBAA', 'B', -1, 2) FROM DUAL;	>>> 'AABAACAABBAA'์์ ๋ ๋ฒ์งธ B๋ฅผ -1๋ฒ ์๋ฆฌ์์๋ถํฐ ์ฐพ๊ธฐ (๋งจ ๋ค์์ ๊ฐ๊น์ด ์)
๐โโ๏ธ LPAD / RPAD๋,
์ฃผ์ด์ง ์ปฌ๋ผ ๋ฌธ์์ด์ ์์์ ๋ฌธ์์ด์ ๋ง๋ถ์ฌ ๊ธธ์ด N์ ๋ฌธ์์ด์ ๋ฐํํ๋ ํจ์
SELECT
       LPAD(EMAIL, 20, '#')	>>> ์ด๋ฉ์ผ์ 20๊ธ์๋ก ์ฑ์ฐ๋๋ฐ, ๋น ๊ณณ์ '#'์ผ๋ก ์ฑ์ฐ๊ธฐ (์ผ์ชฝ) 
  FROM EMPLOYEE;
SELECT
       RPAD(EMAIL, 20, '#')	>>> ์ด๋ฉ์ผ์ 20๊ธ์๋ก ์ฑ์ฐ๋๋ฐ, ๋น ๊ณณ์ '#'์ผ๋ก ์ฑ์ฐ๊ธฐ (์ค๋ฅธ์ชฝ) 
  FROM EMPLOYEE;  
SELECT
       LPAD(EMAIL, 10)	>>> ์ด๋ฉ์ผ์ด 10๊ธ์๊น์ง๋ง ์ถ๋ ฅ๋๊ณ  ๋ค๋ ์๋ฆผ
  FROM EMPLOYEE;
SELECT
       RPAD(EMAIL, 10) >>> ์์ ๊ฐ์
  FROM EMPLOYEE;
๐โโ๏ธ LTRIM / RTRIM์ด๋,
์ฃผ์ด์ง ์ปฌ๋ผ์ด๋ ๋ฌธ์์ด ์ผ์ชฝ/์ค๋ฅธ์ชฝ์์ ์ง์ ํ ๋ฌธ์ ํน์ ๋ฌธ์์ด์ ์ ๊ฑฐํ ๋๋จธ์ง๋ฅผ ๋ฐํํ๋ ํจ์
SELECT LTRIM('   GREEDY') FROM DUAL;
SELECT LTRIM('   GREEDY', ' ') FROM DUAL; >>> ๊ณต๋ฐฑ์ ์ผ์ชฝ์์๋ถํฐ ์ ๊ฑฐ
SELECT LTRIM('000123456', '0') FROM DUAL; >>> 0์ ์ผ์ชฝ์์๋ถํฐ ์ ๊ฑฐ
SELECT LTRIM('123123GREEDY', '123') FROM DUAL;
SELECT LTRIM('132123GREEDY123', '123') FROM DUAL;	>>> 1 or 2 or 3์ ์ผ์ชฝ์์๋ถํฐ ์ ๊ฑฐ (๋งจ ์ค๋ฅธ์ชฝ 123์ ์ ๊ฑฐ X)
SELECT LTRIM('ACABACGREEDY', 'ABC') FROM DUAL;		>>> A or B or C๋ฅผ ์ผ์ชฝ์์๋ถํฐ ์ ๊ฑฐ
SELECT LTRIM('5782GREEDY', '0123456789') FROM DUAL;	>>> ์ผ์ชฝ์ ์๋ ์ซ์๋ฅผ ๋ชจ๋ ์ ๊ฑฐ
SELECT RTRIM('GREEDY   ') FROM DUAL;
SELECT RTRIM('GREEDY   ', ' ') FROM DUAL;
SELECT RTRIM('123456000', '0') FROM DUAL;
SELECT RTRIM('GREEDY123123', '123') FROM DUAL;
SELECT RTRIM('123123GREEDY123', '123') FROM DUAL; >>> 1 or 2 or 3์ ์ค๋ฅธ์ชฝ์์๋ถํฐ ์ ๊ฑฐ (๋งจ ์ผ์ชฝ 123123์ ์ ๊ฑฐ X)
SELECT RTRIM('GREEDYACABAC', 'ABC') FROM DUAL;
SELECT RTRIM('GREEDY5782', '0123456789') FROM DUAL;
๐โโ๏ธ TRIM์ด๋,
์ฃผ์ด์ง ์ปฌ๋ผ์ด๋ ๋ฌธ์์ด์ ์/๋ค์ ์ง์ ํ ๋ฌธ์๋ฅผ ์ ๊ฑฐ
SELECT TRIM('   GREEDY   ') FROM DUAL;
SELECT TRIM('Z' FROM 'ZZZGREEDYZZZ') FROM DUAL;		>>> 'ZZZGREEDYZZZ'์ผ๋ก๋ถํฐ Z๋ชจ๋ ์ ๊ฑฐ
SELECT TRIM(LEADING 'Z' FROM 'ZZZGREEDYZZZ') FROM DUAL;		>>> ์ผ์ชฝ์ Z๋ง ์ ๊ฑฐ
SELECT TRIM(TRAILING 'Z' FROM 'ZZZGREEDYZZZ') FROM DUAL;	>>> ์ค๋ฅธ์ชฝ์ Z๋ง ์ ๊ฑฐ
SELECT TRIM(BOTH 'Z' FROM 'ZZZGREEDYZZZ') FROM DUAL;		>>> ์์ชฝ์ Z๋ง ์ ๊ฑฐ
๐โโ๏ธ SUBSTR์ด๋,
์ปฌ๋ผ์ด๋ ๋ฌธ์์ด์์ ์ง์ ํ ์์น๋ก๋ถํฐ ์ง์ ํ ๊ฐฏ์์ ๋ฌธ์์ด์ ์๋ผ์ ๋ฆฌํดํ๋ ํจ์
SELECT SUBSTR('SHOWMETHEMONEY', 5, 2) FROM DUAL;	>>> ๋ค์ฏ๋ฒ์งธ ์๋ฆฌ๋ถํฐ 2๊ธ์ ์ถ๋ ฅ
SELECT SUBSTR('SHOWMETHEMONEY', 7) FROM DUAL;		>>> ์ผ๊ณฑ๋ฒ์งธ ์๋ฆฌ๋ถํฐ ๋๊น์ง
SELECT SUBSTR('SHOWMETHEMONEY', -8, 3) FROM DUAL;	>>> ๋ค์์ ์ฌ๋๋ฒ์งธ ์๋ฆฌ๋ถํฐ 3๊ธ์ ์ถ๋ ฅ
SELECT SUBSTR('์ผ์ฐ ๋ฏธ ๋ ๋จธ๋', 2, 5) FROM DUAL;		>>> ํ๊ธ๋ ์๋ฌธ์ฒ๋ผ ํ ๊ธ์์ฉ ์ทจ๊ธ๋์ด '์ฐ ๋ฏธ ๋'์ถ๋ ฅ
SELECT
        EMP_NAME ์ฌ์๋ช
    ,   SUBSTR(EMP_NO, 1, 2) ์๋
    ,   SUBSTR(EMP_NO, 3, 2) ์์
    ,   SUBSTR(EMP_NO, 5, 2) ์์ผ
   FROM EMPLOYEE;
SELECT
        HIRE_DATE
    ,   SUBSTR(HIRE_DATE, 1, 2) ์
์ฌ๋
๋
    ,   SUBSTR(HIRE_DATE, 4, 2) ์
์ฌ์
    ,   SUBSTR(HIRE_DATE, 7, 2) ์
์ฌ์ผ
   FROM EMPLOYEE;
SELECT
		*
   FROM EMPLOYEE
  WHERE SUBSTR(EMP_NO, 8, 1) = '2';
SELECT
        *
   FROM EMPLOYEE
  WHERE AVG(SALARY) > 100;
    >>> '๊ทธ๋ฃน ํจ์๋ ํ๊ฐ๋์ง ์์ต๋๋ค' ์ค๋ฅ (์กฐ๊ฑด์ ํน์ ํ  ์ ์์ผ๋ฏ๋ก)
SELECT
        EMP_NAME
    ,   RPAD(SUBSTR(EMP_NO, 1, 7), 14, '*') 
    	>>> 1 ~ 7 ์๋ฆฌ๊น์ง๋ง ์๋ผ๋ด๊ณ  ์ ์ฒด๋ฅผ 14์๋ฆฌ๋ก ๊ณ ์ ํ๋ฉฐ ๋จ์ ์๋ฆฌ๋ *๋ก ์ฑ์ฐ๊ธฐ
   FROM EMPLOYEE;
SELECT
        EMP_NAME
    ,   EMAIL
    ,   SUBSTR(EMAIL, 1, INSTR(EMAIL, '@')-1) ์์ด๋ -- -1 : @์ ์๊น์ง
   FROM EMPLOYEE;
๐โโ๏ธ SUBSTRB๋,
๋ฌธ์์ด์ ์๋ผ์ ๋ฐ์ดํธ ๋จ์๋ก ๋ฆฌํดํ๋ ํจ์
SELECT 
       SUBSTR('ORACLE', 3, 2)
     , SUBSTRB('ORACLE', 3, 2)	>>> ์์ ์ฐจ์ด๊ฐ ์์(์๋ฌธ์ 1byte)
  FROM DUAL;
SELECT 
       SUBSTR('์ค๋ผํด', 2, 2)
     , SUBSTRB('์ค๋ผํด', 4, 6)	>>> 4๋ฒ์งธ ์๋ฆฌ์ธ '๋ผ'๋ถํฐ 6byte ์ถ๋ ฅ
     							>>> '๋ผํด' ์ถ๋ ฅ
  FROM DUAL;  
๐โโ๏ธ LOWER / UPPER / INITCAP์ด๋,
์ปฌ๋ผ์ ๋ฌธ์ ํน์ ๋ฌธ์์ด์ ์๋ฌธ์/๋๋ฌธ์/์ฒซ ๊ธ์๋ง ๋๋ฌธ์๋ก ๋ณํํ์ฌ ๋ฆฌํดํ๋ ํจ์
LOWER(๋ฌธ์์ด or ์ปฌ๋ผ) : ์๋ฌธ์๋ก ๋ณ๊ฒฝํด์ฃผ๋ ํจ์
SELECT
       LOWER('Welcome To My World')
  FROM DUAL;
UPPER(๋ฌธ์์ด or ์ปฌ๋ผ) : ๋๋ฌธ์๋ก ๋ณ๊ฒฝํด์ฃผ๋ ํจ์
SELECT
       UPPER('Welcome To My World')
  FROM DUAL;
INITCAP(๋ฌธ์์ด or ์ปฌ๋ผ) : ์ ๊ธ์๋ง ๋๋ฌธ์๋ก ๋ณ๊ฒฝํด์ฃผ๋ ํจ์
SELECT
       INITCAP('welcome to my world')
  FROM DUAL;
๐โโ๏ธ CONCAT์ด๋,
๋ฌธ์์ด ํน์ ์ปฌ๋ผ ๋ ๊ฐ๋ฅผ ์ ๋ ฅ ๋ฐ์ ํ๋๋ก ํฉ์น ๋ค, ๋ฆฌํดํ๋ ํจ์
SELECT
       CONCAT('๊ฐ๋๋ค๋ผ', 'ABCD')
  FROM DUAL;
SELECT
       '๊ฐ๋๋ค๋ผ' || 'ABCD'		>>> ์์ ๋์ผ (๋ณํฉ)
  FROM DUAL;
๐โโ๏ธ REPLACE๋,
์ปฌ๋ผ ํน์ ๋ฌธ์์ด์ ์ ๋ ฅ ๋ฐ์ ๋ณ๊ฒฝํ๊ณ ์ ํ๋ ๋ฌธ์์ด์ ๋ณ๊ฒฝํ๋ ค๊ณ ํ๋ ๋ฌธ์์ด๋ก ๋ฐ๊พผ ๋ค, ๋ฆฌํด
SELECT
       REPLACE('์์ธ์ ๊ฐ๋จ๊ตฌ ์ญ์ผ๋', '์ญ์ผ๋', '์ผ์ฑ๋') 
       					>>> ๋ฌธ์์ด ์์ ์ญ์ผ๋์ ์ผ์ฑ๋์ผ๋ก ๋ณ๊ฒฝ
  FROM DUAL;
๐ ์ซ์ ์ฒ๋ฆฌ ํจ์์ ์ข ๋ฅ
1) ABS
2) MOD
3) ROUND
4) FLOOR
5) TRUNC
6) CEIL
ABS(์ซ์ or ์ซ์๋ก ๋ ์ปฌ๋ผ๋ช
) : ์ ๋๊ฐ ๊ตฌํ๋ ํจ์
SELECT
       ABS(-10)
     , ABS(10)
  FROM DUAL;
MOD(์ซ์ or ์ซ์๋ก ๋ ์ปฌ๋ผ๋ช
, ์ซ์ or ์ซ์๋ก ๋ ์ปฌ๋ผ๋ช
)
: ๋ ์๋ฅผ ๋๋์ด์ ๋๋จธ์ง๋ฅผ ๊ตฌํ๋ ํจ์ (์ฒ์ ์ธ์๋ ๋๋์ด์ง๋ ์, ๋ ๋ฒ์งธ ์ธ์๋ ๋๋ ์)
SELECT 
       MOD(10, 5)
     , MOD(10, 3) >>> 10์ 3์ผ๋ก ๋๋ ๋๋จธ์ง ์ถ๋ ฅ
  FROM DUAL;
ROUND(์ซ์ or ์ซ์๋ก ๋ ์ปฌ๋ผ๋ช
, ์์น)  : ๋ฐ์ฌ๋ฆผํด์ ๋ฆฌํดํ๋ ํจ์
SELECT ROUND(123.456) FROM DUAL;
SELECT ROUND(123.456, 0) FROM DUAL;
SELECT ROUND(123.456, 1) FROM DUAL;		>>> ์์์  ์ฒซ๋ฒ์งธ์๋ฆฌ๊น์ง ๋ฐ์ฌ๋ฆผํ์ฌ ์ถ๋ ฅ
SELECT ROUND(123.456, 2) FROM DUAL;
SELECT ROUND(123.456, -2) FROM DUAL;	>>> 10์ ์๋ฆฌ์์ ๋ฐ์ฌ๋ฆผํ์ฌ ์ถ๋ ฅ
										>>> 100์ถ๋ ฅ
FLOOR(์ซ์ or ์ซ์๋ก ๋ ์ปฌ๋ผ๋ช
) : ๋ด๋ฆผ์ฒ๋ฆฌ ํจ์
SELECT FLOOR(123.456) FROM DUAL;
SELECT FLOOR(123.678) FROM DUAL;	>>> ๋ฌด์กฐ๊ฑด ๋ด๋ฆผ
TRUNC(์ซ์ or ์ซ์๋ก ๋ ์ปฌ๋ผ๋ช
, ์์น) : ๋ด๋ฆผ์ฒ๋ฆฌ ํจ์ (์์น์ง์ ๊ฐ๋ฅ)
SELECT TRUNC(123.456) FROM DUAL;
SELECT TRUNC(123.678) FROM DUAL;
SELECT TRUNC(123.456, 1) FROM DUAL;
SELECT TRUNC(123.456, 2) FROM DUAL;		>>> ๋ฐ์ฌ๋ฆผ์ด ์๋ ์์์  ๋๋ฒ์งธ์๋ฆฌ๊น์ง๋ง ๋จ๊ธฐ๊ณ  ์๋ฆ
SELECT TRUNC(123.456, -1) FROM DUAL;	>>> 1์ ์๋ฆฌ์์ ๋ด๋ฆผํ์ฌ ์ถ๋ ฅ
										>>> 120 ์ถ๋ ฅ
CEIL(์ซ์ or ์ซ์๋ก ๋ ์ปฌ๋ผ๋ช
) : ์ฌ๋ฆผ์ฒ๋ฆฌ ํจ์
SELECT CEIL(123.456) FROM DUAL;		>>> ๋ฌด์กฐ๊ฑด ์ฌ๋ฆผ
SELECT CEIL(123.678) FROM DUAL; 
๐ ๋ ์ง ์ฒ๋ฆฌ ํจ์์ ์ข ๋ฅ
1) SYSDATE
2) MONTHS_BETWEEN
3) ADD_MONTHS
4) NEXT_DAY
5) LAST_DAY
6) EXTRACT
๐โโ๏ธ SYSDATE๋,
์์คํ ์ ์ ์ฅ๋์ด ์๋ ๋ ์ง๋ฅผ ๋ฐํํ๋ ํจ์
SELECT SYSDATE FROM DUAL;	>>> ๋ ์ง ๋ฟ๋ง ์๋๋ผ ์๊ฐ๋ ์ถ๋ ฅ๋จ
MONTHS_BETWEEN(๋ ์ง, ๋ ์ง) : ๋ ๋ ์ง์ ๊ฐ์ ์ ์ฐจ์ด๋ฅผ ์ซ์๋ก ๋ฆฌํด
SELECT
        EMP_NAME
    ,   HIRE_DATE
    ,   CEIL(MONTHS_BETWEEN(SYSDATE, HIRE_DATE)) >>> ์ง๊ธ ํ์ฌ์ ๊ณ ์ฉ๋ ์ง์ ๊ฐ์ ์ ์ฐจ์ด ์ถ๋ ฅ
   FROM EMPLOYEE;
ADD_MONTHS(๋ ์ง, ์ซ์) : ๋ ์ง์ ์ซ์๋งํผ ๊ฐ์ ์ ๋ํด์ ๋ ์ง๋ก ๋ฆฌํด
SELECT
        ADD_MONTHS(SYSDATE, 5)	>>> ํ์ฌ ๋ ์ง์ 5๊ฐ์ ๋ํ ๊ฐ ์ถ๋ ฅ
   FROM DUAL;
SELECT
        *
   FROM EMPLOYEE
--WHERE MONTHS_BETWEEN(SYSDATE, HIRE_DATE) >= 240;
  WHERE ADD_MONTHS(HIRE_DATE, 240) <= SYSDATE;	>>> ์ ์๊ณผ ๋์ผํ ๊ฒฐ๊ณผ
NEXT_DAY(๊ธฐ์ค๋ ์ง, ์์ผ(๋ฌธ์ or ์ซ์)) : ๊ธฐ์ค ๋ ์ง์์ ๊ตฌํ๋ ค๋ ์์ผ์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ์ง ๋ฆฌํด
SELECT SYSDATE, NEXT_DAY(SYSDATE, '๊ธ์์ผ') FROM DUAL;
SELECT SYSDATE, NEXT_DAY(SYSDATE, '๊ธ') FROM DUAL;
SELECT SYSDATE, NEXT_DAY(SYSDATE, 6) FROM DUAL;	>>> ์ซ์๋ 1~7์ด๋ฉฐ ์ผ์์ผ๋ถํฐ ์์
SELECT SYSDATE, NEXT_DAY(SYSDATE, 'FRIDAY') FROM DUAL;	>>> ํ์ฌ ์์คํ
 ์ค์ ์ด ํ๊ธ์ด๊ธฐ ๋๋ฌธ์ ์๋ฌธ์ X
-- ์์คํ
 ํ๊ฒฝ์ ๋ฐ๋ผ ์ธ์ด๊ฐ ์ค์ ๋์ด์์ผ๋ฏ๋ก ๋ณ๊ฒฝ์ ์ํ๋ฉด ์ค์ ์ ๋ณ๊ฒฝํด์ ์ฌ์ฉ
ALTER SESSION SET NLS_LANGUAGE = AMERICAN;	>>> ์์คํ
 ์ค์ ์ ์๋ฌธ์ผ๋ก ๋ฐ๊ฟ
SELECT SYSDATE, NEXT_DAY(SYSDATE, 'FRIDAY') FROM DUAL;
SELECT SYSDATE, NEXT_DAY(SYSDATE, '๊ธ์์ผ') FROM DUAL;	>>> ํ์ฌ ์์คํ
 ์ค์ ์ด ์๋ฌธ์ด๊ธฐ ๋๋ฌธ์ ํ๊ธ์ X
ALTER SESSION SET NLS_LANGUAGE = KOREAN; 	>>> ์์คํ
 ์ค์ ์ ๋ค์ ํ๊ธ๋ก ๋ฐ๊ฟ
LAST_DAY(๋ ์ง) : ํด๋น ์์ ๋ง์ง๋ง ๋ ์ง๋ฅผ ๊ตฌํ์ฌ ๋ฆฌํด
SELECT SYSDATE, LAST_DAY(SYSDATE) FROM DUAL;
SELECT
        EMP_NAME
    ,   HIRE_DATE
    ,   LAST_DAY(HIRE_DATE) - HIRE_DATE + 1 "์
์ฌ์์ ๊ทผ๋ฌด์ผ์"
    								>>> + 1 : ์ผํ ์ฒซ๋ ์ ํฌํจํ์ฌ ์ธ๊ธฐ ์ํจ
   FROM EMPLOYEE;
EXTRACT : ๋
, ์, ์ผ ์ ๋ณด๋ฅผ ์ถ์ถํ์ฌ ๋ฆฌํดํ๋ ํจ์
EXTRACT(YEAR FROM ๋ ์ง) : ๋
๋๋ง ์ถ์ถ
EXTRACT(MONTH FROM ๋ ์ง) : ์๋ง ์ถ์ถ
EXTRACT(DAY FROM ๋ ์ง) : ์ผ๋ง ์ถ์ถ
SELECT
        EXTRACT(YEAR FROM SYSDATE) ๋
๋
    ,   EXTRACT(MONTH FROM SYSDATE) ์
    ,   EXTRACT(DAY FROM SYSDATE) ์ผ
   FROM DUAL;
SELECT
        EMP_NAME
    ,   HIRE_DATE
    ,   EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM HIRE_DATE)
   FROM EMPLOYEE;
SELECT
        EMP_NAME
    ,   HIRE_DATE
--  ,   MONTHS_BETWEEN(SYSDATE, HIRE_DATE) "๋ง ๊ทผ๋ฌด๋
์" >>> ๊ฐ์ ์์ ์ฐจ์ด ๋ฐํ
    ,   FLOOR(MONTHS_BETWEEN(SYSDATE, HIRE_DATE) / 12) "๋ง ๊ทผ๋ฌด๋
์"
    						>>> ๊ฐ์ ์์ ์ฐจ๋ฅผ 12๋ก ๋๋์ด ๋
์ผ๋ก ๋ง๋ค๊ณ  ๋ด๋ฆผ์ฒ๋ฆฌ
   FROM EMPLOYEE;
๐ ํ๋ณํ ํจ์์ ์ข ๋ฅ
1) TO_CHAR
2) TO_DATE
3) TO_NUMBER
TO_CHAR(๋ ์ง, ํฌ๋งท) : ๋ ์งํ ๋ฐ์ดํฐ๋ฅผ ๋ฌธ์ํ ๋ฐ์ดํฐ๋ก ๋ณ๊ฒฝ
TO_CHAR(์ซ์, ํฌ๋งท) : ์ซ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ฌธ์ํ ๋ฐ์ดํฐ๋ก ๋ณ๊ฒฝ
SELECT TO_CHAR(1234) FROM DUAL;             >>> 1234๊ฐ ๋ฌธ์์ด๋ก ๋ฐ๋์ด์๋ ์ํ
SELECT TO_CHAR(1234, '99999') FROM DUAL;    >>> ๋ค์ฏ์๋ฆฌ์ด๋ ๊ณต๋ฐฑ1234 ์ถ๋ ฅ
SELECT TO_CHAR(1234, '00000') FROM DUAL;    >>> ๋ค์ฏ์๋ฆฌ์ด๋ 01234 ์ถ๋ ฅ
SELECT TO_CHAR(1234, 'L99999') FROM DUAL;   >>> ์ ํํ ํ๊ธฐ
SELECT TO_CHAR(1234, '$99999') FROM DUAL;   >>> ๋ฌ๋ฌ ํํ ํ๊ธฐ
SELECT TO_CHAR(1234, '00,000') FROM DUAL;   >>> 01,234 ์ถ๋ ฅ
SELECT TO_CHAR(1234, '999') FROM DUAL;      >>> ํ๊ธฐ ๋ถ๊ฐ
SELECT
        EMP_NAME
    ,   TO_CHAR(SALARY, 'L9,999,999')   >>> ์ด์ฒ๋ผ TO_CHAR๋ ํฌ๋งท ๋ฌธ์์ด์ ์ฌ์ฉํ๊ธฐ ์ํจ
    FROM EMPLOYEE;
SELECT TO_CHAR(SYSDATE, 'PM HH24:MI:SS') FROM DUAL; 	>>> ์คํ 1์ = 13์๋ก ํ๊ธฐ
SELECT TO_CHAR(SYSDATE, 'AM HH:MI:SS') FROM DUAL; 		>>> ์คํ 1์ = 1์๋ก ํ๊ธฐ
SELECT TO_CHAR(SYSDATE, 'MON DY, YYYY') FROM DUAL;
SELECT TO_CHAR(SYSDATE, 'YYYY-fmMM-DD DAY') FROM DUAL;  >>> fm : 01์ด ์๋ 1๋ก ํ๊ธฐ
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD DAY') FROM DUAL; 	>>> fm์ด ์์ด 01๋ก ํ๊ธฐ
SELECT TO_CHAR(SYSDATE, 'YEAR, Q') || '๋ถ๊ธฐ' FROM DUAL;	>>> ex) TWENTY TWENTY-THREE, 1๋ถ๊ธฐ 
SELECT
       EMP_NAME
     , TO_CHAR(HIRE_DATE, 'YYYY-MM-DD') ์
์ฌ์ผ
  FROM EMPLOYEE;
SELECT
       EMP_NAME
     , TO_CHAR(HIRE_DATE, 'YYYY"๋
" MM"์" DD"์ผ"') ์
์ฌ์ผ
     						>>> ํ๋ฐ์ดํ ์์ ์๋ฐ์ดํ๋ก ๋ฌธ์ ๋ฃ์ ์ ์์
  FROM EMPLOYEE;
SELECT
       EMP_NAME
     , TO_CHAR(HIRE_DATE, 'YYYY/MM/DD HH24:MI:SS') ์์ธ์
์ฌ์ผ
  FROM EMPLOYEE;
SELECT
       TO_CHAR(SYSDATE, 'YYYY')
     , TO_CHAR(SYSDATE, 'RRRR')
     , TO_CHAR(SYSDATE, 'YY')
     , TO_CHAR(SYSDATE, 'RR')
     , TO_CHAR(SYSDATE, 'YEAR')
  FROM DUAL;
RR์ ๋์๋ฆฌ ๋ ๋๋ฅผ ๋ค์๋ฆฌ๋ก ๋ฐ๊ฟ ๋ ๋ฐ๊ฟ ๋ ๋๊ฐ 50๋  ๋ฏธ๋ง์ด๋ฉด 2000๋ ์ ์ ์ฉํ๊ณ 50๋  ์ด์์ด๋ฉด 1900๋ ์ ์ ์ฉ.
YY๋ ๋ ๋๋ฅผ ๋ฐ๊ฟ ๋ ๋ฌด์กฐ๊ฑด ํ์ฌ ์ธ๊ธฐ(2000๋ )๋ฅผ ์ ์ฉ.
SELECT
       TO_CHAR(TO_DATE('980630', 'YYMMDD'), 'YYYY-MM-DD') >>> YY : 2098-06-30 ์ถ๋ ฅ
  FROM DUAL; 
SELECT
       TO_CHAR(TO_DATE('980630', 'RRMMDD'), 'YYYY-MM-DD') >>> RR : 1998-06-30 ์ถ๋ ฅ
  FROM DUAL; 
SELECT
       TO_CHAR(SYSDATE, 'MM')
     , TO_CHAR(SYSDATE, 'MONTH')
     , TO_CHAR(SYSDATE, 'MON')  >>> MONTH์ ๋์ผํ ์ถ๋ ฅ
     , TO_CHAR(SYSDATE, 'RM')   >>> ๋ก๋ง๋ฌธ์ํ๊ธฐ
  FROM DUAL;
SELECT
       TO_CHAR(SYSDATE, '"1๋
 ๊ธฐ์ค " DDD"์ผ ์งธ"')    >>> ๋
     , TO_CHAR(SYSDATE, '"๋ฌ ๊ธฐ์ค " DD"์ผ ์งธ"')      >>> ๋ฌ
     , TO_CHAR(SYSDATE, '"์ฃผ ๊ธฐ์ค " D"์ผ ์งธ"')       >>> ์ฃผ
  FROM DUAL;
SELECT
       TO_CHAR(SYSDATE, 'Q"๋ถ๊ธฐ"')
     , TO_CHAR(SYSDATE, 'DAY')	>>> 'ํ ์์ผ' ์ถ๋ ฅ
     , TO_CHAR(SYSDATE, 'DY')	>>> 'ํ ' ์ถ๋ ฅ
  FROM DUAL;
SELECT
        EMP_NAME
    ,   TO_CHAR(HIRE_DATE, 'YYYY"๋
" fmMM"์" DD"์ผ" "("DY")"')
    								>>> ์์ 0์ ํ๊ธฐํ์ง์๊ธฐ ์ํด fm ์
๋ ฅ
   FROM EMPLOYEE;
TO_DATE(๋ฌธ์, ํฌ๋งท) : ๋ฌธ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ ์งํ ๋ฐ์ดํฐ๋ก ๋ณ๊ฒฝ
TO_DATE(์ซ์, ํฌ๋งท) : ์ซ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ ์งํ ๋ฐ์ดํฐ๋ก ๋ณ๊ฒฝ
SELECT
       TO_DATE('20100101', 'RRRRMMDD') >>> 10/01/01 ์ถ๋ ฅ
  FROM DUAL;
SELECT
       TO_CHAR(TO_DATE('20100101', 'RRRRMMDD'), 'RRRR, MON') >>> ๋ ์ง ๋ฐ์ดํฐ๋ก ๋ฐ๊พผ ๋ค, 
       														 >>> CHAR ํํ๋ก ๋ค์ ๋ณํ
                                                             >>> '2010, 1์' ์ถ๋ ฅ
  FROM DUAL;
SELECT
       TO_DATE('041030 143000', 'RRMMDD HH24MISS')
  FROM DUAL;
SELECT
       TO_CHAR(TO_DATE('041030 143000', 'RRMMDD HH24MISS'), 'DD-MON-RRRR HH:MI:SS PM')
       													 >>> 30-10์-2004 02:30:00 ์คํ ์ถ๋ ฅ
  FROM DUAL;
SELECT
        EMP_NO
    ,   EMP_NAME
    ,   HIRE_DATE
   FROM EMPLOYEE
--WHERE HIRE_DATE >= TO_DATE('20000101', 'RRRRMMDD');
--WHERE HIRE_DATE >= '20000101';					>>> ์์ ๊ฐ์ ๊ฒฐ๊ณผ (๋ฌธ์์ด์ ๋ ์ง๋ก ์๋ ํ๋ณํ)
--WHERE HIRE_DATE >= TO_DATE(20000101, 'RRRRMMDD'); >>> ์์ ๊ฐ์ ๊ฒฐ๊ณผ
  WHERE HIRE_DATE >= 20000101;
  >>> ์๋ ํ๋ณํ์ด ๋์ง์์ '์ผ๊ด์ฑ ์๋ ๋ฐ์ดํฐ ์ ํ: DATE์ด(๊ฐ) ํ์ํ์ง๋ง NUMBER์' ์ค๋ฅ
  >>> ์ซ์๋ ๋ ์ง๋ก ์๋ ํ๋ณํ X
 ๐ Ref.  
* ๋ฌธ์์ด์ '๋ ์ง'๋ก ์๋ ํ๋ณํ O
* ์ซ์๋ '๋ ์ง'๋ก ์๋ ํ๋ณํ X
TO_NUMBER(๋ฌธ์, ํฌ๋งท) : ๋ฌธ์ํ ๋ฐ์ดํฐ๋ฅผ ์ซ์ํ ๋ฐ์ดํฐ๋ก ๋ณ๊ฒฝ
SELECT TO_NUMBER('123456789') FROM DUAL;
SELECT '123' + '456' FROM DUAL;	 >>> 123456์ด ์๋ 579 ์ถ๋ ฅ (๊ฐ๊ฐ ์๋ฆฌ์๋ผ๋ฆฌ ๋ํด์ ธ ์ฐ์ฐ๊ฒฐ๊ณผ ์ถ๋ ฅ)
SELECT '123' + '456A' FROM DUAL; >>> '์์น๊ฐ ๋ถ์ ํฉํฉ๋๋ค' ์ค๋ฅ
								 >>> ์ซ์๋ก ๋ ๋ฌธ์์ด๋ง ์๋ ํ๋ณํ ๊ฐ๋ฅ
SELECT
       EMP_NAME
     , HIRE_DATE
  FROM EMPLOYEE
 WHERE HIRE_DATE = '90/02/06';	>>> ์๋ ํ๋ณํ
SELECT
       *
  FROM EMPLOYEE
 WHERE MOD(EMP_ID, 2) = 1; >>> EMP_ID๋ผ๋ ๋ฌธ์์ด์ ์ซ์๋ก ์๋ ํ๋ณํํ์ฌ ์ฐ์ฐํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅ
SELECT '1,000,000' + '500,000' FROM DUAL;	>>> ์๋ ํ๋ณํX (ํฌ๋งท๋ ์ซ์์ด๊ธฐ ๋๋ฌธ์) 
											>>> ์๋์ ์์ฒ๋ผ TO_NUMBER ์ฌ์ฉํด์ผํจ
SELECT 
       TO_NUMBER('1,000,000', '99,999,999') + TO_NUMBER('500,000', '999,999')
  FROM DUAL;
SELECT
        EMP_NAME
    ,   EMP_NO
    ,   SUBSTR(EMP_NO, 1, 6) ์์๋ฆฌ
    ,   SUBSTR(EMP_NO, 8) ๋ท์๋ฆฌ
    ,   TO_NUMBER(SUBSTR(EMP_NO, 1, 6)) + TO_NUMBER(SUBSTR(EMP_NO, 8)) ๊ฒฐ๊ณผ
    	>>> TO_NUMBER๊ฐ ์์ด๋ ์๋ํ๋ณํ์ด ๋์ด ์ถ๋ ฅ๋ฌธ์ ๊ฐ์
    FROM EMPLOYEE
    WHERE EMP_ID = TO_CHAR(201);
    >>> EMP_ID๊ฐ ๋ฌธ์์ด์ด๋ฏ๋ก TO_CHAR ์ฌ์ฉ (but, ๊ธฐ์
ํ์ง์์๋ ์๋ ํ๋ณํ์ด ๋๊ธด ๋จ)
 ๐ Ref.  
* ๋ช
์ํ์ง ์์์ ๊ฒฝ์ฐ, ์๋ ํ๋ณํ์ด ๋๊ธฐ ๋๋ฌธ์ ๋์ํ๋ค๋ ๊ฒ์ ํญ์ ์ธ์ํ๊ณ ์์ด์ผํจ
NVL(์ปฌ๋ผ๋ช
, ์ปฌ๋ผ๊ฐ์ด NULL์ผ ๋ ๋ฐ๊ฟ ๊ฐ)
SELECT
        EMP_NAME
    ,   BONUS
    ,   NVL(BONUS, 0) >>> NULL๊ฐ์ด 0์ผ๋ก ์นํ๋์ด ์ถ๋ ฅ
   FROM EMPLOYEE;
NVL2(์ปฌ๋ผ๋ช
, ๋ฐ๊ฟ ๊ฐ1, ๋ฐ๊ฟ ๊ฐ2)
: ํด๋น ์ปฌ๋ผ์ด ๊ฐ์ด ์์ผ๋ฉด ๋ฐ๊ฟ ๊ฐ1๋ก ๋ณ๊ฒฝ, ํด๋น ์ปฌ๋ผ์ด NULL์ด๋ฉด ๋ฐ๊ฟ ๊ฐ2๋ก ๋ณ๊ฒฝ
SELECT
        EMP_NAME
    ,   BONUS
    ,   NVL2(BONUS, 0.7, 0.5)
    FROM EMPLOYEE;
๐โ DECODE๋,
์ฌ๋ฌ ๊ฐ์ง ๊ฒฝ์ฐ์ ์ ํ์ ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณต (์ผ์นํ๋ ๊ฐ)
DECODE(๊ณ์ฐ์ or ์ปฌ๋ผ๋ช , ์กฐ๊ฑด๊ฐ1, ์ ํ๊ฐ1, ์กฐ๊ฑด๊ฐ2, ์ ํ๊ฐ2 ...)
SELECT
        EMP_ID
    ,   EMP_NAME
    ,   EMP_NO
    ,   DECODE(SUBSTR(EMP_NO, 8, 1), '1', '๋จ', '2', '์ฌ')
    FROM EMPLOYEE;
SELECT
        EMP_ID
    ,   EMP_NAME
    ,   EMP_NO
    ,   DECODE(SUBSTR(EMP_NO, 8, 1), '1', '๋จ', '์ฌ')
    							>>> ์กฐ๊ฑด๊ฐ2์๋ '2'๋ฅผ ์๋ตํด๋ ์์ ๋์ผํ ์ถ๋ ฅ
                                >>> ์กฐ๊ฑด๊ฐ ์์ด ์ ํ๊ฐ์ธ '์ฌ'๋ง ์์ผ๋ฏ๋ก ๋๋จธ์ง๋ ๋ชจ๋ '์ฌ'๋ก ์ถ๋ ฅ
    FROM EMPLOYEE;
SELECT
        EMP_NAME ์ง์๋ช
    ,   JOB_CODE ์ง๊ธ์ฝ๋
    ,   SALARY ๊ธ์ฌ
    ,   DECODE(JOB_CODE, 'J7', SALARY * 1.1, 
                         'J6', SALARY * 1.15, 
                         'J5', SALARY * 1.2, 
                               SALARY * 1.05) ์ธ์๊ธ์ฌ
   FROM EMPLOYEE;
๐โ CASE๋,
์ฌ๋ฌ ๊ฐ์ง ๊ฒฝ์ฐ์ ์ ํ์ ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณต (๋ฒ์๊ฐ๋ ๊ฐ๋ฅ)CASE WHEN ์กฐ๊ฑด์ THEN ๊ฒฐ๊ณผ๊ฐ WHEN ์กฐ๊ฑด์ THEN ๊ฒฐ๊ณผ๊ฐ ELSE ๊ฒฐ๊ณผ๊ฐ END
SELECT
        EMP_NAME
    ,   SALARY
    ,   CASE
            WHEN SALARY > 5000000 THEN '์์'
            WHEN SALARY BETWEEN 3000000 AND 5000000 THEN '๊ฒฝ๋ ฅ'
            ELSE '์ ์
'
        END ๊ตฌ๋ถ
    FROM EMPLOYEE;