ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SQL] Data Type Conversion, DECODE, CASE, ROWNUM, ๋…ผ๋ฆฌ์—ฐ์‚ฐ์ž, ํ•จ์ˆ˜
    Computer Science/DB 2023. 4. 5. 21:48
    728x90

    ๐Ÿ‘€ ์œ ์šฉํ•œ ์ •๋ณด

    Hash ํ•จ์ˆ˜

    ๐Ÿ’ก
    - Value to Address Hash ํ•จ์ˆ˜์— Key ๊ฐ’์„ ๋„ฃ์œผ๋ฉด ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” Address๊ฐ€ ์ถœ๋ ฅ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ, ๋ฐ์ดํ„ฐ์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฒ€์ƒ‰ ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฅด๋‹ค.

    ํ•ด์‹ฑ์˜ ํŠน์ง•

    • ๊ธฐ์–ต ์žฅ์†Œ์˜ ๋‚ญ๋น„๊ฐ€ ์‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ๊ธฐ์–ต ๊ณต๊ฐ„ ์š”๊ตฌ
    • ๊ฒ€์ƒ‰ ๋ฐฉ๋ฒ• ์ค‘์—์„œ ์†๋„๊ฐ€ ๊ฐ€์žฅ ๋น ๋ฅด๋‹ค
    • ์‚ฝ์ž…, ์‚ญ์ œ ์ž‘์—…์˜ ๋นˆ๋„๊ฐ€ ๋งŽ์„ ๋•Œ ์œ ๋ฆฌ

    ์•”ํ˜ธํ™” ํ•ด์‹œ ํŠน์ง•

    • ์ผ๋ฐฉํ–ฅ์„ฑ โ€“ ์•”ํ˜ธํ™”๋œ ๊ฐ’์„ ๋‹ค์‹œ ์›๋ž˜์˜ ๊ฐ’์œผ๋กœ ๋Œ๋ ค ๋†“์„ ์ˆ˜ ์—†์Œ
    • ๊ณ ์œ ์„ฑ โ€“ ์„œ๋กœ ๋‹ค๋ฅธ ์ž…๋ ฅ ๊ฐ’์— ๋Œ€ํ•ด ๋™์ผํ•œ ํ•ด์‹œ ๊ฐ’์ด ์ƒ์„ฑ๋  ํ™•๋ฅ ์ด ๋งค์šฐ ๋‚ฎ์Œ
    • ๋ฌด๊ฒฐ์„ฑ โ€“ ์ž…๋ ฅ ๊ฐ’์— ๋Œ€ํ•œ ํ•ด์‹œ ๊ฐ’์ด ์กฐ๊ธˆ์ด๋ผ๋„ ๋‹ค๋ฅด๋ฉด, ์›๋ณธ ๊ฐ’์ด ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธ
    • ๋ถˆ๋ณ€์„ฑ โ€“ ์ž…๋ ฅ ๊ฐ’์ด ์กฐ๊ธˆ์ด๋ผ๋„ ๋ณ€๊ฒฝ๋˜๋ฉด, ํ•ด์‹œ ๊ฐ’๋„ ์ „ํ˜€ ๋‹ค๋ฅธ ๊ฐ’

    Oracle DISTINCT ์—ฐ์‚ฐ - (๊ตฌ๋ฒ„์ „) Sort vs (10g ์ดํ›„) Hash

    ๐Ÿ’กํ”ผ๋“œ๋ฐฑ Tip

    ๐Ÿ’ก
    ์ตœ์ข… ํ”„๋กœ์ ํŠธ์— Hash ํ•จ์ˆ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ํšŒ์› ์ •๋ณด๋ฅผ ์•”ํ˜ธํ™” ํ•˜๋Š” ๊ฒƒ ๋“ฑ์— ์‘์šฉํ•˜์ž
    ๐Ÿ’ก
    ์ถ”ํ›„ Interactive SQL์„ ํ†ตํ•ด SQL์„ ๊ฐœ๋ฐœ ๋ฐ ๊ธฐ๋Šฅ, ์„ฑ๋Šฅ์„ ๊ฒ€์ฆํ•˜๊ณ , embeded SQL๋กœ ํ•ด๋‹น SQL์„ ๋„ฃ์–ด ๊ฐœ๋ฐœํ•œ๋‹ค.
    ๐Ÿ’ก
    ์ตœ์ข… ํ”„๋กœ์ ํŠธ์— SQL์˜ ์‹คํ–‰ ๊ณ„ํš ์กฐํšŒ โ†’ ์ฟผ๋ฆฌ ํŠœ๋‹์„ ์ ์šฉํ•˜์ž

    SHOW USER;


    ๐Ÿ“˜ Data Type Conversion

    ์‹คํ–‰ ๊ณ„ํš (Execution Plan) ์กฐํšŒ

    ๐Ÿ’ก
    โ‘  SELECT * FROM EMP WHERE SAL = '3000โ€™; โ‘ก SQL ์„ ํƒ > ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ > ์„ค๋ช… > ๊ณ„ํš์„ค๋ช… (Explain execution plan)

    โ‘ข[์—๋Ÿฌ ๋ฐœ์ƒ์‹œ] ๊ถŒํ•œ์ด ์—†๋Š” ๊ฒฝ์šฐ DBA ๊ณ„์ •์œผ๋กœ SQL ์›Œํฌ์‹œํŠธ ์ƒ์„ฑ

    • ๋„๊ตฌ(T) > SQL ์›Œํฌ์‹œํŠธ > mgrDinkDBMS ํด๋ฆญ
    • grant select_any_catalog to scott; ## ๊ถŒํ•œ๋ถ€์—ฌ
    • ๋„๊ตฌ(T) > SQL ์›Œํฌ์‹œํŠธ > devDinkDBMS ํด๋ฆญ ## ์‹ ๊ทœ session ์ƒ์„ฑ๋ถ€ํ„ฐ ์ ์šฉ

    โ‘ฃ โ‘ก ์žฌ์‹คํ–‰ !! ์•”์‹œ์  ํ˜•๋ณ€ํ™˜(Implicit Datatype Conversion)

    ๐Ÿ“˜ DECODE, CASE

    DECODE

    ๐Ÿ’ก
    DECODE๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ์˜ ๊ฐ„๊ฒฐ๊ณผ ์„ฑ๋Šฅ ํšจ์œจ์„ฑ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    ๐Ÿ’ก
    DECODE
    • ์กฐ๊ฑด์ ˆ( IF ~ ELSE IF ~ELSE ) ์—ฐ์‚ฐ์ž
    • โ€˜=โ€˜ ๋น„๊ต ์—ฐ์‚ฐ์ž๋งŒ ์‚ฌ์šฉ
    • DECODE Syntax Diagram


    โ‘ 

    SELECT DEPTNO, ENAME,
    DECODE(DEPTNO, 10, 'ACCOUNTING', 20, 'RESEARCH', 30, 'SALES', 'ETC')
    FROM EMP
    ORDER BY DEPTNO;

    โ‘ก

    SELECT COMM, DECODE(COMM, NULL, 0, COMM) FROM EMP;

    โ†’ DECODE๋ฅผ ํ™œ์šฉํ•ด NVLํ•จ์ˆ˜ ๊ธฐ๋Šฅ ๊ตฌํ˜„

    โ‘ข - 1

    SELECT GREATEST(3000,1500,2100,5000),LEAST(3000,1500,2100,5000) FROM DUAL;

    โ‘ข - 2

    SELECT DEPTNO, ENAME, SAL,
    DECODE(GREATEST(SAL,4800),SAL,'HIGH',DECODE(GREATEST(SAL,3000),SAL,'MID','LOW'))
    FROM EMP
    ORDER BY DEPTNO;

    - DECODE์— ๋‹ค์‹œ DECODE์™€ GREATEST๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ฒ”์œ„์— ๋”ฐ๋ผ ์กฐ๊ฑด ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๊ตฌ๋ฌธ ํ™œ์šฉ (DECODE์˜ NESTED ๊ตฌ์กฐ) โ€˜=โ€˜ ์—ฐ์‚ฐ์ž๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ decode๋ฅผ greatest ํ•จ์ˆ˜์™€ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ”์œ„ ์—ฐ์‚ฐ ์ˆ˜ํ–‰

    CASE

    ๐Ÿ’ก
    ์กฐ๊ฑด์ ˆ( IF ~ ELSE IF ~ELSE ) ์—ฐ์‚ฐ์ž

    DECODE ์—ฐ์‚ฐ์ž ๊ธฐ๋Šฅ ํ™•์žฅ & ์„ฑ๋Šฅ ํ–ฅ์ƒ

    • CASE: ANSI-SQL , DECODE : Oracle SQL
    • ๊ธฐ๋Šฅ: ๋น„๊ต ์—ฐ์‚ฐ์ž, ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ, SQL ์—ฐ์‚ฐ์ž(ex LIKE , IN )
    • ์„ฑ๋Šฅ: DECODE ~ ํ•จ์ˆ˜ , CASE ~ Statement (SQL, PL/SQL)

    CASE Syntax Diagram

    ๐Ÿ’ก
    โ‘ 
    SELECT DEPTNO,ENAME,
    CASE DEPTNO WHEN '10' THEN 'ACCOUNTING' -- ์•”์‹œ์ (x), ์—๋Ÿฌ ์›์ธ? ์ˆ˜์ •ํ›„ ์‹คํ–‰
                WHEN 20 THEN 'RESEARCH'
                WHEN 30 THEN 'SALES'
                ELSE 'ETC'
                END AS DEPARTMENT
    FROM EMP
    ORDER BY DEPTNO;

    ์ˆ˜์ •

    SELECT DEPTNO, ENAME,
    CASE DEPTNO WHEN 10 THEN 'ACCOUNTING'
                WHEN 20 THEN 'RESEARCH'
                WHEN 30 THEN 'SALES'
                ELSE 'ETC'
                END AS DEPARTMENT
    FROM EMP
    ORDER BY DEPTNO;

    โ‘ก

    SELECT DEPTNO, ENAME, SAL, -- Searched case
    CASE WHEN SAL >= 4800 THEN 'HIGH' -- ๋น„๊ต ์—ฐ์‚ฐ์ž
         WHEN SAL BETWEEN 3000 AND 4799 THEN 'MID' -- SQL ์—ฐ์‚ฐ์ž
         WHEN SAL >= 1000 AND SAL <=2999 THEN 'LOW' -- ๋น„๊ต & ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž
         ELSE 'Passion pay'
         END SAL_GRADE
    FROM EMP
    ORDER BY DEPTNO;

    โ†’ DECODE๋Š” โ€˜=โ€™ ์—ฐ์‚ฐ๋งŒ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์— ๋น„ํ•ด CASE๋Š” ๋ฒ”์œ„, ๋…ผ๋ฆฌ ๋“ฑ ์ž์œ ๋กญ๊ฒŒ ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

    โ‘ข

    SELECT DEPTNO, ENAME, COMM,
    CASE WHEN COMM >= 1000 THEN 'Great'
         WHEN COMM >= 500 THEN 'Good'
         WHEN COMM >= 0 THEN 'Bad'
         ELSE 'Dreadful' -- ELSE์—์„œ NULL Catch
    END COMM_GRADE
    FROM EMP
    ORDER BY DEPTNO;

    โ†’ COMM ์€ NULL์„ ๊ฐ€์ง„ ์ปฌ๋Ÿผ์ด๋‹ค. NULL์€ ์ผ๋ฐ˜ ๋น„๊ต์—ฐ์‚ฐ์ž๋กœ ๋น„๊ตํ•  ์ˆ˜ ์—†๋‹ค. โ†’ NULL์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋Š” else ๊ตฌ๋ฌธ์—์„œ ์ฒ˜๋ฆฌ ๋œ๋‹ค.

    โ‘ฃ-1

    โ€” ์ž‘์€ ๊ฐ’๋ถ€ํ„ฐ ํฐ ๊ฐ’ ์กฐ๊ฑด ๋น„๊ต โ†’ ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌ๋˜์ง€ ๋ชปํ•œ๋‹ค.

    SELECT SAL,
    CASE
        WHEN SAL >= 1000 THEN 1
        WHEN SAL >= 2000 THEN 2
        WHEN SAL >= 3000 THEN 3
        WHEN SAL >= 4000 THEN 4
        WHEN SAL >= 5000 THEN 5
        ELSE 0
        END AS SAL_GRADE
    FROM EMP
    ORDER BY SAL;

    โ‘ฃ-2

    โ€” ํฐ ๊ฐ’๋ถ€ํ„ฐ ์ž‘์€ ๊ฐ’ ์กฐ๊ฑด ๋น„๊ต โ†’ ํ•ญ์ƒ ํฐ ๊ฐ’๋ถ€ํ„ฐ ์ž‘์€ ๊ฐ’์œผ๋กœ ์กฐ๊ฑด ์ฒ˜๋ฆฌ ํ•ด์•ผ ํ•œ๋‹ค.

    SELECT SAL, CASE
        WHEN SAL >= 5000 THEN 5
        WHEN SAL >= 4000 THEN 4
        WHEN SAL >= 3000 THEN 3
        WHEN SAL >= 2000 THEN 2
        WHEN SAL >= 1000 THEN 1
        ELSE 0
        END "Sal Grade"
    FROM EMP
    ORDER BY SAL;

    ๐Ÿ’ก
    DECODE, CASE๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, Java ์ฝ”๋“œ ๋‚ด์—์„œ SQL๊ณผ If-case๋ฌธ์˜ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. Java ์ฝ”๋“œ ๋‚ด์—์„œ SQL ์ฒ˜๋ฆฌ์™€ Java ์กฐ๊ฑด ์ฒ˜๋ฆฌ๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ Overhead (Context Switch) ๊ฐ€ ์ฆ๊ฐ€ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, ๊ฐ€๋Šฅํ•œ SQL๋กœ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค!

    ๐Ÿ“˜ ROWNUM

    ๐Ÿ’ก
    For each row returned by a query, the ROWNUM pseudocolumn returns a number indicating the order in which Oracle selects the row from a table or set of joined rows. The first row selected has a ROWNUM of 1, the second has 2, and so on.

    ROWNUM์€ ํŠน์ • ๋ ˆ์ฝ”๋“œ์— ๋ถ€์—ฌ๋˜๋Š” ๊ณ ์œ ํ•œ ๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹ˆ๋‹ค! ROWNUM์€ ์ฟผ๋ฆฌ์— ์˜ํ•ด ๋ฆฌํ„ด ๋œ ๊ฐ๊ฐ์˜ ROW(Result Set)์— ๋ถ€์—ฌ๋œ๋‹ค.

    โ†’ ROWNUM์€ Pseudo Column (๊ฐ€์ƒ์˜ ์ปฌ๋Ÿผ) ์ด๋‹ค. (์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.)

    ๐Ÿ’ก
    cf) Pseudo Colum ์ข…๋ฅ˜ - ROWNUM - ROWID - Sequence - Nextval - currentval

    ๐Ÿ’ก
    SQL-Developer ๋ฉ”๋‰ด ์ฐฝ > Configure Window > ์„ธ๋กœ๋กœ๋ถ„ํ• (V) ํ›„ ์™ผ์ชฝ์ฐฝ(โ‘  ์‹คํ–‰) ์˜ค๋ฅธ์ชฝ์ฐฝ(โ‘ก ์‹คํ–‰)ํ•˜์—ฌ ROWNUM์ด ๊ฐ ํ–‰์— ๋ถ€์—ฌ๋˜๋Š” ๊ณ ์œ ๋ฒˆํ˜ธ์ธ์ง€ ๋น„๊ต

    โ‘ 

    SELECT ROWNUM, ENAME, DEPTNO, SAL FROM EMP;

    โ‘ก

    SELECT ROWNUM, ENAME, DEPTNO, SAL FROM EMP ORDER BY DEPTNO, SAL;

    โ‘ข

    SELECT ROWNUM, ENAME, DEPTNO, SAL FROM EMP WHERE DEPTNO IN (10, 20) ORDER BY DEPTNO, SAL;
    • ์‹คํ–‰ ์ˆœ์„œ : WHERE > ROWNUM > ORDER BY

    โ‘ฃ SELECT ENAME,DEPTNO,SAL FROM EMP WHERE ROWNUM = 1; // O , 1 Row = 1

    โ‘ค SELECT ENAME,DEPTNO,SAL FROM EMP WHERE ROWNUM = 3; // X

    • 1 Row != 3 โž” ํ•„ํ„ฐ๋ง โž” 2 Row๊ฐ€ 1 Row๊ฐ€ ๋˜์–ด 1 Row != 3 ๋น„๊ต๋ฅผ ๋ฐ˜๋ณต

    โ‘ฅ SELECT ENAME,DEPTNO,SAL FROM EMP WHERE ROWNUM > 3; // X

    โ‘ฆ SELECT ENAME,DEPTNO,SAL FROM EMP WHERE ROWNUM <= 3; // O

    โ‘ง SELECT ENAME,DEPTNO,SAL FROM EMP WHERE ROWNUM < 3; // O

    ๐Ÿ’ก
    Result Set์˜ ์‹คํ–‰ ์ˆœ์„œ * Result Set : Where ์ ˆ์— ์˜ํ•ด ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์œผ๋กœ ๋ฆฌํ„ด ๋œ ๊ฒƒ 1) FROM 2) WHERE 3) ROWNUM 4) Order By * ROWNUM์€ Where์ ˆ์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์— ๋ฒˆํ˜ธ๋ฅผ ๋งค๊ธด ๊ฒƒ

    ๐Ÿ“˜ ๋…ผ๋ฆฌ์—ฐ์‚ฐ์ž AND OR NOT

    ๐Ÿ’ก
    โ‘  SELECT ENAME,JOB,SAL,DEPTNO FROM EMP WHERE DEPTNO = 10 AND SAL > 2000;

    โ‘ก SELECT ENAME,JOB,SAL,DEPTNO FROM EMP WHERE DEPTNO = 10 OR SAL > 2000;

    โ‘ข

    SELECT ENAME, JOB SAL, DEPTNO FROM EMP WHERE SAL > 2000 OR SAL > 2000;
    โ—
    ์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„ , ์ข‹์€ ๋ฐฉ์‹์˜ SQL? , OPTIMIZER(SQL ์ตœ์ ํ™”๊ธฐ)๊ฐ€ AND ์™€ OR์ค‘ ์„ ํ˜ธํ•˜๋Š” ์—ฐ์‚ฐ์ž๋Š”? AND ๊ฐ€ ๋” ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’๋‹ค! (์ผ ์–‘์„ ์ค„์ž„)

    โ‘ฃ SELECT ENAME,JOB,SAL,DEPTNO FROM EMP WHERE DEPTNO = 10 AND SAL > 2000 OR JOB = 'CLERK';

    โ‘ค SELECT ENAME,JOB,SAL,DEPTNO FROM EMP WHERE (DEPTNO = 10 AND SAL > 2000) OR JOB = 'CLERK';

    โ‘ฅ SELECT ENAME,JOB,SAL,DEPTNO FROM EMP WHERE DEPTNO = 10 AND (SAL > 2000 OR JOB = 'CLERK');

    โ‘ฆ SELECT ENAME,JOB,SAL FROM EMP WHERE JOB != 'CLERK';

    โ‘ง SELECT ENAME,JOB,SAL FROM EMP WHERE JOB NOT IN('CLERK','MANAGER');

    ๐Ÿ“˜ ํ•จ์ˆ˜

    ๐Ÿ’ก
    ORACLE DEFINED FUNCTION โ‘  SINGLE ROW FUNCTION (๋‹จ์ผ ํ–‰ ํ•จ์ˆ˜) - ๋ฌธ์ž ํ•จ์ˆ˜ - ์ˆซ์ž ํ•จ์ˆ˜ - ๋‚ ์งœ ํ•จ์ˆ˜ - ๋ณ€ํ™˜ ํ•จ์ˆ˜(DATA TYPE CONVERSION) - ๊ธฐํƒ€ ํ•จ์ˆ˜ โ‘ก GROUP ROW FUNCTION (๊ทธ๋ฃน ํ–‰ ํ•จ์ˆ˜)

    USER DEFINED FUNCTION (PL/SQL)

    โ†’ PL/SQL์„ ์ด์šฉํ•ด SQL์—์„œ๋„ ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜๋ฅผ ์ž˜ ๋งŒ๋“ค์–ด์„œ ๊ณตํ†ต ๋ชจ๋“ˆ์„ ๋งŒ๋“ค์–ด ์žฌ ์‚ฌ์šฉ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

    ๋‹จ์ผํ–‰ ํ•จ์ˆ˜

    ๋ฌธ์ž ํ•จ์ˆ˜

    ๐Ÿ’ก
    โ‘  SELECT ENAME, lower(ENAME) ,upper(ENAME), initcap(ENAME) FROM EMP;

    โ‘ก SELECT ENAME, substr(ENAME,1,3), substr(ENAME,4), substr(ENAME,-3,2) FROM EMP;

    โ‘ข SELECT ENAME, instr(ENAME,'A'), instr(ENAME,'A',2), instr(ENAME,'A',1,2) FROM EMP; // ๋ฌธ์ž์—ด ๋‚ด์œ„์น˜

    โ‘ฃ SELECT ENAME,rpad(ENAME,10,' '),rpad(ENAME,10), rpad(ENAME,10,''),lpad(ENAME,10,'+') FROM EMP;

    SELECT length(rpad('X',1000,'Xโ€™)), rpad('X',1000,'X') FROM DUAL; // dummy data

    โ‘ค SELECT ENAME, REPLACE(ENAME,'S','s') FROM EMP;

    โ‘ฅ SELECT ENAME, concat(ENAME,JOB), ENAME||JOB FROM EMP;

    // ์•ž ๋’ค ๊ณต๋ฐฑ๋ฌธ์ž ์—†์• ๊ธฐ โ‘ฆ SELECT ltrim(' ๋Œ€ํ•œ๋ฏผ๊ตญ '), rtrim(' ๋Œ€ํ•œ๋ฏผ๊ตญ '),trim(' ' from ' ๋Œ€ํ•œ๋ฏผ๊ตญ '), trim('*' from '๋Œ€ํ•œ๋ฏผ๊ตญ') FROM dual;

    SELECT trim('์žฅ' from '์žฅ๋ฐœ์žฅ'), ltrim('์žฅ๋ฐœ์žฅ','์žฅ'), rtrim('์žฅ๋ฐœ์žฅ','์žฅ') FROM dual;

    // ๋ฌธ์ž์—ด ๊ธธ์ด ๋ฆฌํ„ด โ‘ง SELECT length('abcd'), substr('abcd',2,2), length('๋Œ€ํ•œ๋ฏผ๊ตญ'), substr('๋Œ€ํ•œ๋ฏผ๊ตญ',2,2) FROM dual;

    • DBMS ๋‚ด๋ถ€ ์ €์žฅ์‹œ : ์˜๋ฌธ์ž 1 Byte , ํ•œ๊ธ€: 2~3 Bytes ํ• ๋‹น , length: ๋ฌธ์ž์—ด ํ•จ์ˆ˜
    • SUBSTR() ์‚ฌ์šฉ์‹œ ํ•œ๊ธ€์ด๋‚˜ ์˜๋ฌธ๊ณผ ์ฐจ์ด๊ฐ€ ์—†๋‹ค. (๊ฐ™์€ ๋ฌธ์ž์—ด๋กœ ์ทจ๊ธ‰)

    โ‘จ SELECT lengthb('abcd'),lengthb('๋Œ€ํ•œ๋ฏผ๊ตญ'),substr('๋Œ€ํ•œ๋ฏผ๊ตญ',2,2),substrb('๋Œ€ํ•œ๋ฏผ๊ตญ',2,2) FROM dual;

    • DBMS ์ฒด๊ณ„๊ฐ€ UNICODE ์บ๋ฆญํ„ฐ ์…‹์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ํ•œ๊ธ€์€ ๊ธ€์ž ๋‹น 3Bytes๋ฅผ ํ• ๋‹น๋˜์–ด์žˆ๋‹ค.
    • SUBSTRB๋Š” byte ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ, โ€˜๋Œ€ํ•œ๋ฏผ๊ตญโ€™ ํ•œ๊ธ€์„ ์ •์ƒ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋‹ค.

    โ‘ฉ SELECT length('abcd'), vsize('abcd'), length('๋Œ€ํ•œ๋ฏผ๊ตญ'), vsize('๋Œ€ํ•œ๋ฏผ๊ตญ') FROM dual;

    • VSIZE : ํ• ๋‹น๋œ Bytes์ˆ˜ ๋ฆฌํ„ด

    โ‘ช SELECT ASCII('Aโ€™), ASCII('a') FROM dual; -- 65, 97

    โ‘ซ

    SELECT CHR(65), CHR(97) FROM DUAL;

    SELECT 'Hellow'||CHR(10)||'World' FROM DUAL; -- Line feed ?? โ“ run as script โ“‘ double-click cell

    ์ˆซ์ž ํ•จ์ˆ˜ (1)

    ๐Ÿ’ก
    โ‘  SELECT round(45.923,2), round(45.923,1), round(45.923,0), round(45.923), round(45.923,-1) FROM dual;

    โ‘ก SELECT trunc(45.923,2), trunc(45.923,1), trunc(45.923,0), trunc(45.923), trunc(45.923,-1) FROM dual;

    โ‘ข SELECT mod(100,3), mod(100,2) FROM dual;

    โ‘ฃ SELECT ENAME,SAL,SAL0.053 as tax, round(SAL0.053,0) as rtax FROM EMP; // ๊ธ‰์—ฌ์˜5.3%์„ธ๊ธˆ,์›๋‹จ์œ„ ๋ฐ˜์˜ฌ๋ฆผ

    โ‘ค SELECT CEIL(-45.594),CEIL(-45.294),CEIL(45.294), ROUND(-45.594),ROUND(-45.294),ROUND(45.594) FROM DUAL; // ์ ˆ๋Œ€๊ฐ’์—ฐ์‚ฐ

    โ‘ฅ SELECT FLOOR(45.245),FLOOR(-45.245),FLOOR(45.545),FLOOR(-45.545) FROM DUAL;

    ์ˆซ์ž ํ•จ์ˆ˜ (2)

    ๐Ÿ’ก
    โ‘  SELECT sign(-999),sign(999) FROM dual;

    โ‘ก SELECT 23,power(2,3), power(-2,3), power(-2,4) FROM dual; -- ??

    // PL/SQL โ‘ข variable x number begin :x := 23; end; / print x


    ๐Ÿ“0403 ๊ณผ์ œ

    2. OR ์—ฐ์‚ฐ์‹œ ์ค‘๋ณต๋˜๋Š” ROW๋Š” ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋Š”์ง€ ์•„๋ž˜์˜ SQL์„ ์‹คํ–‰ํ•œํ›„ ๊ฒฐ๊ณผ๋ฅผ ์„ค๋ช…. DEPTNO = 20 OR JOB = 'CLERK' ๋ฅผ ๋‘˜๋‹ค ๋งŒ์กฑํ•˜๋Š” ROW๋Š” 2๋ฒˆ ์ถœ๋ ฅ ๋˜๋Š”๊ฐ€ ?

    SELECT DEPTNO,JOB,ENAME FROM EMP WHERE  DEPTNO = 20;			// 5 Rows
    SELECT DEPTNO,JOB,ENAME FROM EMP WHERE  JOB = 'CLERK';			// 4 Rows
    SELECT DEPTNO,JOB,ENAME FROM EMP WHERE  DEPTNO = 20  OR JOB = 'CLERK'; // 7 Rows
    ๐Ÿ’ก
    ๋‘˜ ๋‹ค ๋งŒ์กฑํ•˜๋Š” ํ–‰(ROW)๋Š” 1๋ฒˆ๋งŒ ์ถœ๋ ฅ๋œ๋‹ค. OR ์—ฐ์‚ฐ์ž๋Š” ํ•˜๋‚˜๊ฐ€ True์ด๋ฉด ์ „์ฒด๊ฐ€ True์ด๋‹ค. ๋˜ํ•œ ์–ด๋А ํ•˜๋‚˜๋ผ๋„ ๋งŒ์กฑํ•˜๋Š” ํ–‰๋งŒ ๋ฐ˜ํ™˜ ๋˜๋ฏ€๋กœ, ์ค‘๋ณต๋˜๋Š” ํ–‰์€ ์ถœ๋ ฅ ๋˜์ง€ ์•Š๋Š”๋‹ค.

    3. ๋ถ€์„œ๋ณ„ ์ฐจ๋“ฑ ๋ณด๋„ˆ์Šค๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” SQL ์ž‘์„ฑ

    • 10๋ฒˆ ๋ถ€์„œ ๊ธ‰์—ฌ์˜ 0.3%,20๋ฒˆ๋ถ€์„œ ๊ธ‰์—ฌ์˜ 20%,30๋ฒˆ ๋ถ€์„œ ๊ธ‰์—ฌ์˜ 10%,๋‚˜๋จธ์ง€ ๋ชจ๋“  ๋ถ€์„œ 1%
    • ๋ถ€์„œ ๋ฒˆํ˜ธ, ์ด๋ฆ„,์ง๋ฌด,๊ธ‰์—ฌ,๋ณด๋„ˆ์Šค ์ถœ๋ ฅ
    • ๋ถ€์„œ๋ณ„, ์ตœ๊ณ  ๋ณด๋„ˆ์Šค ์ˆœ์„œ๋กœ ์ •๋ ฌ
    • ์†Œ์ˆ˜์  ๋ฐ˜์˜ฌ๋ฆผ
    • ์ปฌ๋Ÿผํ—ค๋”ฉ ๋ณ€๊ฒฝ์‹œ ์ปฌ๋Ÿผ Alias ์‚ฌ์šฉ
    SELECT DEPTNO, ENAME, JOB, SAL,
    ROUND(SAL * DECODE(DEPTNO, 10, 0.003, 20, 0.2, 30, 0.1, 0.01)) AS "๋ณด๋„ˆ์Šค"
    FROM EMP
    ORDER BY DEPTNO, "๋ณด๋„ˆ์Šค" DESC;

    4. DECODE ์™€ CASE์ด ์ฐจ์ด์  ์ •๋ฆฌํ›„ ๋ฐœํ‘œ

    ๐Ÿ’ก
    Oracle DBMS์—์„œ decode ํ•จ์ˆ˜๋Š” ์กฐ๊ฑด์— ๋”ฐ๋ผ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ decode ํ•จ์ˆ˜๋Š” ํ•˜๋‚˜์˜ ๊ฐ’์„ ๋น„๊ตํ•˜๊ณ , ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ(โ€™=โ€™)์—๋งŒ ํ•ด๋‹น ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์กฐ๊ฑด์ ˆ( IF ~ ELSE IF ~ELSE ) ์—ฐ์‚ฐ์ž

    โ€˜=โ€˜ ๋น„๊ต ์—ฐ์‚ฐ์ž๋งŒ ์‚ฌ์šฉ

    ๋ฐ˜๋ฉด์—, ANSI/ISO ํ‘œ์ค€case ํ•จ์ˆ˜๋Š”decode ์—ฐ์‚ฐ์ž์˜ ๊ธฐ๋Šฅ ํ™•์žฅํ•œ ๊ฒƒ์œผ๋กœ ๋น„๊ต, ๋…ผ๋ฆฌ, SQL ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    SELECT CASE
             WHEN age >= 65 THEN 'Senior'
             WHEN age >= 18 THEN 'Adult'
             ELSE 'Child'
           END AS age_group
    FROM employees;

    5. CASE ๊ตฌ๋ฌธ์—์„œ LIKE ์—ฐ์‚ฐ์ž ์™€ IN ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ž„์˜์˜ SQL ์ž‘์„ฑ

    SELECT DEPTNO, ENAME, JOB,
    CASE
    		WHEN JOB LIKE 'A%' THEN 'A'
    		WHEN JOB IN('CLERK', 'SALESMAN') THEN 'B'
            ELSE 'C'
            END AS "JOB_RANK"
    FROM EMP;

    6. ์‹คํ–‰ํ›„ ๊ฒฐ๊ณผ ์„ค๋ช…

    SELECT DEPTNO, ENAME, DECODE(DEPTNO,10,'ACCOUNTING',20,'RESEARCH','ETC') FROM EMP ORDER BY DEPTNO;
    SELECT DEPTNO, ENAME, DECODE(DEPTNO,10,'ACCOUNTING',20,'RESEARCH') FROM EMP ORDER BY DEPTNO;
    ๐Ÿ’ก
    ์ฒซ๋ฒˆ ์งธ DEPTNO๊ฐ€ 10, 20์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฐ’์— ๋Œ€ํ•ด 'ETCโ€™๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค. ์กฐ๊ฑด๋ฌธ์—์„œ else์™€ ๊ฐ™์€ ๋กœ์ง์ด๋‹ค. 10๊ณผ 20์— ํ•ด๋‹นํ•˜์ง€ ์•Š์€ ๋‚˜๋จธ์ง€๋Š” NULL๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค. ๋‘๋ฒˆ ์งธ DEPTNO๊ฐ€ 10, 20์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฐ’์— ๋Œ€ํ•ด NULL์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    7. ์ค‘์ฒฉ decode๋ฅผ ์‚ฌ์šฉํ•œ ์•„๋ž˜์˜ ๊ฒฐ๊ณผ์™€ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ decode + || (ํ•ฉ์„ฑ์—ฐ์‚ฐ์ž)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑ ํ•˜์‹ญ์‹œ์š”

    select deptno,job,decode(deptno, 10 ,decode(job,'CLERK','OK','NO'),'NOโ€™)
    from emp
    order by deptno,job;

    ๋‹ต

    SELECT deptno,job,decode(deptno||JOB, '10CLERK' , 'OK', 'NO')
    FROM emp
    ORDER BY deptno,job;



    Uploaded by N2T

    728x90
    ๋ฐ˜์‘ํ˜•

    'Computer Science > DB' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

    [SQL] DML - TRANSACTION  (0) 2023.04.20
    [SQL] DML-INSERT, UPDATE, DELETE  (0) 2023.04.20
    [SQL] DBMS ์•„ํ‚คํ…์ฒ˜ - Server Process  (0) 2023.04.05
    [SQL] ORDER BY, DISTINCT, SQL ์—ฐ์‚ฐ์ž  (0) 2023.04.05
    [SQL] SELECT, SELECT LIST, WHERE, NULL  (0) 2023.04.05

    ๋Œ“๊ธ€

Keydi's Tistory