[Day6] Oracle 6 [10/4]


--1. EMP ํ…Œ์ด๋ธ”์˜ ์‚ฌ์›์ˆ˜๋ฅผ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ ์ž‘์„ฑ.
   ์ง‘๊ณ„ํ•จ์ˆ˜ == ๊ทธ๋ฃนํ•จ์ˆ˜ == ๋ณต์ˆ˜ํ–‰ํ•จ์ˆ˜
   COUNT(*)  + NULL ํฌํ•จ
   COUNT(์ปฌ๋Ÿผ๋ช…) + NULL ์ œ์™ธ
   
   STDDEV( ํ‘œ์ค€ ํŽธ์ฐจ )
   VARIANCE( ๋ถ„์‚ฐ )
   
SELECT    COUNT(comm), COUNT(*) , SUM( sal ) , MAX(sal )
           -- , empno    *** ORA-00937: not a single-group group function
FROM emp;

   ๋ณต์Šต) ์ด๊ธ‰์—ฌํ•ฉ, ํ‰๊ท ๊ธ‰์—ฌ, ์ตœ๊ณ ๊ธ‰์—ฌ์•ก, ์ตœ์ € ๊ธ‰์—ฌ์•ก ์กฐํšŒ
       ์กฐ๊ฑด) pay = sal + comm

-- ์ธ๋ผ์ธ๋ทฐ 

SELECT SUM( t.pay ) , AVG( t.pay ), MAX( t.pay ) , MIN( t.pay )
FROM (
        SELECT sal  + NVL( comm, 0 ) pay
        FROM emp
) t;


--  WITH์ ˆ 

WITH
   temp as (
         SELECT sal  + NVL( comm, 0 ) pay
        FROM emp
   )
SELECT SUM( t.pay ) , AVG( t.pay ), MAX( t.pay ) , MIN( t.pay )
FROM  temp t;


 -- ํ…Œ์ด๋ธ” ๋ณ„์นญ์„ ์‚ฌ์šฉ. (FROM temp t)


--2. ํ˜„์žฌ ์‹œ์Šคํ…œ์˜   ๋‚ ์งœ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์ฟผ๋ฆฌ ์ž‘์„ฑ
์˜ค๋ผํด ๋‚ ์งœ ์ž๋ฃŒํ˜• : DATE              , TIMESTAMP
                  ๋‚ ์งœ+ h,m,s                         + ms + ํƒ€์ž„์กด

SELECT SYSDATE               -- ํ•จ์ˆ˜  22/10/04
       , CURRENT_TIMESTAMP   -- 22/10/04 10:15:08.296000000 ASIA/SEOUL
FROM dual;  -- PUBLIC ์‹œ๋…ธ๋‹˜



--3. SQL ์ง‘ํ•ฉ ์—ฐ์‚ฐ์ž์˜ ์ข…๋ฅ˜์™€ ์„ค๋ช…์„ ํ•˜์„ธ์š”
--     UNION, UNION ALL, INTERSECT, MINUS
--   ์ฃผ์˜์‚ฌํ•ญ ) ์ปฌ๋Ÿผ์ˆ˜ ๋™์ผ, ์ž๋ฃŒํ˜• ๋™์ผ

--4. ํ•จ์ˆ˜ ์„ค๋ช…
--  ใ„ฑ. ๋ฐ˜์˜ฌ๋ฆผ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ˜•์‹์„ ์ ๊ณ  ์„ค๋ช…ํ•˜์„ธ์š” 
         ROUND( ๋ฐ˜์˜ฌ๋ฆผ๊ฐ’[, ๋ฐ˜์˜ฌ๋ฆผ ์œ„์น˜] )
                             3+1
                             -3
--  ใ„ด. ์ ˆ์‚ญ(๋‚ด๋ฆผ) ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ˜•์‹์„ ์ ๊ณ  ์„ค๋ช…ํ•˜์„ธ์š”.    
        FLOOR()  ๋ฌด์กฐ๊ฑด ์†Œ์ˆ˜์  ์ฒซ ๋ฒˆ์งธ ์ž๋ฆฌ์—์„œ ์ ˆ์‚ญ
        TRUNC(  a[, b] )
        
--  ใ„ท. ์ ˆ์ƒ(์˜ฌ๋ฆผ) ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ˜•์‹์„ ์ ๊ณ  ์„ค๋ช…ํ•˜์„ธ์š”.   
       CEIL()  
       
--5. ๊ฒŒ์‹œํŒ์—์„œ ์ด ๊ฒŒ์‹œ๊ธ€ ์ˆ˜๊ฐ€ : 65 ๊ฐœ ์ด๊ณ   ํ•œ ํŽ˜์ด์ง€์— : 15๊ฐœ์˜ ๊ฒŒ์‹œ๊ธ€ ์ถœ๋ ฅํ•  ๋•Œ
--    ์ด ํŽ˜์ด์ง€ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์ฟผ๋ฆฌ ์ž‘์„ฑ. ( ์ ˆ์ƒ )
   
    SELECT 65 / 15  --4.33333333333333333333333333333333333333
       , CEIL( 65/ 15 ) ์ดํŽ˜์ด์ง€์ˆ˜
    FROM dual;
    
--6. emp ํ…Œ์ด๋ธ”์—์„œ ์‚ฌ์›๋“ค์˜ ํ‰๊ท  ๊ธ‰์—ฌ๋ณด๋‹ค ๋งŽ์€ ๊ธ‰์—ฌ๋ฅผ ๋ฐ›์œผ๋ฉด 1
--                                     ์ ์€ ๊ธ‰์—ฌ๋ฅผ ๋ฐ›์œผ๋ฉด -1
--                                     ๊ฐ™์œผ๋ฉด           0 
--  ์„ ์ถœ๋ ฅํ•˜๋Š” ์ฟผ๋ฆฌ ์ž‘์„ฑ.  (  SIGN ํ•จ์ˆ˜ )

SELECT t.ename, t.pay
--        PL + SQL == PL/SQL
--       , if( t.pay > t.avg_pay)
--         else if( t.pay < t.avg_pagy)
--         else
        , SIGN( t.pay - t.avg_pay )
