์กฐ์ธ(JOIN)

๋‚˜์ฐฌ์›…ยท2024๋…„ 10์›” 16์ผ

DB

๋ชฉ๋ก ๋ณด๊ธฐ
3/10

๐Ÿš€ JOIN ์ด๋ž€?

  • ํ•˜๋‚˜ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๊ณ  ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋Š” ํ•˜๋‚˜์˜ Result Set์œผ๋กœ ๋‚˜์˜ด

[JOIN ์šฉ์–ด ์ •๋ฆฌ]

์˜ค๋ผํด SQL : 1999ํ‘œ์ค€(ANSI)

๋“ฑ๊ฐ€ ์กฐ์ธ ๋‚ด๋ถ€ ์กฐ์ธ(INNER JOIN), JOIN USING / ON

                                        + ์ž์—ฐ ์กฐ์ธ(NATURAL JOIN, ๋“ฑ๊ฐ€ ์กฐ์ธ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜)

ํฌ๊ด„ ์กฐ์ธ ์™ผ์ชฝ ์™ธ๋ถ€ ์กฐ์ธ(LEFT OUTER), ์˜ค๋ฅธ์ชฝ ์™ธ๋ถ€ ์กฐ์ธ(RIGHT OUTER)

                                        + ์ „์ฒด ์™ธ๋ถ€ ์กฐ์ธ(FULL OUTER, ์˜ค๋ผํด ๊ตฌ๋ฌธ์œผ๋กœ๋Š” ์‚ฌ์šฉ ๋ชปํ•จ)

์ž์ฒด ์กฐ์ธ, ๋น„๋“ฑ๊ฐ€ ์กฐ์ธ JOIN ON

์นดํ…Œ์‹œ์•ˆ(์นดํ‹ฐ์…˜) ๊ณฑ ๊ต์ฐจ ์กฐ์ธ(CROSS JOIN)
CARTESIAN PRODUCT

  • ๋ฏธ๊ตญ ๊ตญ๋ฆฝ ํ‘œ์ค€ ํ˜‘ํšŒ(American National Standards Institute, ANSI) ๋ฏธ๊ตญ์˜ ์‚ฐ์—… ํ‘œ์ค€์„ ์ œ์ •ํ•˜๋Š” ๋ฏผ๊ฐ„๋‹จ์ฒด.
  • ๊ตญ์ œํ‘œ์ค€ํ™”๊ธฐ๊ตฌ ISO์— ๊ฐ€์ž…๋˜์–ด ์žˆ์Œ.

-- JOIN
-- ํ•˜๋‚˜ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ.
-- ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋Š” ํ•˜๋‚˜์˜ Result Set์œผ๋กœ ๋‚˜์˜ด.

-- (์ฐธ๊ณ ) JOIN์€ ์„œ๋กœ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ ํ–‰์„ ํ•˜๋‚˜์”ฉ ์ด์–ด ๋ถ™์ด๊ธฐ ๋•Œ๋ฌธ์—
-- ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค!

  • ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ SQL์„ ์ด์šฉํ•ด ํ…Œ์ด๋ธ”๊ฐ„ '๊ด€๊ณ„'๋ฅผ ๋งบ๋Š” ๋ฐฉ๋ฒ•.
  • ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ตœ์†Œํ•œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ…Œ์ด๋ธ”์— ๋‹ด๊ณ  ์žˆ์–ด
    ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ํ…Œ์ด๋ธ”์—์„œ ์กฐํšŒํ•˜๋ ค๋ฉด ํ•œ ๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์—์„œ
    ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์™€์•ผ ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.
    ์ด ๋•Œ, ํ…Œ์ด๋ธ”๊ฐ„ ๊ด€๊ณ„๋ฅผ ๋งบ๊ธฐ ์œ„ํ•œ ์—ฐ๊ฒฐ๊ณ ๋ฆฌ ์—ญํ• ์ด ํ•„์š”ํ•œ๋ฐ,
    ๋‘ ํ…Œ์ด๋ธ”์—์„œ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ปฌ๋Ÿผ์ด ์—ฐ๊ฒฐ๊ณ ๋ฆฌ๊ฐ€๋จ.

๐Ÿš€ INNER JOIN๊ณผ OUTER JOIN

๊ธฐ๋ณธ์ ์œผ๋กœ JOIN์€ INNER JOIN์ด๋ฉฐ
๋‘ ๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•  ๋•Œ ์ผ์น˜ํ•˜๋Š” ๊ฐ’์ด ์—†๋Š” ํ–‰์€ ์กฐ์ธ์—์„œ ์ œ์™ธ๋จ
OUTER JOIN์€ ์ผ์น˜ํ•˜์ง€ ์•Š์€ ๊ฐ’๋„ ํฌํ•จ์ด ๋˜๋ฉฐ ๋ฐ˜๋“œ์‹œ OUTER JOIN ๋ช…์‹œ

