• Feed
  • Explore
  • Ranking
/
/
    ๐Ÿ’พ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

    ๐Ÿ“ŒSQL ๋ฌธ๋ฒ• - ์กฐ์ธ(JOIN)

    ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ํ…Œ์ด๋ธ”์„ ๋‚˜๋ˆ  ์„ค๊ณ„ํ•˜๊ณ ,ํ•„์š”ํ•  ๋•Œ ์กฐ์ธ(JOIN) ์œผ๋กœ ์—ฐ๊ฒฐํ•ด ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ!์ด๋ฒˆ ๊ธ€์—์„œ๋Š” INNER JOIN, OUTER JOIN, NATURAL JOIN ๋“ฑ์˜ ๊ฐœ๋…์„ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
    ์ก
    ์ก
    2025.04.07
    ยท
    9 min read

    4667

    ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ํ…Œ์ด๋ธ”์„ ๋‚˜๋ˆ  ์„ค๊ณ„ํ•˜๊ณ ,
    ํ•„์š”ํ•  ๋•Œ ์กฐ์ธ(JOIN) ์œผ๋กœ ์—ฐ๊ฒฐํ•ด ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ!

    ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” INNER JOIN, OUTER JOIN, NATURAL JOIN ๋“ฑ์˜ ๊ฐœ๋…์„ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


    โœ… JOIN์ด๋ž€?

    JOIN์€ ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์„ ๊ณตํ†ต๋œ ์ปฌ๋Ÿผ(ํ‚ค) ์„ ๊ธฐ์ค€์œผ๋กœ ์—ฐ๊ฒฐํ•ด
    ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ ํ…Œ์ด๋ธ”๋กœ ๋งŒ๋“œ๋Š” SQL ๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค.

    ๐Ÿ“Œ ํ˜„์‹ค์˜ ์˜ˆ:
    ๊ณ ๊ฐ ์ •๋ณด๋Š” Customer, ์ฃผ๋ฌธ ์ •๋ณด๋Š” Orders์— ๋”ฐ๋กœ ์ €์žฅ
    โ†’ ๊ณ ๊ฐ ID๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‘ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•˜์—ฌ "๋ˆ„๊ฐ€ ๋ฌด์—‡์„ ์ฃผ๋ฌธํ–ˆ๋Š”๊ฐ€"๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Œ!


    ๐Ÿ” ๊ธฐ๋ณธ JOIN ๋ฌธ๋ฒ•

    1. ๋ช…์‹œ์  JOIN (๊ถŒ์žฅ)

    SELECT ์ปฌ๋Ÿผ๋ช…
    FROM ํ…Œ์ด๋ธ”1
    JOIN ํ…Œ์ด๋ธ”2 ON ์กฐ๊ฑด;

    2. ์•”์‹œ์  JOIN (๊ณผ๊ฑฐ ๋ฐฉ์‹)

    SELECT ์ปฌ๋Ÿผ๋ช…
    FROM ํ…Œ์ด๋ธ”1, ํ…Œ์ด๋ธ”2
    WHERE ์กฐ๊ฑด;

    3. ์˜ˆ์‹œ ํ…Œ์ด๋ธ”

    • 4656



    ๐Ÿ”ธ INNER JOIN

    โ€ข ์–‘์ชฝ ํ…Œ์ด๋ธ”์—์„œ ์กฐ๊ฑด์— ๋งž๋Š” ํ–‰๋งŒ ์—ฐ๊ฒฐ
    โ€ข ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ด๊ณ  ๋งŽ์ด ์‚ฌ์šฉ๋จ

    SELECT C.name, O.book
    FROM Customer C
    JOIN Orders O ON C.custid = O.custid;
    4657

    โ€ข Customer์™€ Orders ๋‘˜ ๋‹ค custid๊ฐ€ ์กด์žฌํ•˜๋Š” ํ–‰๋งŒ ์ถœ๋ ฅ
    โ€ข custid = 3 (๋ฐ•๋ฏผ์ˆ˜)์€ ์ฃผ๋ฌธ ๊ธฐ๋ก์ด ์—†์–ด์„œ ์ œ์™ธ๋จ
    โ€ข custid = 5๋Š” Orders์—” ์žˆ์ง€๋งŒ Customers์— ์—†์–ด์„œ ์ œ์™ธ๋จ


    ๐Ÿ”ธ OUTER JOIN

    ์กฐ๊ฑด์— ๋งž์ง€ ์•Š๋”๋ผ๋„ ํ•œ์ชฝ ํ…Œ์ด๋ธ”์˜ ํ–‰์„ ์œ ์ง€ํ•˜๋Š” JOIN
    โ†’ ๋ˆ„๋ฝ๋œ ์ •๋ณด๊นŒ์ง€ ํฌํ•จํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ

    JOIN ์ข…๋ฅ˜

    ๊ธฐ์ค€ ํ…Œ์ด๋ธ” ์œ ์ง€

    ์กฐ์ธ ์กฐ๊ฑด ๋ถˆ์ผ์น˜

    ํฌํ•จ ์—ฌ๋ถ€

    ์„ค๋ช…

    LEFT OUTER JOIN

    ์™ผ์ชฝ ํ…Œ์ด๋ธ”

    ์˜ค๋ฅธ์ชฝ NULL ์ฑ„์›€

    โœ… (์™ผ์ชฝ ๊ธฐ์ค€)

    ์™ผ์ชฝ ๋ฐ์ดํ„ฐ๋Š” ๋ฌด์กฐ๊ฑด ํฌํ•จ

    RIGHT OUTER JOIN

    ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”

    ์™ผ์ชฝ NULL ์ฑ„์›€

    โœ… (์˜ค๋ฅธ์ชฝ ๊ธฐ์ค€)

    ์˜ค๋ฅธ์ชฝ ๋ฐ์ดํ„ฐ๋Š” ๋ฌด์กฐ๊ฑด ํฌํ•จ

    FULL OUTER JOIN

    ์–‘์ชฝ ๋ชจ๋‘

    ์„œ๋กœ NULL ์ฑ„์›€

    โœ… (์ „์ฒด ์œ ์ง€)

    ์–‘์ชฝ ํ…Œ์ด๋ธ” ๋ชจ๋‘ ์œ ์ง€ (DBMS์— ๋”ฐ๋ผ ์ œํ•œ)

    1) LEFT OUTER JOIN ๊ฒฐ๊ณผ (๋ชจ๋“  ๊ณ ๊ฐ ์œ ์ง€)

    SELECT C.name, O.book
    FROM Customer C
    LEFT OUTER JOIN Orders O ON C.custid = O.custid;

    โ€ข Customer์— ์žˆ๋Š” ๋ชจ๋“  ๊ณ ๊ฐ์ด ๊ธฐ์ค€์ด ๋จ
    โ€ข ์ฃผ๋ฌธ์ด ์—†๋Š” ๊ณ ๊ฐ(๋ฐ•๋ฏผ์ˆ˜, ์ •์˜ˆ๋ฆฐ)๋„ ๊ฒฐ๊ณผ์— ํฌํ•จ๋จ
    โ€ข ๋Œ€์‹  ์—ฐ๊ฒฐ๋œ ์ฃผ๋ฌธ์ด ์—†์œผ๋ฏ€๋กœ book์€ NULL๋กœ ๋‚˜์˜ด

    2) RIGHT OUTER JOIN ๊ฒฐ๊ณผ (๋ชจ๋“  ์ฃผ๋ฌธ ์œ ์ง€)

    SELECT C.name, O.book
    FROM Customer C
    RIGHT OUTER JOIN Orders O ON C.custid = O.custid;
    4658

    โ€ข Orders ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ์ฃผ๋ฌธ์„ ๊ธฐ์ค€์œผ๋กœ
    โ€ข ๊ณ ๊ฐ ์ •๋ณด๊ฐ€ ์—†๋Š” ์ฃผ๋ฌธ(custid = 5)๋„ ๊ฒฐ๊ณผ์— ํฌํ•จ
    โ€ข ํ•ด๋‹น ๊ณ ๊ฐ์ด ์—†์œผ๋ฏ€๋กœ name์€ NULL


    ๐Ÿ”ธ NATURAL JOIN

    โ€ข ๊ณตํ†ต๋œ ์†์„ฑ๋ช…์ด ์žˆ์œผ๋ฉด ์ž๋™์œผ๋กœ ์กฐ์ธ
    โ€ข ์ค‘๋ณต๋œ ์ปฌ๋Ÿผ์€ 1๊ฐœ๋กœ ์ถœ๋ ฅ๋จ (์ง๊ด€์ ์ด์ง€๋งŒ ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๋„ ์žˆ์Œ)

    SELECT *
    FROM Book
    NATURAL JOIN Orders;
    4659

    bookid๊ฐ€ ์–‘์ชฝ ํ…Œ์ด๋ธ”์— ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ ์ด ์ปฌ๋Ÿผ์„ ๊ธฐ์ค€์œผ๋กœ JOINํ•จ
    ์ค‘๋ณต๋œ bookid๋Š” ๊ฒฐ๊ณผ์— ํ•œ ๋ฒˆ๋งŒ ์ถœ๋ ฅ๋จ


    ๐Ÿ”ธ SELF JOIN

    • ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์„ ์ž๊ธฐ ์ž์‹ ๊ณผ ์กฐ์ธํ•  ๋•Œ ์‚ฌ์šฉ

    • ์ฃผ๋กœ ๊ณ„์ธต ๊ตฌ์กฐ(๋ถ€์„œ, ์ƒ์‚ฌ-์ง์› ๊ด€๊ณ„) ๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ ์“ฐ์ž„

      4660
    SELECT E.name AS ์ง์›, M.name AS ์ƒ์‚ฌ
    FROM Employee E
    JOIN Employee M ON E.managerid = M.empid;
    4661

    Employee ํ…Œ์ด๋ธ”์„ E, M ๋‘ ๋ฒˆ ์‚ฌ์šฉํ•ด์„œ
    E์˜ managerid = M์˜ empid ์ธ ๊ฒฝ์šฐ ์กฐ์ธ
    ์ฆ‰, โ€œ์ด ์ง์›์˜ ์ƒ์‚ฌ๋Š” ๋ˆ„๊ตฌ์ธ๊ฐ€?โ€œ๋ฅผ ํ‘œํ˜„ํ•œ ์…ˆ


    โœ… ์‹ค์ „ ์˜ˆ์ œ ๋ชจ์Œ

    -- ๊ณ ๊ฐ ์ด๋ฆ„๊ณผ ์ฃผ๋ฌธํ•œ ๋„์„œ์˜ ์ด๋ฆ„
    SELECT C.name, B.bookname
    FROM Customer C
    JOIN Orders O ON C.custid = O.custid
    JOIN Book B ON O.bookid = B.bookid;
    
    -- ์ฃผ๋ฌธํ•˜์ง€ ์•Š์€ ๊ณ ๊ฐ๋„ ํฌํ•จ (LEFT OUTER JOIN)
    SELECT C.name, O.orderid
    FROM Customer C
    LEFT OUTER JOIN Orders O ON C.custid = O.custid;

    ๐Ÿง  ๋งˆ๋ฌด๋ฆฌ

    JOIN ์ข…๋ฅ˜

    ์„ค๋ช…

    ๋ˆ„๋ฝ ๋ฐ์ดํ„ฐ ํฌํ•จ ์—ฌ๋ถ€

    INNER JOIN

    ์–‘์ชฝ ํ…Œ์ด๋ธ” ๋ชจ๋‘ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํ–‰๋งŒ ๋ฐ˜ํ™˜

    โŒ

    LEFT OUTER JOIN

    ์™ผ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ํ–‰ + ๋งค์นญ๋˜๋Š” ์˜ค๋ฅธ์ชฝ ํ–‰

    โœ… (์™ผ์ชฝ ๊ธฐ์ค€)

    RIGHT OUTER JOIN

    ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ํ–‰ + ๋งค์นญ๋˜๋Š” ์™ผ์ชฝ ํ–‰

    โœ… (์˜ค๋ฅธ์ชฝ ๊ธฐ์ค€)

    FULL OUTER JOIN

    ์–‘์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ํ–‰์„ ํฌํ•จ (๋งค์นญ ์•ˆ ๋ผ๋„ ํฌํ•จ)

    โœ… (์–‘์ชฝ ๋‹ค ์œ ์ง€)

    NATURAL JOIN

    ๊ณตํ†ต ์†์„ฑ ์ž๋™ ์กฐ์ธ, ์ค‘๋ณต ์†์„ฑ์€ 1๊ฐœ๋กœ ์ •๋ฆฌ๋จ

    ์กฐ๊ฑด ์ž๋™ ์ถ”๋ก 

    SELF JOIN

    ์ž๊ธฐ ์ž์‹ ๊ณผ ์กฐ์ธํ•˜์—ฌ ๊ณ„์ธต์ /๊ด€๊ณ„์  ๊ตฌ์กฐ ํ‘œํ˜„

    -

    ๐Ÿ“˜ ํ•™์Šต ํŒ
    โ€ข INNER JOIN์€ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด์ž ์•ˆ์ „ํ•œ ์„ ํƒ
    โ€ข OUTER JOIN์€ ๋ฐ์ดํ„ฐ ๋ˆ„๋ฝ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ
    โ€ข JOIN์ด ๋งŽ์•„์ง€๋ฉด ์ˆœ์„œ์™€ ON ์กฐ๊ฑด์„ ์ •ํ™•ํžˆ ํ™•์ธํ•ด์•ผ ํ•จ
    โ€ข ๋ณ„์นญ(alias)์„ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง







    - ์ปฌ๋ ‰์…˜ ์•„ํ‹ฐํด