FROM (
    SELECT  ename, sal  + NVL( comm, 0 ) pay
            --, AVG(  sal  + NVL( comm, 0 ) ) avg_pay  -- ORA-00937: not a single-group group function
            , ( SELECT AVG(  sal  + NVL( comm, 0 ) ) FROM emp ) avg_pay
    FROM emp
    ) t;



--7. insaํ…Œ์ด๋ธ”์—์„œ 80๋…„๋Œ€( 80๋…„~89๋…„์ƒ )์— ์ถœ์ƒํ•œ ์‚ฌ์›๋“ค๋งŒ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑ
--  ใ„ฑ. LIKE ์‚ฌ์šฉ
--  ใ„ด. REGEXP_LIKE ์‚ฌ์šฉ
--  ใ„ท. BETWEEN ~ AND ์‚ฌ์šฉ   

SELECT name, ssn
FROM insa
WHERE REGEXP_LIKE( ssn, '^8');
WHERE ssn LIKE '8%';
WHERE SUBSTR( ssn, 0, 2 ) BETWEEN 80 AND 89;  -- 1889


--  
--8. insa ํ…Œ์ด๋ธ”์—์„œ ์ฃผ๋ฏผ๋“ฑ๋ก๋ฒˆํ˜ธ๋ฅผ 123456-1******  ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅํ•˜์„ธ์š” . ( LPAD, RPAD ํ•จ์ˆ˜ ์‚ฌ์šฉ  )
--[์‹คํ–‰๊ฒฐ๊ณผ]
--ํ™๊ธธ๋™   770423-1022432   770423-1******
--์ด์ˆœ์‹    800423-1544236   800423-1******
--์ด์ˆœ์•    770922-2312547   770922-2******

         RPAD()/ LPAD()

SELECT name, ssn
       , SUBSTR( ssn, 0, 8 ) || '******'
       , CONCAT( SUBSTR( ssn, 0, 8 ), '******' )
       , RPAD( SUBSTR( ssn, 0, 8 ), 14 , '*' )
       , LENGTH( ssn )
       , RPAD( SUBSTR( ssn, 0, 8 ), LENGTH( ssn ) , '*' )
FROM insa;