SELECT <์—ด ๋ชฉ๋ก>
FROM <์ฒซ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”>
    INNER JOIN <๋‘ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”>
    ON <์กฐ์ธ ์กฐ๊ฑด>
[WHERE ๊ฒ€์ƒ‰ ์กฐ๊ฑด]

#INNER JOIN์„ JOIN์ด๋ผ๊ณ ๋งŒ ์จ๋„ INNER JOIN์œผ๋กœ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค.

SELECT <์—ด ๋ชฉ๋ก>
FROM <์ฒซ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”(LEFT ํ…Œ์ด๋ธ”)>
    <LEFT | RIGHT | FULL> OUTER JOIN <๋‘ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”(RIGHT ํ…Œ์ด๋ธ”)>
     ON <์กฐ์ธ ์กฐ๊ฑด>
[WHERE ๊ฒ€์ƒ‰ ์กฐ๊ฑด]

OUTER JOIN ์‹ฌํ™”


๐Ÿš€ CROSS JOIN

ํ•œ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ํ–‰๊ณผ ๋‹ค๋ฅธ ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ํ–‰์„ ์กฐ์ธ์‹œํ‚ค๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ƒํ˜ธ ์กฐ์ธ ๊ฒฐ๊ณผ์˜ ์ „์ฒด ํ–‰ ๊ฐœ์ˆ˜๋Š” ๋‘ ํ…Œ์ด๋ธ”์˜ ๊ฐ ํ–‰์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ณฑํ•œ ์ˆ˜๋งŒํผ ๋ฉ๋‹ˆ๋‹ค.
์นดํ‹ฐ์…˜ ๊ณฑ(CARTESIAN PRODUCT)๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค.

SELECT *
FROM <์ฒซ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”>
    CROSS JOIN <๋‘ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”>


๐Ÿš€ SELF JOIN

์ž์ฒด(SELF) ์กฐ์ธ์€ ์ž๊ธฐ ์ž์‹ ๊ณผ ์กฐ์ธํ•˜๋ฏ€๋กœ 1๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ๋ฌธ๋ฒ•์ด ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ณ  1๊ฐœ๋กœ ์กฐ์ธํ•˜๋ฉด ์ž์ฒด ์กฐ์ธ์ด ๋ฉ๋‹ˆ๋‹ค.

SELECT <์—ด ๋ชฉ๋ก>
FROM <ํ…Œ์ด๋ธ”> ๋ณ„์นญA
    INNER JOIN <ํ…Œ์ด๋ธ”> ๋ณ„์นญB
[WHERE ๊ฒ€์ƒ‰ ์กฐ๊ฑด]


๐Ÿš€ NATURAL JOIN

Natural Join์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ณตํ†ต๋œ ์†์„ฑ์„ ์ฐพ์•„ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ–๋Š” ํ•ญ๋ชฉ๋ผ๋ฆฌ ๊ฒฐํ•ฉ์‹œ์ผœ์ค€๋‹ค.

๋งŒ์•ฝ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ–๋Š” ํ•ญ๋ชฉ์ด ์—†๋‹ค๋ฉด ํ•ด๋‹น ํ•ญ๋ชฉ์€ ์ œ์™ธํ•œ๋‹ค.


๐Ÿš€ ๋‹ค์ค‘ JOIN

ํ•˜๋‚˜ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๊ณ  ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋Š” ํ•˜๋‚˜์˜ Result Set์œผ๋กœ ๋‚˜์˜ด

  • N๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•  ๋•Œ ์‚ฌ์šฉ (์ˆœ์„œ๊ฐ€ ๋งค์šฐ ์ค‘์š”!)

-- ์‚ฌ์› ์ด๋ฆ„, ๋ถ€์„œ๋ช…, ์ง€์—ญ๋ช… ์กฐํšŒ
-- EMP_NAME(EMPLOYEE)
-- DEPT_TITLE(DEPARTMENT)
-- LOCAL_NAME(LOTATION)

-- ORACLE
SELECT EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE, DEPARTMENT, LOCATION 
WHERE DEPT_CODE = DEPT_ID -- EMPLOYEE + DEPARTMENT ์กฐ์ธ
AND LOCATION_ID = LOCAL_CODE; -- (EMPLOYEE + DEPARTMENT) + LOCATION ์กฐ์ธ

0๊ฐœ์˜ ๋Œ“๊ธ€