ABOUT ME

-

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

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

    ๐Ÿ’ก
    ๋ถˆํ•„์š”ํ•œ Outer Join์„ ํ•˜์ง€ ๋ง์ž. Join์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‚ด๋ถ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ขŒ์ธก Outer Join๊ณผ Equi ์กฐ์ธ์ด ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ ฌ๋œ ์ˆœ์„œ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋‚˜ํƒ€๋‚ฌ๋‹ค. ์‹คํ–‰ ๊ณ„ํš ์กฐํšŒ๋ฅผ ํ†ตํ•ด ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ ์šฉ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
    ๐Ÿ’ก
    ์ถ”ํ›„ ํ”„๋กœ์ ํŠธ์—์„œ ์ฟผ๋ฆฌ ํŠœ๋‹์„ ์‹œ๋„ํ•˜๊ณ  ๊ทธ ํŠœ๋‹ ์ดํ›„ ์‹คํ–‰ ๊ณ„ํš์—์„œ ์–ด๋– ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ฐ”๋€Œ์–ด ์ ์šฉ๋˜์—ˆ๋Š”์ง€ ๋“ฑ์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

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

    SDLC (Software Development Life Cycle) - ์†Œํ”„ํŠธ์›จ์–ด๊ฐœ๋ฐœ์ƒ๋ช…์ฃผ๊ธฐ

    [๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธก๋ฉด์—์„œ์˜ SDLC]

    0. ํƒ€๋‹น์„ฑ ๊ฒ€ํ† 

    1. ๊ธฐํš, ๊ณ„ํš
    1. (์‚ฌ์šฉ์ž ์š”๊ตฌ ์‚ฌํ•ญ) ๋ถ„์„ (What) โ†’ ERD ๋„์ถœ
    1. ์„ค๊ณ„ (How) [40%]
    1. ๊ฐœ๋ฐœ [20%]
    1. ํ…Œ์ŠคํŠธ [40%]
    1. ์ดํ–‰ (Realease, Deploy)
    1. ์šด์˜ ๋ฐ ์œ ์ง€๋ณด์ˆ˜

    โ†’ ์ถ”ํ›„ ๋ชจ๋ธ๋ง ํ•œ ERD๋ฅผ A3์šฉ์ง€์— ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์ด ์‹œํ—˜


    ๐Ÿ“˜ Join

    ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์— ํฉ์–ด์ ธ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ™์—ฌ์„œ(Join ํ•ด์„œ) ๋ณด๋Š” ๊ฒƒ

    ๐Ÿ’ก
    Display data from multiple tables (ํ•œ ๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”๋กœ ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์•ผ ํ• ๋•Œ โž” ์ˆ˜ํ‰์  ๊ฒฐํ•ฉ)
    • ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ฐ์ดํ„ฐ ๊ฐ„ ๋ฌผ๋ฆฌ์  ์—ฐ๊ฒฐ ์—†์ด ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌ ํ•˜๋‹ค๊ฐ€ ๋ฐ์ดํ„ฐ ๊ฐ„ ์—ฐ๊ฒฐ์ด ํ•„์š”ํ•  ๋•Œ ๋‚ด์šฉ์— ์˜ํ•œ ์ฐธ์กฐ(Content Reference)๋ฅผ ํ•œ๋‹ค. ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ…Œ์ด๋ธ” ๊ฐ„ ๊ด€๊ณ„ ํ†ตํ•ด ์ˆ˜ํ‰์  ๊ฒฐํ•ฉ ๊ฒƒ์ด JOIN.
    • JOIN์€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ•„์ˆ˜์ ์œผ๋กœ ํ•„์š”ํ•œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์—ฐ์‚ฐ ์ค‘ ํ•˜๋‚˜.

    ํ•„์š”์„ฑ

    • ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ํ…Œ์ด๋ธ” ๋…๋ฆฝ์„ฑ, ๋ฐ์ดํ„ฐ์˜ ์ตœ์†Œ ์ค‘๋ณต์„ฑ, ๋ฐ์ดํ„ฐ๊ฐ„์˜ ํ•จ์ˆ˜์  ์ข…์†์„ฑ์„ ํ†ตํ•ด ๊ฐ๊ฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ๊ฐ์˜ ํ…Œ์ด๋ธ”๋กœ ๋‚˜๋ˆ„์–ด(๋ถ„ํ• ) ์ €์žฅํ•˜๋„๋ก ์„ค๊ณ„.
      • * ์ตœ์†Œ ์ค‘๋ณต์„ฑ : ๋ชจ๋ธ๋ง์— ์ค‘์š”!
    • ์กฐํšŒ๋ฅผ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ SELECT๋ฅผ ํ†ตํ•ด ์กฐํšŒ ํ•˜์ง€๋งŒ, ์กฐํšŒ๋ฅผ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์— ๋‚˜๋ˆ„์–ด ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” JOIN ์—ฐ์‚ฐ์œผ๋กœ ๋ฐ์ดํ„ฐ ์กฐํšŒ ํ•œ๋‹ค.
    • ์‚ฌ๋ฒˆ,์ด๋ฆ„,๊ธ‰์—ฌ,๋ถ€์„œ๋ฒˆํ˜ธ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ โž” SELECT EMPNO,ENAME,SAL,DEPTNO FROM EMP;
    • ๋ถ€์„œ๋ฒˆํ˜ธ,๋ถ€์„œ๋ช…,๋ถ€์„œ์œ„์น˜๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ โž” SELECT DEPTNO,DNAME,LOC FROM DEPT;
    • ๋ถ€์„œ๋ช…,์ด๋ฆ„,๊ธ‰์—ฌ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ โž” SELECT DNAME, ENAME, SAL FROM DEPT , EMP WHERE DEPT.DEPTNO = EMP.DEPTNO ;

    Join ์ข…๋ฅ˜

    Equi-join

    ๐Ÿ’ก
    Equi-Join (= INNER JOIN)
    • JOIN์— ์‚ฌ์šฉ๋˜๋Š” ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ๊ฐ„์— ์ •ํ™•์ด ์ผ์น˜(EQUAL)ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ RETURN
    • EQUAL( = ) ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ JOIN
    • 1~4 Oracle Join ๊ตฌ๋ฌธ, 5~6 ANSI/ISO-SQL

    โ‘ 

    SELECT DNAME,ENAME,JOB,SAL FROM EMP, DEPT WHERE DEPTNO = DEPTNO;

    โž” ORA-00918: ์—ด์˜ ์ •์˜๊ฐ€ ์• ๋งคํ•ฉ๋‹ˆ๋‹ค.. ์ด์œ ๋Š” ?

    โ‘ก

    SELECT DNAME,ENAME,JOB,SAL FROM SCOTT.EMP, SCOTT.DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO;
    • OBJECT Full name ํ‘œ๊ธฐ๋ฒ• : [SCHEMA.]OBJECT_NAME EX) EMP โž” SCOTT.EMP
    • COLUMN Full name ํ‘œ๊ธฐ๋ฒ• : [TABLE_NAME.]COLUMN_NAME EX) EMPNO โž” EMP.EMPNO

    โ‘ข

    SELECT DNAME,ENAME,JOB,SAL FROM EMP, DEPT
    WHERE EMP.DEPTNO = DEPT.DEPTNO AND EMP.JOB IN ('MANAGER','CLERK')
    ORDER BY DNAME;
    • ์กฐ๊ฑด์ ˆ ์ฒ˜๋ฆฌ ์ˆœ์„œ??
      • (a) JOIN ์ฒ˜๋ฆฌ (EMP.DEPTNO = DEPT.DEPTNO)
        • โ†’ ํ•„ํ„ฐ๋ง (EMP.JOB IN ('MANAGER','CLERK'))
      • (b) ํ•„ํ„ฐ๋ง โ†’ JOIN ์ฒ˜๋ฆฌ
    ๐Ÿ’ก
    ํ•„ํ„ฐ๋ง ์ดํ›„ Join ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค. โ†’ ์ „์ฒด ์ผ๋Ÿ‰์ด ์ค„์–ด๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ํ•„ํ„ฐ๋ง์„ ๋จผ์ € ์ฒ˜๋ฆฌํ•˜๊ณ  Join์„ ๊ฐ€์žฅ ํ›„ ์ˆœ์œ„๋กœ ์ฒ˜๋ฆฌ ํ•œ๋‹ค.

    โ‘ฃ

    SELECT D.DNAME,E.ENAME,E.JOB,E.SAL FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO;
    • TABLE ALIAS์˜ ์‚ฌ์šฉ
      • (a) ํŽธ์˜์„ฑ
      • (b) ๊ฐ€๋…์„ฑ(์˜๋ฏธ์žˆ๋Š” ์ด๋ฆ„์‚ฌ์šฉ)
        • EX) EMP E , EMP A
      • (c) Self Join์‹œ ํ•„์ˆ˜ ์‚ฌ์šฉ
      • (d) ๋™์ผ ์ปฌ๋Ÿผ ๋ช…์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ

    โ‘ค // ANSI-SQL , ON ์กฐ์ธ์กฐ๊ฑด

    SELECT D.DNAME,E.ENAME,E.JOB,E.SAL FROM EMP E INNER JOIN DEPT D
    ON E.DEPTNO = D.DEPTNO;

    โ‘ฅ

    SELECT D.DNAME,E.ENAME,E.JOB,E.SAL FROM EMP E INNER JOIN DEPT D
    ON E.DEPTNO = D.DEPTNO -- ์กฐ์ธ ์กฐ๊ฑด
    WHERE E.DEPTNO IN (10,20) AND D.DNAME = 'RESEARCH' -- ํ•„ํ„ฐ๋ง ์กฐ๊ฑด

    Non Equi-Join (EQUAL = ์ด์™ธ์˜ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ JOIN)

    ๐Ÿ’ก
    Non Equi-Join
    • EQUAL( = ) ์ด์™ธ์˜ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ JOIN

    โ‘ 

    SELECT E.ENAME, E.JOB,E.SAL,S.GRADE FROM EMP E, SALGRADE S
    WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL; -- ๋ฒ”์œ„ ์—ฐ์‚ฐ์ž

    โ‘ก

    SELECT DNAME,ENAME,JOB,SAL,GRADE
    FROM EMP E, DEPT D, SALGRADE S // Join ์ˆœ์„œ๋Š” ๋ˆ„๊ฐ€ ๊ฒฐ์ •? , ๊ธฐ์ˆ  ์ˆœ์„œ? KMA
    WHERE E.DEPTNO = D.DEPTNO AND E.SAL BETWEEN S.LOSAL AND S.HISAL;
    • 3๊ฐœ ํ…Œ์ด๋ธ” JOIN , ์ตœ์†Œ JOIN์กฐ๊ฑด: N(ํ…Œ์ด๋ธ”๊ฐœ์ˆ˜) โ€“ 1

    โ‘ข

    SELECT E.ENAME, E.JOB,E.SAL,E.GRADE FROM EMP E, SALGRADE S
    WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL AND E.DEPTNO IN (10,30);
    ORDER BY E.ENAME;
    • ์กฐ๊ฑด์ ˆ ์ฒ˜๋ฆฌ ์ˆœ์„œ???
      • (b) ํ•„ํ„ฐ ์กฐ๊ฑด โ†’ JOIN ์กฐ๊ฑด

    โ‘ฃ

    SELECT E.ENAME, E.JOB,E.SAL,S.GRADE FROM EMP E, SALGRADE S
    WHERE E.SAL < S.LOSAL AND E.DEPTNO IN (10,30)
    ORDER BY E.ENAME;
    • ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹Œ ๋ฌด์˜๋ฏธ(๋ถˆํ•„์š”)ํ•œ ๋‹ค๋Ÿ‰์˜ ๊ณฑ์ง‘ํ•ฉ(Cartesian product) ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ ์ด์œ ๋Š”?

      โ†’ ์ž˜๋ชป๋œ Join ์กฐ๊ฑด์„ ์‚ฌ์šฉ

      • ๋ฆฌํ„ด๋œ ๊ฐ’์„ ๋ดค์„ ๋•Œ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์ด Cartesian Product์˜ ํ˜•ํƒœ๋กœ ๋‚˜์™”์„ ๋•Œ ์กฐ์ธ ์กฐ๊ฑด์„ ๋‹ค์‹œํ•œ๋ฒˆ ํ™•์ธํ•ด๋ณด๊ธฐ!

    Outer-Join

    ๐Ÿ’ก
    Outer-Join
    • JOIN ์กฐ๊ฑด์— ์ง์ ‘ ๋งŒ์กฑ๋˜์ง€ ์•Š๋Š” ์ •๋ณด๋„ ์กฐํšŒ ( != Inner Join )

    โ‘ 

    SELECT D.DNAME,E.ENAME,E.JOB,E.SAL
    FROM EMP E,DEPT D
    WHERE E.DEPTNO = D.DEPTNO
    ORDER BY D.DNAME;
    • 40๋ฒˆ ๋ถ€์„œ(OPERATIONS)์— ๊ทผ๋ฌดํ•˜๋Š” ์ง์›์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— Equi Join์—์„œ๋Š” 40๋ฒˆ ๋ถ€์„œ๊ด€๋ จ ์ •๋ณด ์กฐํšŒ๊ฐ€ ์•ˆ๋œ๋‹ค. 14๊ฑด

    โ‘ก

    SELECT D.DNAME,E.ENAME,E.JOB,E.SAL 
    FROM EMP E,DEPT D
    WHERE E.DEPTNO(+) = D.DEPTNO
    ORDER BY D.DNAME;
    • ๊ธฐ์ค€์ด๋˜๋Š” ํ…Œ์ด๋ธ”(DEPT)๊ณผ ์กฐ์ธ๋˜๋Š” ๋Œ€์ƒ ํ…Œ์ด๋ธ”(EMP)์˜ ์กฐ์ธ ์กฐ๊ฑด์— (+) ํ‘œ์‹œ ,์ง์ ‘ ๋งคํ•‘๋˜์ง€ ์•Š๋Š” ์ปฌ๋Ÿผ์—๋Š” NULL , 15๊ฑด (OPERATIONS ?)

    โ‘ข

    SELECT D.DNAME,E.ENAME,E.JOB,E.SAL
    FROM EMP E,DEPT D
    WHERE E.DEPTNO = D.DEPTNO(+)
    ORDER BY D.DNAME;
    • Equi-Join๊ณผ ๋™์ผํ•œ ๊ฒฐ๊ณผ ์ถœ๋ ฅ, ๋ถˆํ•„์š”ํ•œ ์•„์›ƒํ„ฐ ์กฐ์ธ์€ ๋น„ํšจ์œจ์ ์ธ ์ž์› ์‚ฌ์šฉ ์œ ๋ฐœ ๊ฐ€๋Šฅ

    โ‘ฃ

    SELECT D.DNAME, NVL(E.ENAME,'๋น„์ƒ๊ทผ ๋ถ€์„œ'), E.JOB, E.SAL
    FROM EMP E,DEPT D
    WHERE E.DEPTNO(+) = D.DEPTNO
    ORDER BY D.DNAME;
    • ์ง์ ‘ ๋งคํ•‘๋˜์ง€ ์•Š๋Š” ์ปฌ๋Ÿผ์—๋Š” NULL

    โ‘ค

    SELECT D.DNAME,E.ENAME,E.JOB,E.SAL
    FROM EMP E,DEPT D
    WHERE E.DEPTNO(+) = D.DEPTNO(+)
    ORDER BY D.DNAME;
    • ORACLE SQL์€ ์–‘๋ฐฉํ–ฅ OUTER JOIN์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ANSI-SQL 1999 ์—์„œ๋Š” ์–‘๋ฐฉํ–ฅ OUTER JOIN์„ ํ—ˆ์šฉ

    Ansi Outer-Join

    ๐Ÿ’ก
    Ansi Outer-Join โ‘  LEFT OUTER JOIN : ์ขŒ์ธก ํ…Œ์ด๋ธ” ๊ธฐ์ค€
    SELECT E.DEPTNO,D.DNAME,E.ENAME FROM EMP E LEFT OUTER JOIN DEPT D
    ON E.DEPTNO = D.DEPTNO
    ORDER BY E.DEPTNO;

    โ‘ก RIGHT OUTER JOIN : ์šฐ์ธก ํ…Œ์ด๋ธ” ๊ธฐ์ค€

    SELECT D.DNAME,E.ENAME FROM EMP E RIGHT OUTER JOIN DEPT D
    ON E.DEPTNO = D.DEPTNO
    ORDER BY E.DEPTNO;
    • DEPT์„ ๊ธฐ์ค€ ํ…Œ์ด๋ธ”(Driving Table)ํ•˜์—ฌ Join ์—ฐ์‚ฐ ์ˆ˜ํ–‰ , 40๋ฒˆ ๋ถ€์„œ์˜ ์ •๋ณด ํ‘œ๊ธฐ !!!!

    โ‘ข FULL OUTER JOIN

    SELECT D.DNAME,E.ENAME FROM EMP E FULL OUTER JOIN DEPT D
    ON E.DEPTNO = D.DEPTNO
    ORDER BY E.DEPTNO;
    • ์–‘๋ฐฉํ–ฅ ์•„์›ƒํ„ฐ ์กฐ์ธ(Full Outer Join) ์‹คํ–‰

    [์‹ค์Šต ์ดํ•ด] - SELECT LIST ๋ฅผ *๋กœ ๋†“๊ณ  ๋น„๊ตํ•ด๋ณด๊ธฐ.

    Self-Join

    ๐Ÿ’ก
    Self-Join (์ˆœํ™˜ ์ฐธ์กฐ ๊ด€๊ณ„ : Recursive Relationship ) โ‘ 
    SELECT E.ENAME||' ''S MANAGER IS '||M.ENAME
    FROM EMP E, EMP M
    WHERE E.MGR = M.EMPNO
    ORDER BY M.ENAME;
    • ๊ฐ™์€ ํ…Œ์ด๋ธ” ๋ผ๋ฆฌ ์กฐ์ธ
    • ํ…Œ์ด๋ธ” ๊ฐœ์ฒด๋‚ด ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ ๊ด€๊ณ„์‹œ ex) empno vs mgr
    • ํ…Œ์ด๋ธ” Alias ํ•„์ˆ˜ ์‚ฌ์šฉ

    ==============================================

    1. ์œ„์˜ โ‘  SQL์—์„œ๋Š” ํšŒ์‚ฌ ๋Œ€ํ‘œ( job=โ€˜PRESIDENT') ์ •๋ณด๊ฐ€ ๋ˆ„๋ฝ ๋˜์—ˆ๋‹ค.

      โ†’ ๋Œ€ํ‘œ๋Š” manager๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ.

    • SQL์„ ์ˆ˜์ •ํ•˜์—ฌ ๋ˆ„๋ฝ๋œ ์ •๋ณด๊ฐ€ ์กฐํšŒ ๋˜๋„๋ก ์ž‘์„ฑ : OUTER JOIN ์‚ฌ์šฉ!
    • ๋งค๋‹ˆ์ €๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋งค๋‹ˆ์ €์˜ ์ด๋ฆ„์€ NOBODY๋กœ ํ‘œ๊ธฐ
    SELECT E.ENAME||' ''S MANAGER IS '||NVL(M.ENAME, 'NOBODY')
    FROM EMP E LEFT OUTER JOIN EMP M
    ON E.MGR = M.EMPNO
    ORDER BY M.ENAME;
    • ๊ธฐ์กด KING๊ณผ OCPOK์€ ์•„๋ž˜์™€ ๊ฐ™์ด MGR ๋ฒˆํ˜ธ๊ฐ€ null์ด๋‹ค

    ๋”ฐ๋ผ์„œ, Self-join์„ Equi Joinํ–ˆ์„ ๋•Œ์—๋Š” JOIN ์กฐ๊ฑด์— ์˜ํ•ด MGR์ด ์—†๋Š” KING๊ณผ OCPOK์€ ๋ˆ„๋ฝ๋˜์—ˆ์—ˆ๋‹ค.

    ์ด๋ฅผ Employ ๊ด€์ ์—์„œ์˜ ํ…Œ์ด๋ธ”์„ LEFT JOIN ํ•จ์œผ๋กœ์จ ๋ˆ„๋ฝ๋์—ˆ๋˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ํฌํ•จ์‹œ์ผœ JOIN ํ–ˆ๊ณ , NVL()ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด null ์ฒ˜๋ฆฌ๋ฅผ ํ–ˆ๋‹ค.

    ์นดํ…Œ์‹œ์•ˆ ๊ณฑ (Cartesian Product)

    Join์˜ ๋‚ด๋ถ€ ์ฃผ์š” ์ฒ˜๋ฆฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

    • Nested Loop
    • Sort-Merge
    • Hash
    ๐Ÿ’ก
    ์นดํ‹ฐ์…˜๊ณฑ (CARTESIAN PRODUCT)
    • Join์‹œ ๋‘ ํ…Œ์ด๋ธ”(์ง‘ํ•ฉ)๊ฐ„์— ๊ณฑ์ง‘ํ•ฉ ์—ฐ์‚ฐ์œผ๋กœ ์œ ์šฉํ•˜์ง€ ์•Š์€ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ˜„์ƒ
      • ๋ฐ์นด๋ฅดํŠธ์˜ ๊ณฑ์ง‘ํ•ฉ
      • ๋ฐœ์ƒ์›์ธ (a) Join ์กฐ๊ฑด ์ƒ๋žต์‹œ (b) ์ž˜๋ชป๋œ JOIN ์กฐ๊ฑด
      • ์šฉ๋„ (a) ํ…Œ์ŠคํŠธ์šฉ ์ƒ˜ํ”Œ๋ฐ์ดํƒ€ ์ƒ์„ฑ (b) ๊ณฑ์ง‘ํ•ฉ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•œ ๋น ๋ฅธ ์—ฐ์‚ฐ ์‘์šฉ

    โ‘  CROSS JOIN (ANSI/ISO-SQL)

    SELECT ENAME,JOB,DNAME FROM EMP, DEPT;
    SELECT ENAME,JOB,DNAME FROM EMP CROSS JOIN DEPT; -- Ansi-SQL
    • Join ์กฐ๊ฑด ์ƒ๋žต์‹œ ๋ฐœ์ƒ , ๋ฐ์ดํ„ฐ ๊ฑด์ˆ˜ ์ฒดํฌ

    โ†’ Cartesian Product ๋ฐœ์ƒ!

    โ‘ก Join ์กฐ๊ฑด ์—†์ด Join

    SELECT ENAME,JOB,DNAME FROM EMP, DEPT
    WHERE EMP.SAL > 2000 and DEPT.DEPTNO IN (10,20);
    • ํ•„ํ„ฐ๋ง ์กฐ๊ฑด(O) , Join ์กฐ๊ฑด(X) , and ์™€ ๋ฐ์ดํ„ฐ ๊ฑด์ˆ˜ ์ฒดํฌ

    โ‘ข Join ์กฐ๊ฑด ์—†์ด Join

    SELECT ENAME,JOB,DNAME FROM EMP , DEPT
    WHERE EMP.SAL > 2000 or DEPT.DEPTNO IN (10,20);
    • ํ•„ํ„ฐ๋ง ์กฐ๊ฑด(O) , Join ์กฐ๊ฑด(X) , or ์™€ ๋ฐ์ดํ„ฐ ๊ฑด์ˆ˜ ์ฒดํฌ

    โ‘ฃ

    SELECT E.ENAME, E.JOB,E.SAL,S.GRADE FROM EMP E, SALGRADE S
    WHERE E.SAL < S.LOSAL AND E.DEPTNO IN (10,30)
    ORDER BY E.ENAME;
    • ์ž˜๋ชป๋œ Join ์กฐ๊ฑด


    ๐Ÿ“๊ณผ์ œ

    1. ์œ„์˜ โ‘  SQL์—์„œ๋Š” ํšŒ์‚ฌ ๋Œ€ํ‘œ( job=โ€˜PRESIDENT') ์ •๋ณด๊ฐ€ ๋ˆ„๋ฝ ๋˜์—ˆ๋‹ค.

      โ†’ ๋Œ€ํ‘œ๋Š” manager๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ.

    • SQL์„ ์ˆ˜์ •ํ•˜์—ฌ ๋ˆ„๋ฝ๋œ ์ •๋ณด๊ฐ€ ์กฐํšŒ ๋˜๋„๋ก ์ž‘์„ฑ : OUTER JOIN ์‚ฌ์šฉ!
    • ๋งค๋‹ˆ์ €๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋งค๋‹ˆ์ €์˜ ์ด๋ฆ„์€ NOBODY๋กœ ํ‘œ๊ธฐ
    SELECT E.ENAME||' ''S MANAGER IS '||NVL(M.ENAME, 'NOBODY')
    FROM EMP E LEFT OUTER JOIN EMP M
    ON E.MGR = M.EMPNO
    ORDER BY M.ENAME;
    • ๊ธฐ์กด KING๊ณผ OCPOK์€ ์•„๋ž˜์™€ ๊ฐ™์ด MGR ๋ฒˆํ˜ธ๊ฐ€ null์ด๋‹ค

    ๋”ฐ๋ผ์„œ, Self-join์„ Equi Joinํ–ˆ์„ ๋•Œ์—๋Š” JOIN ์กฐ๊ฑด์— ์˜ํ•ด MGR์ด ์—†๋Š” KING๊ณผ OCPOK์€ ๋ˆ„๋ฝ๋˜์—ˆ์—ˆ๋‹ค.

    ์ด๋ฅผ Employ ๊ด€์ ์—์„œ์˜ ํ…Œ์ด๋ธ”์„ LEFT JOIN ํ•จ์œผ๋กœ์จ ๋ˆ„๋ฝ๋์—ˆ๋˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ํฌํ•จ์‹œ์ผœ JOIN ํ–ˆ๊ณ , NVL()ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด null ์ฒ˜๋ฆฌ๋ฅผ ํ–ˆ๋‹ค.

    1. ์•„๋ž˜์˜ 3 SQL์„ ๊ฒฐ๊ณผ๋ฅผ ๋น„๊ตํ•œ ํ›„ ์„ค๋ช…ํ•˜์‹œ์˜ค

    SELECT D.DNAME,E.ENAME,E.JOB,E.SAL FROM EMP E,DEPT D
    WHERE E.DEPTNO(+) = D.DEPTNO ORDER BY D.DNAME;
    -- DEPT (์˜ค๋ฅธ์ชฝ)์„ ๊ธฐ์ค€์œผ๋กœ Outer ์กฐ์ธ
    
    
    SELECT D.DNAME,E.ENAME,E.JOB,E.SAL FROM EMP E, DEPT D
    WHERE E.DEPTNO(+) = D.DEPTNO AND E.SAL > 2000 ORDER BY D.DNAME; -- Outer Join ํ›„ ํ•„ํ„ฐ๋ง
    -- DEPT (์˜ค๋ฅธ์ชฝ)์„ ๊ธฐ์ค€์œผ๋กœ Oute ์กฐ์ธ ์ดํ›„, SAL์ด 2000์ด ๋„˜๋Š” ๊ฒƒ์„ ํ•„ํ„ฐ๋ง
    
    
    SELECT D.DNAME,E.ENAME,E.JOB,E.SAL FROM EMP E,DEPT D
    WHERE E.DEPTNO(+) = D.DEPTNO AND E.SAL(+) > 2000 ORDER BY D.DNAME; -- Outer Join
    -- Outer Join์€ ๊ธฐ์ค€์ด ๋˜๋Š” ํ…Œ์ด๋ธ”์—๋Š” Join์กฐ๊ฑด์ด ๋งค์นญ๋˜์ง€ ์•Š๋”๋ผ๋„ null์„ ํฌํ•จํ•ด ์กฐ์ธํ•œ๋‹ค.
    -- E.SAL(+)์—๋„ Outer Join์ด ์ ์šฉ๋ผ์„œ, DEPT๋ฅผ ๊ธฐ์ค€์œผ๋กœ SAL ๊ฐ’์ด 2000์ด ๋˜์ง€ ์•Š๋”๋ผ๋„ ํฌํ•จ๋˜์—ˆ๋‹ค.

    2. ์•„๋ž˜ SQL์˜ ์‹คํ–‰๊ฒฐ๊ณผ ์กฐํšŒ๋˜๋Š” Row ๊ฐœ์ˆ˜๋ฅผ ์„ค๋ช…

    -- 2-1
    SELECT E.ENAME||' ''S MANAGER IS '||M.ENAME FROM EMP E, EMP M
    WHERE E.MGR(+) = M.EMPNO
    ORDER BY M.ENAME;
    
    
    -- 2-2
    SELECT E.ENAME||' ''S MANAGER IS '||M.ENAME FROM EMP E, EMP M
    WHERE E.MGR = M.EMPNO(+)
    ORDER BY M.ENAME;
    ๐Ÿ’ก
    2-1 : M.EMPNO๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋Š” right outer join์ด๋‹ค. 2-2 : E.MGR์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋Š” Left outer join์ด๋‹ค.

    3. JOIN์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€์„œ๋ณ„ ๊ธ‰์—ฌ ์ง€๊ธ‰ ์ˆœ์œ„ ๊ณ„์‚ฐ

    -- rank
    select E.deptno, e.ename, e.job, e.sal,
    
    (select count(*) + 1
    from emp e2
    where e2.deptno = e.deptno and e2.sal > e.sal) as ๊ธ‰์—ฌ์ˆœ์œ„
    
    from emp e
    order by E.deptno, e.sal desc;
    
    --------------------------------------------------------------------
    
    -- dense rank
    select E.deptno, e.ename, e.job, e.sal,
    
    (select count(distinct e2.sal) + 1
    from emp e2
    where e2.deptno = e.deptno and e2.sal > e.sal) as ๊ธ‰์—ฌ์ˆœ์œ„
    
    from emp e
    order by E.deptno, e.sal desc;

    3-2. RANK, DENSE_RANK ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 2)์™€ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” SQL ์ž‘์„ฑ

    • ๊ฐ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์„ค๋ช… ์ถ”๊ฐ€
    ๐Ÿ’ก
    [RANK]

    ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๋“ค ์ค‘์—์„œ ์ˆœ์œ„๋ฅผ ๊ณ„์‚ฐํ•˜๋˜, ์ค‘๊ฐ„์— ๋น ์ง„ ์ˆœ์œ„๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 1, 2, 2, 4, 5๊ฐ€ ์žˆ์„ ๋•Œ RANK ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜๋ฉด 1, 2, 2, 4, 5๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

    [DENSE_RANK]

    RANK ํ•จ์ˆ˜์™€ ๋น„์Šทํ•˜์ง€๋งŒ, ์ค‘๊ฐ„์— ๋น ์ง„ ์ˆœ์œ„๋ฅผ ์ฑ„์šฐ๊ณ  ๊ณ„์† ์ˆœ์ฐจ์ ์œผ๋กœ ์ˆœ์œ„๋ฅผ ๋งค๊น๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 1, 2, 2, 4, 5๊ฐ€ ์žˆ์„ ๋•Œ DENSE_RANK ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜๋ฉด 1, 2, 2, 3, 4๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

    SELECT DEPTNO, ENAME, JOB, SAL,
           RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL DESC) AS rank,
           DENSE_RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL DESC) AS dense_rank
    FROM EMP
    ORDER BY DEPTNO;

    4. MAKE_ENV.SQL์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์Šต ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•œ ํ›„ ์•„๋ž˜์˜ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” JOIN ๊ตฌ๋ฌธ ์ž‘์„ฑ

    SYSTESYSTEM_NAMEFTPTELNETEMAIL
    XXXํ˜œํ™”DB์‚ฌ์šฉ๋ฏธ์‚ฌ์šฉ๋ฏธ์‚ฌ์šฉ
    YYY๊ฐ•๋‚จDB์‚ฌ์šฉ์‚ฌ์šฉ์‚ฌ์šฉ
    ZZZ์˜๋“ฑํฌDB๋ฏธ์‚ฌ์šฉ๋ฏธ์‚ฌ์šฉ๋ฏธ์‚ฌ์šฉ

    sql ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ ๋ณ„๋„๋กœ ํ•ด๋‹น ํŒŒ์ผ์„ ์‹คํ–‰. ๊ณผ์ œ ํ’€๊ธฐ

    1) ํ„ฐ๋ฏธ๋„์—์„œ @ or start ๋ช…๋ น์–ด ์‚ฌ์šฉํ•ด์„œ sql script ํŒŒ์ผ ์‹คํ–‰

    2) sqldev์—์„œ sqlscript ํŒŒ์ผ ์‹คํ–‰ (๋ฉ”๋‰ด์—์„œ ์ฐพ์•„์„œ ์‹คํ–‰)

    Drop Table SYSTEM;

    Create Table SYSTEM()

    ์ด๋Ÿฐ์‹์œผ๋กœ ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ ์ „์— ๋ฏธ๋ฆฌ ์‚ญ์ œ๋ฅผ ํ•ด์„œ ์—ฌ๋Ÿฌ๋ฒˆ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์Šคํฌ๋ฆฝํŠธ ์ˆ˜์ •ํ•œ๋‹ค.

    SELECT S.SYSTEM_ID, S.SYSTEM_NAME,
           DECODE(SUM(DECODE(R.RESOURCE_NAME, 'FTP', 1, 0)), 1, '์‚ฌ์šฉ', '๋ฏธ์‚ฌ์šฉ') AS FTP,
           DECODE(SUM(DECODE(R.RESOURCE_NAME, 'TELNET', 1, 0)), 1, '์‚ฌ์šฉ', '๋ฏธ์‚ฌ์šฉ') AS TELNET,
           DECODE(SUM(DECODE(R.RESOURCE_NAME, 'EMAIL', 1, 0)), 1, '์‚ฌ์šฉ', '๋ฏธ์‚ฌ์šฉ') AS EMAIL
    FROM SYSTEM S LEFT OUTER JOIN RESOURCE_USAGE R
    ON S.SYSTEM_ID = R.SYSTEM_ID
    GROUP BY S.SYSTEM_ID, SYSTEM_NAME
    ORDER BY S.SYSTEM_ID;

    5. ๋ถ€์„œ๋ฒˆํ˜ธ, ์ด๋ฆ„, ๊ธ‰์—ฌ, ๊ธ‰์—ฌ๋น„์œจ(์†Œ์ˆ˜์ ์ดํ•˜ 2์ž๋ฆฌ) ์ถœ๋ ฅํ•˜๋Š” SQL์„ ์นดํ‹ฐ์…˜ ๊ณฑ์„ ์‘์šฉํ•˜์—ฌ ์ž‘์„ฑ

    SELECT DEPTNO, ENAME, SAL, ROUND((SAL/SUM_SAL)*100, 2) || '%'
    FROM EMP E1, (
    		SELECT SUM(SAL) AS SUM_SAL FROM EMP
    ) E2;

    6. ๋‹ค์Œ์˜ ์ง‘ํ•ฉ ์—ฐ์‚ฐ์ž๋ฅผ ์‹คํ–‰ํ•œ ํ›„ ์„ค๋ช…ํ•˜์‹œ์˜ค

    ๐Ÿ’ก
    โ‘  ํ•ฉ์ง‘ํ•ฉ
    select deptno from dept -- 10,20,30,40
    union all
    select deptno from emp;    -- 10,20,30
    
    select deptno from dept
    union
    select deptno from emp;                    -- ์ •๋ ฌ๋˜๋Š” ์ด์œ ? ์‹คํ–‰๊ณ„ํš SORT(UNIQUE)
    
    select ename,job,sal from emp where job = 'CLERKโ€™          -- ์ง๋ฌด๊ฐ€ CLERK์ธ ์ง‘ํ•ฉ
    union                                              -- ์ปฌ๋Ÿผ ๊ฐœ์ˆ˜ & ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ผ์น˜
    select ename,job,sal from emp where sal > 2000      -- 2000 ์ด์ƒ ๊ธ‰์—ฌ ๋Œ€์ƒ์ž ์ง‘ํ•ฉ
    order by job asc,sal desc;                       -- order by ๋Œ€์ƒ ์ง‘ํ•ฉ์€? ์œ„์น˜๋Š”?
    • ๋Œ€์ƒ ์ง‘ํ•ฉ์€ UNION ์™„๋ฃŒ ํ›„ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ.

    โ‘ก ๊ต์ง‘ํ•ฉ

    select deptno from dept
    intersect
    select deptno from emp; -- ์ •๋ ฌ๋˜๋Š” ์ด์œ ? ์‹คํ–‰๊ณ„ํš SORT(UNIQUE)

    โ‘ข ์ฐจ์ง‘ํ•ฉ

    select deptno from dept
    minus
    select deptno from emp; -- ์ •๋ ฌ๋˜๋Š” ์ด์œ ? ์‹คํ–‰๊ณ„ํš SORT(UNIQUE)
    • Union all์„ ์ œ์™ธํ•œ Union, intersect, minus๋Š” ์ •๋ ฌ์ด ๋˜์–ด ์ถœ๋ ฅ๋œ๋‹ค. ๊ทธ ์ด์œ  ํ™•์ธ
    • ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ตœ์ ์˜ ์ง‘ํ•ฉ ์—ฐ์‚ฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์ •๋ ฌ์„ ํ•œ๋‹ค. (SORT, UNIQUE)



    Uploaded by N2T

    728x90
    ๋ฐ˜์‘ํ˜•

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

    [SQL] Sequence  (0) 2023.04.20
    [SQL] Constraint(์„ ์–ธ์  ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ ์‚ฌํ•ญ)  (0) 2023.04.20
    [SQL] SubQuery  (0) 2023.04.20
    [SQL] DML - TRANSACTION  (0) 2023.04.20
    [SQL] DML-INSERT, UPDATE, DELETE  (0) 2023.04.20

    ๋Œ“๊ธ€

Keydi's Tistory