--
--8-2. emp ํ…Œ์ด๋ธ”์—์„œ 30๋ฒˆ ๋ถ€์„œ๋งŒ PAY๋ฅผ ๊ณ„์‚ฐ ํ›„ ๋ง‰๋Œ€๊ทธ๋ž˜ํ”„๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ทธ๋ฆฌ๋Š” ์ฟผ๋ฆฌ ์ž‘์„ฑ
--   ( ํ•„์š”ํ•œ ๋ถ€๋ถ„์€ ๊ฒฐ๊ณผ ๋ถ„์„ํ•˜์„ธ์š”~    PAY๊ฐ€ 100 ๋‹จ์œ„๋‹น # ํ•œ๊ฐœ , ๋ฐ˜์˜ฌ๋ฆผ์ฒ˜๋ฆฌ )
--[์‹คํ–‰๊ฒฐ๊ณผ]
--DEPTNO     ENAME        PAY        BAR_LENGTH      
------------ ---------- ----------     ----------
--30              BLAKE          2850               29             #############################
--30              MARTIN       2650                27             ###########################
--30              ALLEN          1900                19             ###################
--30              WARD           1750                18             ##################
--30              TURNER       1500                 15             ###############
--30              JAMES          950                  10             ##########

SELECT deptno, ename, sal + NVL(comm, 0) pay
     , ROUND( (sal + NVL(comm, 0))/ 100 )     bar_length
     , RPAD( ' ', ROUND( (sal + NVL(comm, 0))/ 100 )+ 1, '#' )
FROM emp
WHERE deptno = 30
ORDER BY pay DESC;



--8-3. insa ํ…Œ์ด๋ธ”์—์„œ  ์ฃผ๋ฏผ๋ฒˆํ˜ธ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด '-' ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐํ•ด์„œ ์ถœ๋ ฅ
--[์‹คํ–‰๊ฒฐ๊ณผ]
--NAME    SSN                         SSN_2
--ํ™๊ธธ๋™   770423-1022432   7704231022432
--์ด์ˆœ์‹    800423-1544236   8004231544236
--์ด์ˆœ์•    770922-2312547   7709222312547

SELECT  name, ssn
        , INSTR( ssn, '-' )
        , SUBSTR( ssn, 0, 6 ) || SUBSTR( ssn, -7 )
        , REPLACE( ssn, '-', '') -- *** JSP
FROM insa;


--9. ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ ์œผ์„ธ์š” . 

--  TRUNC( ์ˆซ์ž, [๋‚ ์งœ] , ๋ฌธ์ž) ์ ˆ์‚ญํ•จ์ˆ˜

SELECT TRUNC( SYSDATE, 'YEAR' )      2022/01/01
       , TRUNC( SYSDATE, 'MONTH' )   2022/10/01
       , TRUNC( SYSDATE  )           2022/10/04  00:00:00.0000        ***
FROM dual;



--10. emp  ์—์„œ  comm ์ด null ์ด ์•„๋‹Œ ์‚ฌ์›์ˆ˜ ์ถœ๋ ฅ.

SELECT comm
FROM emp
WHERE comm IS NULL;
WHERE comm IS NOT NULL;
WHERE comm = null;


--
--11. emp ์—์„œ ํ‰๊ท PAY ๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ํฐ ์‚ฌ์›๋“ค๋งŒ์˜ ๊ธ‰์—ฌํ•ฉ์„ ์ถœ๋ ฅ.

SELECT t.*
FROM ( 
        SELECT ename, sal, comm,  sal + NVL(comm, 0) pay
               , ( SELECT AVG( sal + NVL(comm, 0) ) FROM emp ) avg_pay
        FROM emp
) t
WHERE t.pay >= t.avg_pay ;


--12. emp ํ…Œ์ด๋ธ”์—์„œ ๊ธ‰์—ฌ๋ฅผ ๊ฐ€์žฅ ๋งŽ์ด ๋ฐ›๋Š” ์‚ฌ์›์˜ empno, ename, pay ๋ฅผ ์ถœ๋ ฅ.

SELECT MAX(  sal + NVL(comm, 0) )  max_pay
FROM emp;

SELECT deptno, ename, job,  sal + NVL(comm, 0) pay
FROM emp
WHERE  sal + NVL(comm, 0) = ( SELECT MAX(  sal + NVL(comm, 0) )  max_pay FROM emp   );
-- WHERE pay= 5000;  -- ORA-00904: "PAY": invalid identifier




-- (๋ฌธ์ œ) max_pay, min_pay ์ตœ๊ณ ,์ตœ์ € ๊ธ‰์—ฌ์ž ํ™•์ธ

SELECT deptno, ename, job,  sal + NVL(comm, 0) pay , '์ตœ์ €๊ธ‰์—ฌ์ž'
FROM emp
WHERE  sal + NVL(comm, 0) = ( SELECT MIN(  sal + NVL(comm, 0) )  max_pay FROM emp   )
UNION 
SELECT deptno, ename, job,  sal + NVL(comm, 0) pay , '์ตœ๊ณ ๊ธ‰์—ฌ์ž'
FROM emp
WHERE  sal + NVL(comm, 0) = ( SELECT MAX(  sal + NVL(comm, 0) )  max_pay FROM emp   );



-- 2

SELECT deptno, ename, job,  sal + NVL(comm, 0) pay 
FROM emp
WHERE  sal + NVL(comm, 0) = ( SELECT MIN(  sal + NVL(comm, 0) )  max_pay FROM emp   )
       OR
       sal + NVL(comm, 0) = ( SELECT MAX(  sal + NVL(comm, 0) )  max_pay FROM emp   );



-- 3.  IN                 SQL์—ฐ์‚ฐ์ž 

SELECT deptno, ename, job,  sal + NVL(comm, 0) pay 
FROM emp
WHERE  sal + NVL(comm, 0) IN ( 
                                 ( SELECT MIN(  sal + NVL(comm, 0) )  max_pay FROM emp   )
                             ,   ( SELECT MAX(  sal + NVL(comm, 0) )  max_pay FROM emp   )
                          );


   
   SQL์—ฐ์‚ฐ์ž : ANY, ALL, SOME, EXISTS 

 

-- ์ตœ๊ณ ๊ธ‰์—ฌ์ž 

SELECT deptno, ename, job,  sal + NVL(comm, 0) pay
FROM emp
WHERE sal + NVL(comm, 0) <=  ALL( SELECT sal + NVL(comm, 0) FROM emp );
WHERE sal + NVL(comm, 0) >=  ALL( SELECT sal + NVL(comm, 0) FROM emp );

WHERE  sal + NVL(comm, 0) = ( SELECT MAX(  sal + NVL(comm, 0) )  max_pay FROM emp   );


--12-2. emp ํ…Œ์ด๋ธ”์—์„œ ๊ฐ ๋ถ€์„œ๋ณ„ ๊ธ‰์—ฌ๋ฅผ ๊ฐ€์žฅ ๋งŽ์ด ๋ฐ›๋Š” ์‚ฌ์›์˜ pay๋ฅผ ์ถœ๋ ฅ
-- java  for( int i=10; i<=40; i+=10 )        PL/SQL

SELECT *
FROM emp
WHERE deptno = 10 AND sal + NVL(comm, 0) = (
                                                SELECT MAX( sal + NVL(comm, 0) ) max_pay_10
                                                FROM emp
                                                WHERE deptno = 10 
                                            ) 
UNION 
SELECT *
FROM emp
WHERE deptno = 20 AND sal + NVL(comm, 0) = (
                                                SELECT MAX( sal + NVL(comm, 0) ) max_pay_10
                                                FROM emp
                                                WHERE deptno = 20 
                                            )
UNION                                             
SELECT *
FROM emp
WHERE deptno = 30 AND sal + NVL(comm, 0) = (
                                                SELECT MAX( sal + NVL(comm, 0) ) max_pay_10
                                                FROM emp
                                                WHERE deptno = 30 
                                            )                                            
UNION 
SELECT *
FROM emp
WHERE deptno = 40 AND sal + NVL(comm, 0) = (
                                                SELECT MAX( sal + NVL(comm, 0) ) max_pay_10
                                                FROM emp
                                                WHERE deptno = 40 
                                            );


-- 2.

SELECT deptno
         --, sal + NVL(comm, 0)   -- 257ํ–‰, 16์—ด์—์„œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ, ORA-00979: not a GROUP BY expression
        , MAX( sal + NVL(comm, 0) )  -- ๊ฐ ๋ถ€์„œ๋ณ„ ์ตœ๊ณ  ๊ธ‰์—ฌ์•ก
        , MIN( sal + NVL(comm, 0) )  -- ๊ฐ ๋ถ€์„œ๋ณ„ ์ตœ์ € ๊ธ‰์—ฌ์•ก
        , AVG( sal + NVL(comm, 0) )  -- ๊ฐ ๋ถ€์„œ๋ณ„ ํ‰๊ท  ๊ธ‰์—ฌ์•ก
        , SUM(  sal + NVL(comm, 0) ) -- ๊ฐ ๋ถ€์„œ๋ณ„ ์ด ๊ธ‰์—ฌ์•ก
FROM emp
GROUP BY deptno  -- ์ง‘๊ณ„ ํ•จ์ˆ˜
ORDER BY deptno ASC;



-- 3. ์ƒ๊ด€๋œ( correlated ) ์„œ๋ธŒ์ฟผ๋ฆฌ( subquery )  - [์‹œํ—˜]
--    ใ„ด sub์—์„œ ๋ฆฌํ„ดํ•œ ๊ฐ’์„ main์—์„œ ์‚ฌ์šฉํ•˜๊ณ  main์—์„œ ๋ฆฌํ„ดํ•œ ๊ฐ’์„ ๋‹ค์‹œ sub์— ์‚ฌ์šฉํ•จ

SELECT *
FROM emp a
WHERE a.sal + NVL(a.comm, 0) = (
                                SELECT MAX( b.sal + NVL(b.comm, 0) ) 
                                FROM emp  b
                                WHERE b.deptno = a.deptno
                            )  
ORDER BY a.deptno ASC                            ;

 



-- 4. ์ˆœ์œ„(RANK) ํ•จ์ˆ˜
-- 5. TOP - N ๋ฐฉ์‹


-- [ ๋ฌธ์ž ํ•จ์ˆ˜ ] 

ASCII() <-> CHR() 
๋ฌธ์ž    <-> ASCII

SELECT ename
    , SUBSTR( ename, 0, 1)
    , ASCII( SUBSTR( ename, 0, 1)  )
FROM emp;


 

SELECT ASCII(1) -- 49
,  CHR(  49 )
FROM dual; 
--  GREATEST(์ตœ๋Œ€์˜ ), LEAST( ์ตœ์†Œํ•œ)  ๋‚˜์—ด๋œ ๋ฌธ์ž ์ค‘์— ๊ฐ€์žฅ ํฐ ๊ฐ’, ์ž‘์€๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜
SELECT GREATEST( 10, 20 )
       , GREATEST( 10, 20, 30, 40, 50 )
       , LEAST( 10, 20, 30, 40, 50 )
       , GREATEST( 'KBS', 'MBC', 'SBS', 'JTBC' )
       , LEAST( 'KBS', 'MBC', 'SBS', 'JTBC' )
FROM dual;



-- VSIZE(  ๋ฌธ์ž )   ์ง€์ •๋œ ๋ฌธ์ž์—ด์˜ ํฌ๊ธฐ๋ฅผ ์ˆซ์ž๋กœ ๋ฐ˜ํ™˜.

SELECT VSIZE('a')   -- ์•ŒํŒŒ๋ฒณ ํ•œ ๋ฌธ์ž 1๋ฐ”์ดํŠธ
     , VSIZE('ํ•œ')  -- ํ•œ๊ธ€์€ ํ•œ ๋ฌธ์ž 3๋ฐ”์ดํŠธ
     , ASCII('๊ฐ€')   -- 15380608
FROM dual;



-- [ ๋‚ ์งœ ํ•จ์ˆ˜ ] --
SYSDATE
ROUND( ๋‚ ์งœ )
TRUNC( ๋‚ ์งœ )


--๋‚ ์งœ + ์ˆซ์ž = ์ˆซ์ž๋งŒํผ ์ผ์ˆ˜๊ฐ€ ๋”ํ•ด์ง„ ๋‚ ์งœ  
--๋‚ ์งœ - ์ˆซ์ž = ์ˆซ์ž๋งŒํผ ์ผ์ˆ˜๊ฐ€ ๋นผ์ง„ ๋‚ ์งœ
--๋‚ ์งœ + ์ˆซ์ž/24 = ๋‚ ์งœ์— ์ˆซ์ž๋งŒํผ์˜ ์‹œ๊ฐ„์ด ๋”ํ•ด์ง„ ๋‚ ์งœ.
--๋‚ ์งœ - ๋‚ ์งœ = ๋‘ ๋‚ ์งœ์˜ ์ฐจ์ด ์ผ ์ˆ˜

-- (๋ฌธ์ œ) ์˜ค๋Š˜๋ถ€ํ„ฐ 10์ผ ํ›„์— ๋งŒ๋‚˜์ž.. ์•ฝ์† 
-- (๋ฌธ์ œ) ์ง€๊ธˆ๋ถ€ํ„ฐ 2์‹œ๊ฐ„ ํ›„...

SELECT SYSDATE
       ,SYSDATE + 10
       , SYSDATE - 3   -- 3์ผ์ „
       , SYSDATE +  2/24  -- 2์‹œ๊ฐ„ ํ›„ ๋‚ ์งœ ๊ฐ์ฒด (์‹œ๊ฐ„ํ‘œ์‹œ๋Š” ์•ˆ๋จ)
       -- , TO_CHAR( ์ˆซ์ž, ๋‚ ์งœ, ๋ฌธ์ž , 'ํ˜•์‹' )
       , TO_CHAR( SYSDATE +  2/24, 'YYYY.MM.DD HH24:MI:SS' )
FROM dual;



-- (๋ฌธ์ œ) emp ํ…Œ์ด๋ธ”์—์„œ ๊ฐ ์‚ฌ์›์˜ ๊ทผ๋ฌด ์ผ์ˆ˜๋ฅผ ์กฐํšŒ.

SELECT ename, hiredate
      , SYSDATE
      , CEIL( ABS(SYSDATE - hiredate) ) -- 1์‹œ๊ฐ„์ด๋ผ๋„ ๋„˜์œผ๋ฉด CEIL
FROM emp;



-- [๋ฌธ์ œ] ์ˆ˜๋ฃŒ์ผ๊นŒ์ง€ ๋ช‡์ผ์ด ๋‚จ์•˜๋Š”์ง€ ?  ๋‚ ์งœ - ๋‚ ์งœ = ์ผ์ˆ˜
-- ์ˆ˜๋ฃŒ์ผ   2023.01.18

SELECT SYSDATE
     , '2023.01.18'
     -- , '2023.01.18' - SYSDATE  -- ORA-00932: inconsistent datatypes: expected CHAR got DATE
     --                                      ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ์œ ํ˜• :          ๋ฌธ์ž     ๋‚ ์งœ 
     -- '2023.01.18'  ๋‚ ์งœ ์ž๋ฃŒํ˜•์ด ์•„๋‹ˆ๊ณ  ๋ฌธ์ž๋กœ ์ธ์‹ํ•œ๋‹ค.
     -- ์˜ค๋ผํด ํ˜• ๋ณ€ํ™˜ : ๋ฌธ์ž -> ๋‚ ์งœ [๊ฒ€์ƒ‰]
     , CEIL( TO_DATE('2023.01.18') - SYSDATE  ) "๋‚จ์€ ์ผ ์ˆ˜ "
FROM dual;

 

SELECT 2 + TO_NUMBER( '2' )
  , 2 + '2' -- ์ž๋™ํ˜•๋ณ€ํ™˜๋˜๊ธฐ์— ๊ตณ์ด TO_NUMBER() ๋กœ ๋ณ€ํ™˜  X
  , TO_DATE('2023.01.18')
FROm dual;



ใ€ํ˜•์‹ใ€‘
TO_DATE( char [,'fmt' [,'nlsparam']])


-- MONTHS_BETWEEN  ๋‘ ๊ฐœ์˜ ๋‚ ์งœ ๊ฐ„์˜ ๋‹ฌ์˜ ์ฐจ์ด ( ๊ฐœ์›”์ˆ˜ )
-- ADD_MONTHS      ํŠน์ • ์ˆ˜๋ฅผ ๋‹ฌ์— ๋”ํ•œ ๋‚ ์งœ
-- LAST_DAY        ํŠน์ • ๋‚ ์งœ๊ฐ€ ์†ํ•œ ๋‹ฌ์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋‚ ์งœ๋ฅผ ๋ฆฌํ„ด
-- NEXT_DAY        ๋ช…์‹œ๋œ ์š”์ผ์ด ๋Œ์•„์˜ค๋Š” ๊ฐ€์žฅ ์ตœ๊ทผ์˜ ๋‚ ์งœ  "


SELECT ename, hiredate
      , CEIL(  ABS( hiredate - SYSDATE ) ) ๊ทผ๋ฌด์ผ์ˆ˜
      , ROUND( MONTHS_BETWEEN(  SYSDATE, hiredate  ) , 2 ) ๊ทผ๋ฌด๊ฐœ์›”์ˆ˜
      , ROUND( MONTHS_BETWEEN(  SYSDATE, hiredate  ) / 12 , 2 )  ๊ทผ๋ฌด๋…„์ˆ˜
FROM emp;


-- ADD_MONTHS ํ•จ์ˆ˜
ใ€ํ˜•์‹ใ€‘
    ADD_MONTHS(date, month)
   

SELECT ename, hiredate
     , hiredate + 100  -- 100์ผ ํ›„
     , hiredate + 10/24 -- 10์‹œ๊ฐ„ ํ›„
     , ADD_MONTHS( hiredate, 3) -- 3๊ฐœ์›” ํ›„
     , ADD_MONTHS( hiredate, -3) -- 3๊ฐœ์›” ์ „
FROM emp;



-- ํ™•์ธ

SELECT  TO_DATE( '2022-02-01' )
   ,  ADD_MONTHS( TO_DATE( '02-01-2022', 'MM-DD-YYYY') , 1 ) a -- ๋ฌธ์ž๋ฅผ ๋‚ ์งœ๋กœ ํ˜•๋ณ€ํ™˜ TO_DATE
  -- ORA-01830: [date format] picture ends before converting entire input string
  -- ์ „์ฒด ์ž…๋ ฅ ๋ฌธ์ž์—ด์ด ๋ณ€ํ™˜๋˜๊ธฐ ์ „์—  ๋‚ ์งœ ํ˜•์‹ ์‚ฌ์ง„์ด ์ข…๋ฃŒ๋˜์—ˆ๋‹ค.
   ,  ADD_MONTHS( TO_DATE( '02-28-2022', 'MM-DD-YYYY') , 1 ) b --  2/28 + ํ•œ๋‹ฌ
   ,  ADD_MONTHS( TO_DATE( '02-27-2022', 'MM-DD-YYYY') , 1 ) c --  2/27 + ํ•œ๋‹ฌ
   ,  ADD_MONTHS( TO_DATE( '03-30-2022', 'MM-DD-YYYY') , -1 ) d --  3/31 + ํ•œ๋‹ฌ
     -- 3/31~3/28       - 1 ๋‹ฌ = 2/28
FROM dual;


-- ๋‹ฌ๋ ฅ  : ๋…„,์›”   ๋งˆ์ง€๋ง‰๋‚ ์งœ.

SELECT TO_DATE( '2022-02-01' )-1        -- 22/01/31
FROM dual;



-- LAST_DAY ํ•จ์ˆ˜ : ํŠน์ •๋‚ ์งœ๊ฐ€ ์†ํ•œ ๋‹ฌ(์›”)์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋‚ ์งœ๋ฅผ ๋ฐ˜ํ™˜

SELECT SYSDATE
  , LAST_DAY( SYSDATE )
  , TO_CHAR( LAST_DAY( SYSDATE ), 'DD' ) -- ๋ฌธ์ œ) ์ด๋ฒˆ ๋‹ฌ์ด ๋ช‡์ผ ๊นŒ์ง€ ์žˆ๋‚˜์š”? 
