ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SQL] SubQuery
    Computer Science/DB 2023. 4. 20. 21:00
    728x90

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

    ์„ธ์…˜ ์ •๋ณด ํ™•์ธ

    SHOW USER; -- system ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธ
    SELECT * FROM V$SESSION;
    SELECT * FROM V$SESSION WHERE USERNAME = 'SYSTEM';


    ๐Ÿ“˜ SubQuery

    • SubQuery : Main Query (SELECT, INSERT, DELETE, UPDATE, CREATE) ์•ˆ์— ํฌํ•จ๋˜๋Š” SELECT
    ๐Ÿ’ก
    ์„œ๋ธŒ ์ฟผ๋ฆฌ๊ฐ€ ๋จผ์ € ์‹คํ–‰๋œ๋‹ค. (Nested ๊ตฌ์กฐ์—์„œ ์•ˆ์ชฝ์ด ๋จผ์ € ์‹คํ–‰๋˜๋Š” ๊ฒƒ์œผ๋กœ ์ดํ•ด!) SMITH๊ฐ€ ์ผํ•˜๋Š” ๋ถ€์„œ์˜ ์ง์› ์ด๋ฆ„, ์ง์—… ์ถœ๋ ฅ ๋œ๋‹ค.

    • Subquery์˜ ์ข…๋ฅ˜
    ๐Ÿ’ก
    Scalar Subquery (SELECT) : ์ปฌ๋Ÿผ์ฒ˜๋Ÿผ ์‚ฌ์šฉ๋˜์–ด 1๊ฐœ์˜ ํ–‰, ์—ด ๊ฐ’์„ ๋ฆฌํ„ดํ•˜์—ฌ ์ปฌ๋Ÿผ์ฒ˜๋Ÿผ ์‚ฌ์šฉ๋˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ Inline View (FROM) : ํ•œ ์ค„์˜ ๋ทฐ, FROM ์ ˆ์— ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ํ…Œ์ด๋ธ” ๋Œ€์‹  ์‚ฌ์šฉ ๊ฐ€๋Šฅ Nested Subquery (WHERE, HAVING) : WHERE, HAVING ์ ˆ์— ์‚ฌ์šฉ๋˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ cf)
    • Query์˜ 2๊ฐ€์ง€ ์˜๋ฏธ โ‘  SQL โ‘ก SELECT
    • Scalar : ๋‹จ์ผ๊ฐ’

    • ์‹คํ–‰ ์ˆœ์„œ
    ๐Ÿ’ก
    ์ผ๋ฐ˜์ ์ธ ์„œ๋ธŒ ์ฟผ๋ฆฌ ์‹คํ–‰ ์ˆœ์„œ

    SUBQUERY ์‹คํ–‰ (๊ฒฐ๊ณผ ์ง‘ํ•ฉ(๋ฐ์ดํ„ฐ)์ด ๋งŒ๋“ค์–ด ์ง„๋‹ค.) โ†’ MAIN QUERY์‹คํ–‰ ์˜ˆ์™ธ) Correlated Subquery (์ƒ๊ด€์„œ๋ธŒ์ฟผ๋ฆฌ)

    Correlated Subquery ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ๋ฉ”์ธ์ฟผ๋ฆฌ์˜ ์ปฌ๋Ÿผ์„ ์ฐธ์กฐ ํ•œ๋‹ค. (์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ๋ฉ”์ธ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐ) ๋ฉ”์ธ ์ฟผ๋ฆฌ๊ฐ€ ๋จผ์ € ์‹คํ–‰๋˜๊ณ  ์„œ๋ธŒ์ฟผ๋ฆฌ์—์„œ ํ•„ํ„ฐ๋ง ํ•˜๋Š” ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ

    ์„œ๋ธŒ ์ฟผ๋ฆฌ ์‚ฌ์šฉ์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ

    • ์„œ๋ธŒ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ, ์ค‘๊ฐ„ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๊ฐ€ DBMS ๋‚ด์—์„œ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋˜์–ด ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด ๋œ๋‹ค.
    • ์„œ๋ธŒ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด, ์—ฌ๋Ÿฌ ๋ฒˆ์˜ ์š”์ฒญ์— ๋”ฐ๋ฅธ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ์˜ ์‘๋‹ต ๊ณผ์ •์ด ์ถ”๊ฐ€๋œ๋‹ค. ๋˜ํ•œ ์ค‘๊ฐ„ ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋‹ด๋‹นํ•˜๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

    ๐Ÿ’ก
    SINGLE COLUMN,SINGLE ROW โ‘ 
    SELECT ENAME,JOB FROM EMP
    WHERE DEPTNO = (SELECT DEPTNO FROM EMP WHERE ENAME = 'SMITH' );

    โ†’ SMITH ์˜ ๋ถ€์„œ์— ์ผํ•˜๋Š” ์ง์› ์ด๋ฆ„, ์ง์—… ์ถœ๋ ฅ

    โ‘ก

    SELECT ENAME,SAL FROM EMP WHERE SAL < ( SELECT AVG(SAL) FROM EMP);

    โ†’ ์ง์› ๊ธ‰์—ฌ ํ‰๊ท ๋ณด๋‹ค ์ ์€ ๊ธ‰์—ฌ๋ฅผ ๋ฐ›๋Š” ์ง์› ์ด๋ฆ„๊ณผ ๊ธ‰์—ฌ ์ถœ๋ ฅ

    SINGLE COLUMN, MULTIPLE ROW RETURN SUBQUERY โ‘ 

    SELECT ENAME,JOB FROM EMP WHERE DEPTNO = 10,30; --? ์—๋Ÿฌ

    โ†’ ์—๋Ÿฌ ๋ฐœ์ƒ : = ์—ฐ์‚ฐ์ž ์˜ค๋ฅธ์ชฝ R-VALUE๋Š” ํ•˜๋‚˜๋งŒ ์™€์•ผ ํ•œ๋‹ค.

    โ‘ก ๋ณต์ˆ˜๊ฐœ ๊ฐ’ ์ฒ˜๋ฆฌ ์œ„ํ•ด์„  IN, ANY, ALL ๋ฆฌ์ŠคํŠธ ์—ฐ์‚ฐ์ž ์‚ฌ์šฉํ•ด์•ผ ๋œ๋‹ค.

    -- Multiple Rows -- IN,ANY,ALL
    SELECT ENAME,JOB FROM EMP WHERE DEPTNO IN (10,30); 

    โ†’ 10๋ฒˆ, 20๋ฒˆ ๋ถ€์„œ์˜ ์ง์› ์ด๋ฆ„๊ณผ ์ง์—…

    โ‘ข

    SELECT DNAME,LOC FROM DEPT -- 3์ธ ์ด์ƒ ๊ทผ๋ฌด ๋ถ€์„œ ์ •๋ณด์กฐํšŒ ??
    WHERE DEPTNO = (SELECT DEPTNO FROM EMP GROUP BY DEPTNO HAVING COUNT(*) > 3 );
    • (SELECT DEPTNO FROM EMP GROUP BY DEPTNO HAVING COUNT(*) > 3 )

      โ†’ ์„œ๋ธŒ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๋ณต์ˆ˜ ๊ฐœ์˜ ํ–‰์ด ์ถœ๋ ฅ ๋˜์—ˆ๋‹ค.

    • WHERE ์ ˆ ๋’ค = ๋น„๊ต ์—ฐ์‚ฐ์ž์— R-value์—๋Š” ๋‹จ์ผ ๊ฐ’๋งŒ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ List ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์—ฐ์‚ฐ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

    MULTIPLE COLUMN, MULTIPLE ROW RETURN โ‘ 

    SELECT DEPTNO,JOB,ENAME,SAL FROM EMP
    WHERE (DEPTNO,JOB) IN (SELECT DEPTNO,JOB FROM EMP
    											 GROUP BY DEPTNO,JOB HAVING AVG(SAL) > 2000);

    Scalar Subquery

    ๐Ÿ’ก
    [์žฅ์ ] ํŽธ๋ฆฌ์„ฑ [์งˆ๋ฌธ] ๋ฐ˜๋ณต๋˜๋Š” ์‹คํ–‰์„ ํ•˜๋Š”๊ฐ€? ์‹คํ–‰ํšŸ์ˆ˜ * ์ž…/์ถœ๋ ฅ๊ฐ’ , Query Execution Cache , hashing โ‘ 
    SELECT DEPTNO,ENAME,JOB,SAL,(
    			SELECT ROUND(AVG(SAL),0)
    			FROM EMP S WHERE S.JOB=M.JOB) AS JOB_AVG_SAL
    FROM EMP M
    ORDER BY JOB; -- ์‹คํ–‰๊ณ„ํš(?) outer-join โž” ๊ฒฐ๊ณผ๊ฐ€ ์—†์œผ๋ฉด NULL ๋ฆฌํ„ด
    • SELECT LIST ๋ถ€๋ถ„์— ์„œ๋ธŒ ์ฟผ๋ฆฌ ์กด์žฌ : Scalar Subquery

    • ์„œ๋ธŒ ์ฟผ๋ฆฌ ๋‚ด๋ถ€์—, ๋ฉ”์ธ ์ฟผ๋ฆฌ์˜ JOB ์˜ ์ปฌ๋Ÿผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค.
    • ๋”ฐ๋ผ์„œ, ๋ฉ”์ธ ์ฟผ๋ฆฌ๊ฐ€ ๋จผ์ € ์‹คํ–‰๋˜๊ณ  ์„œ๋ธŒ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋œ๋‹ค โ†’ Correlated Subquey
    • ๋ฉ”์ธ ์ฟผ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•ด์•ผ ๋˜๋ฏ€๋กœ, ๋งค๋ฒˆ ํ•œ ํ–‰์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ์„œ๋ธŒ ์ฟผ๋ฆฌ๊ฐ€ ๊ณ„์†์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค. ์ด๋Š” ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค.

    CORRELATED SUBQUERY (์ƒ๊ด€์„œ๋ธŒ์ฟผ๋ฆฌ) - ๋งค์šฐ ๋น„ํšจ์œจ์ 

    ๐Ÿ’ก
    [์ฃผ์˜]
    • Subquery๋Š” Mainquery์˜ ์ปฌ๋Ÿผ์„ ์ฐธ์กฐํ• ์ˆ˜ ์žˆ์ง€๋งŒ Mainquery๋Š” Subquery์˜ ์ปฌ๋Ÿผ์„ ์ฐธ์กฐํ• ์ˆ˜ ์—†๋‹ค.

    [์งˆ๋ฌธ]

    • Mainquery์—์„œ Subquery์˜ ์ปฌ๋Ÿผ์„ ์ฐธ์กฐ ํ•˜๋ ค๋ฉด โ†’ โ‘  Join ์œผ๋กœ ๋ณ€ํ™˜ โ‘ก Scalar Subquery

    โ‘ 

    SELECT DEPTNO,ENAME,JOB,SAL FROM EMP M
    WHERE SAL > ( SELECT AVG(SAL) AS AVG_SAL FROM EMP WHERE JOB = M.JOB );
    • ์„œ๋ธŒ ์ฟผ๋ฆฌ์—์„œ, ๋ฉ”์ธ ์ฟผ๋ฆฌ ๋ฌธ์˜ M.JOB์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค.

      ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ๋งค ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ๋งค๋ฒˆ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ๋น„ํšจ์œจ์ ์ด๋‹ค.

    In-Line View (FROM ์ ˆ์— ์‚ฌ์šฉ๋œ SUBQUERY)

    ๐Ÿ’ก
    [์„ค๋ช…]

    SQL์ด ์‹คํ–‰๋˜๋Š” ์‹œ์ ์— ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” View์˜ ์—ญํ• ์„ ํ•œ๋‹ค๊ณ  ํ•ด์„œ Dynamic View ๋ผ๊ณ ๋„ ํ•œ๋‹ค.

    ์ผ๋ฐ˜์ ์œผ๋กœ Subquery์˜ ์ปฌ๋Ÿผ์„ Mainquery์—์„œ ์‚ฌ์šฉํ• ์ˆ˜ ์—†์ง€๋งŒ Inline View์—์„œ Subquery์˜ ์ปฌ๋Ÿผ์„ Mainquery ์—์„œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

    โ‘ 

    SELECT DEPTNO, ENAME,EMP.JOB,SAL,IV.AVG_SAL
    FROM EMP, (SELECT JOB,ROUND(AVG(SAL)) AS AVG_SAL FROM EMP GROUP BY JOB) IV
    WHERE EMP.JOB = IV.JOB AND SAL > IV.AVG_SAL
    ORDER BY DEPTNO ,SAL DESC;
    • FROM ์ ˆ์— ์‚ฌ์šฉ๋œ ์„œ๋ธŒ ์ฟผ๋ฆฌ ํ™•์ธ

    TOP-N, BOTTOM-M (์„œ๋ธŒ์ฟผ๋ฆฌ, ROWNUM์„ ํ™œ์šฉ)

    ๐Ÿ’ก
    โ‘ 
    SELECT *
    FROM (SELECT EMPNO,ENAME,SAL FROM EMP ORDER BY SAL ASC) BM
    WHERE ROWNUM <= 5;
    • In-Line View ์„œ๋ธŒ ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋™์ ์œผ๋กœ ์›ํ•˜๋Š” ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
    • ์„œ๋ธŒ ์ฟผ๋ฆฌ ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ ์ •๋ ฌ ํ›„ ROWNUM์„ ํ†ตํ•ด ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค!

    โ†’ SAL ๊ธฐ์ค€ ํ•˜์œ„ 5๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ ์ถœ๋ ฅ

    โ‘ก

    SELECT TN.EMPNO,TN.ENAME,TN.SAL
    FROM (SELECT EMPNO,ENAME,SAL FROM EMP ORDER BY SAL DESC) TN
    WHERE ROWNUM < 5;

    โ†’ SAL ๊ธฐ์ค€ ์ƒ์œ„ 5๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ ์ถœ๋ ฅ

    ๐Ÿ“˜ DML ์—ฐ์‚ฐ๊ณผ Subquery

    ๐Ÿ’ก
    โ‘  // SUBQUERY๋กœ ํ•œ๋ฒˆ์— N๊ฐœ Rows INSERT
    INSERT INTO BONUS(ENAME,JOB,SAL,COMM) SELECT ENAME,JOB,SAL,COMM FROM EMP;
    SELECT * FROM BONUS; // ๊ฒฐ๊ณผ ํ™•์ธ
    ROLLBACK; // ๋‹ค์Œ๋ฒˆ ์‹ค์Šต์„ ์œ„ํ•ด์„œ
    SELECT * FROM BONUS; // ๊ฒฐ๊ณผ ํ™•์ธ

    โ‘ก // ๋ถ€์„œ๋ณ„ ์„ฑ๊ณผ๋ณ„ ๋ณด๋„ˆ์Šค ๊ณ„์‚ฐํ›„(๋ฐ์ดํ„ฐ ์—ฐ์‚ฐ) N๊ฐœ Rows INSERT + ๋ฐ์ดํ„ฐ ์—ฐ์‚ฐ(๊ฐ€๊ณต)

    INSERT INTO BONUS(ENAME,JOB,SAL,COMM)
    SELECT ENAME,JOB,SAL,DECODE(DEPTNO,10,SAL*0.3,20,SAL*0.2)+NVL(COMM,0)
    FROM EMP WHERE DEPTNO IN (10,20);
    SELECT * FROM BONUS;
    COMMIT;

    โ†’ ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต(๋ณด๋„ˆ์Šค ๊ณ„์‚ฐ), ๊ณ„์‚ฐ Insert๊นŒ์ง€ ํ•œ๋ฒˆ์— ๊ฐ€๋Šฅ โ†’ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋กœ์ง ๊ฐœ๋ฐœ ์ฒ˜๋ฆฌ๋ฅผ ์ฟผ๋ฆฌ๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•˜๋‹ค.

    โ‘ข // ํ‰์ƒ์‹œ COMM์„ ๋ฐ›์ง€ ๋ชปํ•˜๋Š” ์‚ฌ์›๋“ค์—๊ฒŒ ํ‰๊ท  COMM ๊ธˆ์•ก์˜ 50%๋ฅผ ๋ณด๋„ˆ์Šค๋กœ ์ง€๊ธ‰

    UPDATE EMP SET COMM = (SELECT AVG(COMM)/2 FROM EMP) -- ์ „์ฒด ์ง์› ์ปค๋ฏธ์…˜์˜ 50%
    WHERE COMM IS NULL OR COMM = 0;
    COMMIT;

    โ‘ฃ // ํ‰๊ท  ์ด์ƒ์˜ ๊ธ‰์—ฌ๋ฅผ ๋ฐ›๋Š” ์‚ฌ์›๋“ค์€ ๋ณด๋„ˆ์Šค ์ง€๊ธ‰ ๋Œ€์ƒ์ž์—์„œ ์ œ์™ธ

    DELETE FROM BONUS WHERE SAL > (SELECT AVG(SAL) FROM EMP) ;
    COMMIT;



    Uploaded by N2T

    728x90
    ๋ฐ˜์‘ํ˜•

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

    [SQL] Constraint(์„ ์–ธ์  ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ ์‚ฌํ•ญ)  (0) 2023.04.20
    [SQL] JOIN  (0) 2023.04.20
    [SQL] DML - TRANSACTION  (0) 2023.04.20
    [SQL] DML-INSERT, UPDATE, DELETE  (0) 2023.04.20
    [SQL] DBMS ์•„ํ‚คํ…์ฒ˜ - Server Process  (0) 2023.04.05

    ๋Œ“๊ธ€

Keydi's Tistory