FROm dual;


-- TO_NUMBER()
-- TO_CHAR()
-- TO_DATE()

-- NEXT_DAY ํ•จ์ˆ˜ : ๋ช…์‹œ๋œ ์š”์ผ์ด ๋Œ์•„์˜ค๋Š”( ๋‹ค๊ฐ€์˜ค๋Š” ) ๊ฐ€์žฅ ์ตœ๊ทผ์˜ ๋‚ ์งœ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜
 --                   ๋‹ค์Œ ์ฃผ X

ใ€ํ˜•์‹ใ€‘
      NEXT_DAY(date,char)

-- ๋ฌธ์ œ) ๋Œ์•„์˜ค๋Š”( ๋‹ค๊ฐ€์˜ค๋Š” )   ์›”์š”์ผ์€ ํœด๊ฐ•์ด๋‹ค. ๋ช‡ ์ผ ? 

SELECT SYSDATE
  , NEXT_DAY( SYSDATE, '์›”์š”์ผ' )  -- ๋Œ€์ฒด ๊ณตํœด์ผ  X
  , NEXT_DAY( SYSDATE, 'ํ™”์š”์ผ' ) 
  , NEXT_DAY( SYSDATE, '๊ธˆ์š”์ผ' ) -- ์ด๋ฒˆ ์ฃผ ๊ธˆ์š”์ผ
FROM dual;



-- datetime(= date ํ•จ์ˆ˜์˜ ํ™•์žฅ ํ˜•ํƒœ) ์ข…๋ฅ˜

SELECT SYSDATE
,   CURRENT_DATE
,   CURRENT_TIMESTAMP
FROM dual;


-- EXTRACT ํ•จ์ˆ˜ :
ใ€ํ˜•์‹ใ€‘
      EXTRACT (
         {YEAR ¦ 
          MONTH ¦ 
          DAY ¦ 
          HOUR ¦ 
          MINUTE ¦ 
          SECOND ¦
          TIMEZONE_HOUR ¦ 
          TIMEZONE_MINUTE ¦ 
          TIMEZONE_REGION ¦ 
          TIMEZONE_ABBR} 
      FROM {datetime_value_expr ¦ 
            interval_value_expr}
        ) 
--

SELECT SYSDATE
     , TO_CHAR( SYSDATE, 'YYYY' )    year  -- ์™ผ์ชฝ์ •๋ ฌ( ๋ฌธ์ž )
     , EXTRACT( YEAR FROM SYSDATE ) year   -- ์˜ค๋ฅธ์ชฝ์ •๋ ฌ( ์ˆซ์ž )
FROM dual;



-- [ ๋ณ€ํ™˜ ํ•จ์ˆ˜์˜ ์ข…๋ฅ˜ ]
-- TO_NUMBER    :   ๋ฌธ์ž -> ์ˆซ์ž ๋ณ€ํ™˜   X

SELECT  TO_NUMBER(  '1234'  ) 
FROM dual;


-- TO_CHAR      :   [์ˆซ์ž],๋‚ ์งœ,๋ฌธ์ž -> ๋ฌธ์ž ๋ณ€ํ™˜
ใ€ํ˜•์‹ใ€‘
      TO_CHAR( n [,'fmt' [,'nlsparam']]);
--  ํ™๊ธธ๋™   ํ†ตํ™”๊ธฐํ˜ธ2,810,000

SELECT name, basicpay + sudang pay
     , TO_CHAR(   basicpay + sudang,  '9G999G999'   ) -- ์ฝค๋งˆ G
     , TO_CHAR(   basicpay + sudang,  '9,999,999'   ) -- ์ฝค๋งˆ ,
     , TO_CHAR(   basicpay + sudang,  'L9,999,999'   ) -- ์›ํ™” L
FROM insa;


--  2260.416666666666666666666666666666666667
--  ์†Œ์ˆ˜์  2์ž๋ฆฌ ์ถœ๋ ฅ   :   ROUND() X  ์ž๋™ ๋ฐ˜์˜ฌ๋ฆผ  ํ™•์ธ

SELECT AVG( sal + NVL( comm, 0) )  avg_pay
        ,  TO_CHAR(   AVG( sal + NVL( comm, 0) ),  'L9,999.00' ) avg_pay
FROM emp;



-- TO_CHAR( ๋‚ ์งœํ˜• )  ๋‚ ์งœํ˜• -> ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋ฌธ์ž์—ด ํ˜•๋ณ€ํ™˜ํ•จ์ˆ˜
ใ€ํ˜•์‹ใ€‘
    TO_CHAR( date [,'fmt' [,'nlsparam']])

-- YY์™€ RR ์˜ ์ฐจ์ด์ (๊ธฐ์–ต) --

SELECT SYSDATE
  , TO_CHAR( SYSDATE, 'CC' ) ใ„ฑ -- 21์„ธ๊ธฐ
  , TO_CHAR( SYSDATE, 'BC' ) ใ„ด -- ์„œ๊ธฐ
   --  ์„œ๊ธฐ (่ฅฟ็ด€)
   -- ๊ธฐ์› ์›๋…„ ์ดํ›„. ์ฃผ๋กœ ์˜ˆ์ˆ˜๊ฐ€ ํƒœ์–ด๋‚œ ํ•ด๋ฅผ ์›๋…„์œผ๋กœ ํ•˜์—ฌ ์ด๋ฅธ๋‹ค.
   , TO_CHAR( SYSDATE, 'Q' ) ใ„ท -- 10์›” == 4๋ถ„๊ธฐ
--   , TO_CHAR( SYSDATE, 'IYYY' )-- ๋…„
   , TO_CHAR( SYSDATE, 'YYYY' )-- ๋…„   RRRR
   , TO_CHAR( SYSDATE, 'YEAR' )-- ์˜๋ฌธ ๋…„๋„ TWENTY TWENTY-TWO
   , TO_CHAR( SYSDATE, 'MM' ) -- ์›”  MM, MONTH, MON
   , TO_CHAR( SYSDATE, 'DD' ) -- ์ผ  D,  DD,  DDD 
   , TO_CHAR( SYSDATE, 'HH24' )-- ์‹œ๊ฐ„  HH, HH12, HH24
   , TO_CHAR( SYSDATE, 'MI' )-- ๋ถ„
   , TO_CHAR( SYSDATE, 'SS' )-- ์ดˆ   SSSSS ์ž์ •์—์„œ ๋ถ€ํ„ฐ ์ดˆ
   , TO_CHAR( SYSDATE, 'DAY' )-- ์š”์ผ  DY(ํ™”), DAY(ํ™”์š”์ผ) 
FROM dual;


--  WW, IW, W  ( ๊ธฐ์–ต )

SELECT 
  TO_CHAR( SYSDATE, 'WW' ) ใ„ฑ    -- ๋…„ ์ค‘ ๋ช‡ ์งธ ์ฃผ
  , TO_CHAR( SYSDATE, 'IW' ) ใ„ด  -- ๋…„ ์ค‘ ๋ช‡ ์งธ์ฃผ
  , TO_CHAR( SYSDATE, 'W'  ) ใ„ท   -- ์›” ์ค‘ ๋ช‡ ์งธ ์ฃผ
  , TO_CHAR( SYSDATE, 'TS' ) ใ„น  -- ์‹œ๊ฐ„ ๊ฐ„๋žต (  ์˜คํ›„ 3:15:51 )
FROM dual;



-- [๋ฌธ์ œ] SYSDATE ๋ฅผ ์‚ฌ์šฉํ•ด์„œ
--       TO_CHAR() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ
--      '2022๋…„ 10์›” 04์ผ ์˜คํ›„ 15:21:12 (ํ™”)' ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅ

-- ORA-01821: date format not recognized
--            ๋‚ ์งœ ํ˜•์‹์ด ์ธ์‹๋˜์ง€ ์•Š๋Š”๋‹ค. 
SELECT TO_CHAR( SYSDATE, 'YYYY"๋…„" MM"์›”" DD"์ผ" AM HH24:MI:SS (DY)' )
      ,  TO_CHAR(SYSDATE, 'YYYY') || '๋…„ ' || TO_CHAR(SYSDATE, 'MM') || '์›” ' || TO_CHAR(SYSDATE, 'DD') || '์ผ ' || TO_CHAR(SYSDATE, 'TS') ๋‚ ์งœ์‹œ๊ฐ„
FROM dual;
-- String.format("%04d", 9)  -- 0009
-- DecimalFormat ํ˜•์‹ํ™” ํด๋ž˜์Šค
SELECT TO_CHAR(  9 , '0999' )  -- '0009'
FROM dual;



-- [๋ฌธ์ œ]  ๋ฌธ์ž์—ด -> ๋‚ ์งœ  ํ˜•๋ณ€ํ™˜  TO_CHAR(),   [ TO_DATE() ]
   --   '2022๋…„ 12์›” 31์ผ'

SELECT TO_DATE('2022๋…„ 12์›” 31์ผ', 'YYYY"๋…„" MM"์›”" DD"์ผ"')
FROM dual;



-- [๋ฌธ์ œ] emp ํ…Œ์ด๋ธ”์—์„œ ๊ฐ ์‚ฌ์›๋“ค์˜ ์ž…์‚ฌ์ผ์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ 10๋…„ 5๊ฐœ์›” 20์ผ์งธ ๋˜๋Š” ๋‚  ? 

๋‚ ์งœ + ์ผ์ˆ˜ = ๋‚ ์งœ
๋‚ ์งœ - ์ผ์ˆ˜ = ๋‚ ์งœ
๋‚ ์งœ - ๋‚ ์งœ = ์ผ์ˆ˜
๋‚ ์งœ + /24 = ๋‚ ์งœ

MONTHS_BETWEEN()  ๊ฐœ์›”์ˆ˜
ADD_MONTHS()      ๊ฐœ์›”  +/-
NEXT_DAY(), LAST_DAY()
--

SELECT   hiredate
       , ADD_MONTHS( hiredate + 20 ,  12 * 10 + 5 ) 
FROM emp;



-- [๋ฌธ์ œ] insa ํ…Œ์ด๋ธ”์—์„œ ssn ์ฃผ๋ฏผ๋“ฑ๋ก๋ฒˆํ˜ธ๋ฅผ ํ†ตํ•ด์„œ ์ƒ์ผ์„ ์–ป์–ด์˜ค๊ณ 
--       ์˜ค๋Š˜์„ ๊ธฐ์ค€์œผ๋กœ ์ƒ์ผ ์ง€๋‚ฌ๋‹ค. ์ง€๋‚˜์ง€ ์•Š์•˜๋‹ค๋ผ๊ณ  ์ถœ๋ ฅ.
--                       1/ 0/  -1 SIGN()


SELECT *
FROM insa;
--
UPDATE insa
SET ssn = '801004-1544236'
WHERE num = 1002;
COMMIT;



-- (๋ณต์Šต)  '์ง€๋‚ฌ๋‹ค', '์•ˆ์ง€๋‚ฌ๋‹ค', '์˜ค๋Š˜ ' ์ฒ˜๋ฆฌ

SELECT ssn
--      , SUBSTR(ssn, 0, 6) X  ํƒœ์–ด๋‚œ ๋…„๋„ X
      , TO_DATE(  SUBSTR( ssn, 3, 4 ) ,   'MMDD' )  -- MMDD  2022๋…„      
      , SYSDATE 
      -- ์–‘์ˆ˜( ์ƒ์ผ์ด ์ง€๋‚˜์ง€ ์•Š์Œ )
      -- ์ •๋‹ต.  ์‹œ๊ฐ„:๋ถ„:์ดˆ   00:00:00
      -- , SIGN(   TO_DATE(  SUBSTR( ssn, 3, 4 ) ,   'MMDD' ) - TRUNC( SYSDATE ) ) 
      , SIGN(   TO_DATE(  SUBSTR( ssn, 3, 4 ) ,   'MMDD' ) - SYSDATE  ) 
FROm insa;



SELECT TO_CHAR(  TO_DATE(  SUBSTR( ssn, 3, 4 ) ,   'MMDD' ) , 'TS')
   , TO_CHAR(  SYSDATE  , 'TS')
   , TO_CHAR(   TRUNC( SYSDATE ) , 'TS')
FROM insa;



-- TO_DATE ๊ธฐ๋ณธ๊ฐ’ (์‹œํ—˜)

SELECT   TO_DATE(  '2021' , 'YYYY' )  -- 21     /10/01
, TO_DATE(  '2021-02' , 'YYYY-MM' )   -- 21/02/01
, TO_DATE(  '23' , 'DD' )   -- 22/10/23
FROM dual;


-- [์ผ๋ฐ˜ ํ•จ์ˆ˜]
--  NVL
--  NVL2
--  NULLIF

-- COALESCE ํ•จ์ˆ˜ ( ์ฝ”์šฐ์–ผ๋ ˆ์Šค ) : ํ•ฉ์น˜๋‹ค. ์—ฐํ•ฉ
--  ใ„ด ๋‚˜์—ดํ•ด ๋†“์€ ๊ฐ’์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒดํฌํ•˜์—ฌ NULL ์ด ์•„๋‹Œ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜
ใ€ํ˜•์‹ใ€‘
        COALESCE(expr[,expr,...])

SELECT ename
   , sal + NVL(comm, 0) pay
   , sal + NVL2( comm, comm, 0) pay
   , COALESCE( sal + comm, sal , 0 ) pay
   --  sal+comm์ด null์ด๋ฉด (๋”ํ•˜๊ธฐ ์ค‘ ํ•˜๋‚˜๋ผ๋„ null์ด๋ฉด null์ž„) sal ์ถœ๋ ฅ, sal์ด null์ด๋ฉด 0 ์ถœ๋ ฅ
   , sal + COALESCE( comm, 0 ) pay
FROM emp;
--  '' == NULL
select coalesce('','','arirang','kunsan') 
from dual;



-- DECODE ํ•จ์ˆ˜ ( ์‹œํ—˜ ) *****
  ใ„ด [์—ฌ๋Ÿฌ ๊ฐœ์˜ ์กฐ๊ฑด]์„ ์ฃผ์–ด ์กฐ๊ฑด์— ๋งž์„ ๊ฒฝ์šฐ ํ•ด๋‹น ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜ 
  ใ„ด PL/SQL ์•ˆ์—์„œ ์‚ฌ์šฉํ•  ์˜ค๋ผํด ํ•จ์ˆ˜
  ใ„ด (๊ธฐ์–ต) ๋น„๊ต์—ฐ์‚ฐ์€ '=' ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค  + IF ~ ELSE IF ~ ELSE  ๋ฌธ ์ฒ˜๋Ÿผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

-- ์ž๋ฐ” -
int x = 10;
if( x == 11 ){
   return C;
}
-- ์˜ค๋ผํด DECODE -
DECODE( x, 11, C)



-- ์ž๋ฐ” -
int x = 10;
if( x == 11 ){
   return C;
}else{
    return D;
}
-- ์˜ค๋ผํด DECODE -
DECODE( x, 11, C, D)



-- ์ž๋ฐ” -
int x = 10;
if( x == 11 ){
   return C;
}else if( x == 12 ){
    return D;
}else if( x == 13 ){
    return E;
}else {
     return F;
}
-- ์˜ค๋ผํด DECODE -
DECODE( x, 11, C, 12,  D, 13, E, F)

-- [๋ฌธ์ œ] insaํ…Œ์ด๋ธ”์—์„œ  ssn ์ฃผ๋ฏผ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง€๊ณ 
--       ์ƒ์ผ ์ง€๋‚จ ์—ฌ๋ถ€   SIGN 1,-1,0 ์ถœ๋ ฅ.
--  ์กฐ๊ฑด) DECODE ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ   '์ƒ์ผ ์ „', '์ƒ์ผ ํ›„' , '์˜ค๋Š˜ ์ƒ์ผ' ๋ฌธ์ž์—ด ์ถœ๋ ฅ

SELECT ssn     
     , DECODE(   SIGN(  TO_DATE(  SUBSTR( ssn, 3, 4) ,  'MMDD' ) - TRUNC( SYSDATE ) ) ,  0 , '์˜ค๋Š˜ ์ƒ์ผ', 1 , '์ƒ์ผ ์ „', -1, '์ƒ์ผ ํ›„' )
FROM insa;



-- 1. ๋ฌธ์ œ) insa ํ…Œ์ด๋ธ”์—์„œ ssn์„ ๊ฐ€์ง€๊ณ  '๋‚จ์ž'/'์—ฌ์ž'    ๋ผ๊ณ  ์„ฑ๋ณ„์„ ์ถœ๋ ฅ              
--       (   DECODE ()  ์‚ฌ์šฉ  )

SELECT ssn 
       ,  DECODE(   MOD(  SUBSTR( ssn, -7, 1) , 2 ), 0 , '์—ฌ์ž', '๋‚จ์ž') gender
FROM insa;



-- ๋ฌธ์ œ) insaํ…Œ์ด๋ธ”์—์„œ ๋‚จ์ž ์‚ฌ์›์ˆ˜, ์—ฌ์ž ์‚ฌ์›์ˆ˜ ๋ช‡๋ช…์ธ์ง€ ์ถœ๋ ฅ(์กฐํšŒ)
-- ๋ฌธ์ œ) emp ํ…Œ์ด๋ธ”์—์„œ  ์ด์‚ฌ์›์ˆ˜, 10๋ฒˆ, 20๋ฒˆ, 30๋ฒˆ, 40๋ฒˆ ์‚ฌ์›์ˆ˜๋ฅผ ์ถœ๋ ฅ(์กฐํšŒ)


-- 2. ๋ฌธ์ œ) emp ์—์„œ ๊ฐ ์‚ฌ์›๋“ค์˜ ๋ฒˆํ˜ธ,์ด๋ฆ„,๊ธ‰์—ฌ(pay) ์ถœ๋ ฅ
--        10๋ฒˆ ๋ถ€์„œ์›  15% ์ธ์ƒ
--        20๋ฒˆ ๋ถ€์„œ์›    5% ์ธ์ƒ
--        ๊ทธ์™ธ ๋ถ€์„œ์›   10% ์ธ์ƒ

SELECT deptno, empno, ename
     , sal  + NVL( comm, 0)   pay
     , DECODE(   deptno , 10,  ( sal  + NVL( comm, 0) ) * 0.15
                        , 20,  ( sal  + NVL( comm, 0) ) * 0.05
                        , ( sal  + NVL( comm, 0) ) * 0.10
              ) ์ธ์ƒ์•ก   
FROM emp
ORDER BY deptno ASC;

 

  • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
  • ๋„ค์ด๋ฒ„ ๋ฐด๋“œ์— ๊ณต์œ ํ•˜๊ธฐ
  • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
  • ์นด์นด์˜ค์Šคํ† ๋ฆฌ ๊ณต์œ ํ•˜๊ธฐ