๐Ÿ›ข๏ธDatabase

[Real MySQL 8.0] ์ฟผ๋ฆฌ ์ž‘์„ฑ ๋ฐ ์ตœ์ ํ™” - JOIN

DevPoong 2023. 8. 22. 14:25

JOIN์ด ์–ด๋–ป๊ฒŒ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์ฟผ๋ฆฌ ํŒจํ„ด๋ณ„๋กœ ์•Œ์•„๋ณด๊ณ  ์ฃผ์˜์‚ฌํ•ญ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค.

1. JOIN์˜ ์ˆœ์„œ์™€ ์ธ๋ฑ์Šค

์ธ๋ฑ์Šค ๋ ˆ์ธ์ง€ ์Šค์บ”์€ ์ธ๋ฑ์Šค๋ฅผ ํƒ์ƒ‰(Seek)ํ•˜๋Š” ๋‹จ๊ณ„์™€ ์ธ๋ฑ์Šค๋ฅผ ์Šค์บ”(Scan)ํ•˜๋Š” ๊ณผ์ •์œผ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด์„œ ์ฟผ๋ฆฌํ•˜๋Š” ์ž‘์—…์—์„œ๋Š” ๊ฐ€์ ธ์˜ค๋Š” ๋ ˆ์ฝ”๋“œ์˜ ๊ฑด์ˆ˜๊ฐ€ ์†Œ๋Ÿ‰์ด๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค ์Šค์บ” ์ž‘์—…์€ ๋ถ€ํ•˜๊ฐ€ ์ž‘์ง€๋งŒ ํŠน์ • ์ธ๋ฑ์Šค ํ‚ค๋ฅผ ์ฐพ๋Š” ์ธ๋ฑ์Šค ํƒ์ƒ‰ ์ž‘์—…์€ ์ƒ๋Œ€์ ์œผ๋กœ ๋ถ€ํ•˜๊ฐ€ ๋†’๋‹ค.

 

์กฐ์ธ ์ž‘์—…์—์„œ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”์„ ์ฝ์„ ๋•Œ๋Š” ์ธ๋ฑ์Šค ํƒ์ƒ‰ ์ž‘์—…์„ ๋‹จ ํ•œ ๋ฒˆ๋งŒ ์ˆ˜ํ–‰ํ•˜๊ณ , ๊ทธ ์ดํ›„๋ถ€ํ„ฐ๋Š” ์Šค์บ”๋งŒ ์‹คํ–‰ํ•˜๋ฉด ๋œ๋‹ค.
ํ•˜์ง€๋งŒ ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”์—์„œ๋Š” ์ธ๋ฑ์Šค ํƒ์ƒ‰ ์ž‘์—…๊ณผ ์Šค์บ” ์ž‘์—…์„ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”์—์„œ ์ฝ์€ ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜๋งŒํผ ๋ฐ˜๋ณตํ•œ๋‹ค.
๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”๊ณผ ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”์ด 1:1๋กœ ์กฐ์ธ๋˜๋”๋ผ๋„ ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”์„ ์ฝ๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ํฐ ๋ถ€ํ•˜๋ฅผ ์ฐจ์ง€ํ•œ๋‹ค.

 

๋”ฐ๋ผ์„œ, ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ํ•ญ์ƒ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”์ด ์•„๋‹ˆ๋ผ ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”์„ ์ตœ์ ์œผ๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ ์‹คํ–‰๊ณ„ํš์„ ์ˆ˜๋ฆฝํ•œ๋‹ค.

 

์•„๋ž˜์˜ employees ํ…Œ์ด๋ธ”๊ณผ dept_emp ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•˜๋Š” ์˜ˆ์‹œ๋ฅผ ๋ณด์ž.

SELECT *
FROM A a, B b
WHERE a.emp_no=b.emp_no;

์ด ๋‘ํ…Œ์ด๋ธ”์˜ ์กฐ์ธ ์ฟผ๋ฆฌ์—์„œ A ํ…Œ์ด๋ธ”์˜ emp_no ์ปฌ๋Ÿผ๊ณผ B ํ…Œ์ด๋ธ”์˜ emp_no ์ปฌ๋Ÿผ์— ๊ฐ๊ฐ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ์„ ๋•Œ์™€ ์—†์„ ๋•Œ ์กฐ์ธ ์ˆœ์„œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‹ฌ๋ผ์ง€๋Š” ํ•œ๋ฒˆ ์‚ดํŽด๋ณด์ž.

 

  • 1. ๋‘ ์ปฌ๋Ÿผ ๋ชจ๋‘ ๊ฐ๊ฐ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ 
    • ๊ฐ ๋‘ ํ…Œ์ด๋ธ”์˜ emp_no ์ปฌ๋Ÿผ์— ๋ชจ๋‘ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์–ด๋Š ํ…Œ์ด๋ธ”์„ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”์œผ๋กœ ์„ ํƒํ•˜๋“  ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”์˜ ๊ฒ€์ƒ‰ ์ž‘์—…์„ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ํ†ต๊ณ„ ์ •๋ณด๋ฅผ ์ด์šฉํ•ด ์ ์ ˆํžˆ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”์„ ์„ ํƒํ•œ๋‹ค. ๊ฐ ํ…Œ์ด๋ธ”์˜ ํ†ต๊ณ„ ์ •๋ณด์— ์žˆ๋Š” ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜์— ๋”ฐ๋ผ ๋‘˜ ์ค‘์— ํ•˜๋‚˜๊ฐ€ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
    • ๋ณดํ†ต ์–ด๋Š ์ชฝ์ด ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”์ด ๋˜๋“  ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ตœ์ ์ผ ๋•Œ๊ฐ€ ๋งŽ๋‹ค.
  • 2. A.emp_no์—๋งŒ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ
    • ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ํ•ญ์ƒ B ํ…Œ์ด๋ธ”์„ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”๋กœ ์„ ํƒํ•˜๊ณ , A ํ…Œ์ด๋ธ”์„ ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”๋กœ ์„ ํƒํ•œ๋‹ค.
    • ๊ทธ ์ด์œ ๋Š”, A.emp_no์—๋งŒ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ์„ ๋•Œ B ํ…Œ์ด๋ธ”์ด ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”๋กœ ์„ ํƒ๋œ๋‹ค๋ฉด employees ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜๋งŒํผ B ํ…Œ์ด๋ธ”์„ ํ’€ ์Šค์บ”ํ•ด์•ผ๋งŒ "a.emp_no=b.emp_no" ์กฐ๊ฑด์— ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.
    • "e.emp_no=10001"๊ณผ ๊ฐ™์ด employees ํ…Œ์ด๋ธ”์„ ์•„์ฃผ ํšจ์œจ์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด์ด ์žˆ๋”๋ผ๋„ ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” Bํ…Œ์ด๋ธ”์„ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”๋กœ ์„ ํƒํ•  ํ™•๋ฅ ์ด ๋†’๋‹ค.
  • 3. B.emp_no์—๋งŒ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ
    • 2๋ฒˆ์˜ ๊ฒฝ์šฐ์™€ ๋ฐ˜๋Œ€๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.
    • A ํ…Œ์ด๋ธ”์˜ ๋ฐ˜๋ณต๋œ ํ’€ ์Šค์บ”์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด Aํ…Œ์ด๋ธ”์„ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”, B ํ…Œ์ด๋ธ”์„ ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”๋กœ ์„ ํƒํ•œ๋‹ค.
  • 4. ๋‘ ์ปฌ๋Ÿผ ๋ชจ๋‘ ์ธ๋ฑ์Šค๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ
    • 1๋ฒˆ์˜ ๊ฒฝ์šฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์–ด๋Š ํ…Œ์ด๋ธ”์„ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”๋กœ ์„ ํƒํ•˜๋”๋ผ๋„ ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”์˜ ํ’€ ์Šค์บ”์€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ ์ ˆํžˆ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”์„ ์„ ํƒํ•œ๋‹ค.
    • ๋‹จ, ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜๊ฐ€ ์ ์€ ํ…Œ์ด๋ธ”์„ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”๋กœ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ํšจ์œจ์ ์ด๋‹ค.
    • ์ด๋ ‡๋“ฏ ์กฐ์ธ ์กฐ๊ฑด์„ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ ์ ˆํ•œ ์ธ๋ฑ์Šค๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ MySQL 8.0.18 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” ํ•ด์‹œ ์กฐ์ธ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

 

2. JOIN ์ปฌ๋Ÿผ์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…

์ด์ „ ํฌ์ŠคํŒ…์—์„œ WHERE ์ ˆ์— ์‚ฌ์šฉ๋˜๋Š” ์กฐ๊ฑด์—์„œ ๋น„๊ต ๋Œ€์ƒ ์ปฌ๋Ÿผ๊ณผ ํ‘œํ˜„์‹์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋ฐ˜๋“œ์‹œ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ–ˆ์—ˆ๋‹ค.
JOIN์˜ ์กฐ๊ฑด์—์„œ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋œ๋‹ค. ์กฐ์ธ ์ปฌ๋Ÿผ ๊ฐ„์˜ ๋น„๊ต์—์„œ ๊ฐ ์ปฌ๋Ÿผ์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์ธ๋ฑ์Šค๋ฅด ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉ ๋ถˆ๊ฐ€ํ•˜๋‹ค.

 

๋งŒ์•ฝ ์กฐ์ธ ์กฐ๊ฑด์˜ ์–‘์ชฝ ํ•ญ์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ๋‹ค๋ฅด๋‹ค๋ฉด ๋‘ ํ…Œ์ด๋ธ” ๋ชจ๋‘ ํ’€ ํ…Œ์ด๋ธ” ์Šค์บ”์œผ๋กœ ์ ‘๊ทผํ•œ๋‹ค.
์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”์ด ์ธ๋ฑ์Šค ๋ ˆ์ธ์ง€ ์Šค์บ”์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ณ , ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”์˜ ํ’€ ํ…Œ์ด๋ธ” ์Šค์บ”์ด ํ•„์š”ํ•œ ๊ฒƒ์„ ์•Œ๊ณ  ์กฐ๊ธˆ์ด๋ผ๋„ ๋นจ๋ฆฌ ์‹คํ–‰๋˜๋„๋ก ์กฐ์ธ ๋ฒ„ํผ๋ฅผ ํ™œ์šฉํ•œ ํ•ด์‹œ ์กฐ์ธ์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

๋ฐ์ดํ„ฐ ํƒ€์ž… ๋ถˆ์ผ์น˜๊ฐ€ ์ธ๋ฑ์Šค ์‚ฌ์šฉ์— ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ๊ฒฝ์šฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • CHAR ํƒ€์ž…๊ณผ INT ํƒ€์ž…์˜ ๋น„๊ต์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ ํƒ€์ž…์˜ ์ข…๋ฅ˜๊ฐ€ ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ฒฝ์šฐ
  • ๊ฐ™์€ CHAR ํƒ€์ž…์ด๋”๋ผ๋„ ๋ฌธ์ž ์ง‘ํ•ฉ์ด๋‚˜ ์ฝœ๋ ˆ์ด์…˜์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ
  • ๊ฐ™์€ INT ํƒ€์ž…์ด๋”๋ผ๋„ ๋ถ€ํ˜ธ(Sign)์˜ ์กด์žฌ ์—ฌ๋ถ€๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ
์ฝœ๋ ˆ์ด์…˜์ด๋ž€? 
ํŠน์ • ๋ฌธ์ž ์…‹์— ์˜ํ•ด DB์— ์ €์žฅ๋œ ๊ฐ’๋“ค์„ ๋น„๊ต ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜ ์ •๋ ฌ ๋“ฑ์˜ ์ž‘์—…์„ ์œ„ํ•ด ๋ฌธ์ž๋“ค์„ ์„œ๋กœ ๋น„๊ตํ• ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ทœ์น™๋“ค์˜ ์ง‘ํ•จ
ex) utf8_general_ci, latin1_general_ci

 

๋ฐ์ดํ„ฐ ํƒ€์ž… ๋ถˆ์ผ์น˜๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.
CHAR - VARCHAR , INT-BIGINT(SMALLINT), DATE-DATETIME ํƒ€์ž… ์‚ฌ์ด์—์„œ๋Š” ํƒ€์ž… ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

3. OUTER JOIN์˜ ์„ฑ๋Šฅ๊ณผ ์ฃผ์˜์‚ฌํ•ญ

INNER JOIN์€ ์กฐ์ธ ๋Œ€์ƒ ํ…Œ์ด๋ธ”์— ๋ชจ๋‘ ์กด์žฌํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋งŒ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
ํ•ด๋‹น INNER JOIN์˜ ํŠน์„ฑ ๋•Œ๋ฌธ์— OUTER JOIN์œผ๋กœ๋งŒ ์กฐ์ธ์„ ์‹คํ–‰ํ•˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์ฟผ๋ฆฌ๋„ ๋งŽ์ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

SELECT *
FROM A a
	LEFT JOIN B b ON b.emp_no=a.emp_no
    	LEFT JOIN C c ON c.dept_no=b.dept_no AND C.dept_name='Dev';

 

ํ•ด๋‹น ์ฟผ๋ฆฌ ์•„๋ž˜ ์‹คํ–‰ ๊ณ„ํš์„ ๋ณด๋ฉด ์ œ์ผ ๋จผ์ € A ํ…Œ์ด๋ธ”์„ ํ’€ ์Šค์บ”ํ•˜๋ฉด์„œ dept_emp ํ…Œ์ด๋ธ”๊ณผ departments ํ…Œ์ด๋ธ”์„ ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

MySQL ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ์ ˆ๋Œ€ OUTER JOIN๋˜๋Š” ํ…Œ์ด๋ธ”์„ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”๋กœ ์„ ํƒํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ’€ ์Šค์บ”์ด ํ•„์š”ํ•œ A ํ…Œ์ด๋ธ”์„ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”๋กœ ์„ ํƒํ•œ๋‹ค.
๊ทธ ๊ฒฐ๊ณผ ์ฟผ๋ฆฌ์˜ ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง€๊ฒŒ ๋œ๋‹ค.

 

๋งŒ์•ฝ, ์ด ์ฟผ๋ฆฌ์— INNER JOIN์„ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด Cํ…Œ์ด๋ธ”์—์„œ ๋ถ€์„œ๋ช…์ด 'Dev'์ธ ๋ ˆ์ฝ”๋“œ 1๊ฑด๋งŒ ์ฐพ์•„์„œ ์กฐ์ธ์„ ์‹คํ–‰ํ•˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์‹คํ–‰ ๊ณ„ํš์„ ์„ ํƒํ–ˆ์„ ๊ฒƒ์ด๋‹ค.

์ด๋ ‡๋“ฏ INNER JOIN์œผ๋กœ ์ˆ˜ํ–‰ํ•ด๋„ ๋˜๋Š” ๊ฒƒ์„ OUTER JOIN์œผ๋กœ ์ž˜๋ชป ํ’€์–ด๋ƒˆ์„ ๋•Œ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์กฐ์ธ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์ ํ™”์˜ ๊ธฐํšŒ๋ฅผ ์žƒ์–ด๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด INENR JOIN์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

OUTER ์กฐ์ธ์„ ํ•˜๋ฉด์„œ ๋งŽ์ด ํ•˜๋Š” ์‹ค์ˆ˜

SELECT *
FROM A a
	INNER JOIN B b ON b.emp_no=a.emp_no
WHERE b.dept_no='d001';

์œ„ ์ฟผ๋ฆฌ์ฒ˜๋Ÿผ OUTER JOIN๋˜๋Š” ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์กฐ๊ฑด์„ WHERE ์กฐ๊ฑด์— ๋ช…์‹œํ•˜๋Š” ์‹ค์ˆ˜๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

 

ON ์ ˆ์— ์กฐ์ธ ์กฐ๊ฑด์€ ๋ช…์‹œํ–ˆ์ง€๋งŒ OUTER JOIN ๋˜๋Š” ํ…Œ์ด๋ธ”์ธ B์˜ 'dept_no='d001'' ์กฐ๊ฑด์„ WHERE ์ ˆ์— ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์€ 
MySQL ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ LEFT JOIN ์„ ์•„๋ž˜์™€ ๊ฐ™์ด INNER์กฐ์ธ์œผ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์‹คํ–‰ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋ฒ„๋ฆฐ๋‹ค.

SELECT *
FROM A a
	INNER JOIN B b ON b.emp_no=a.emp_no
WHERE b.dept_no='d001';

์ •์ƒ์ ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด dept_no='d001' ์กฐ๊ฑด์„ LEFT JOIN์˜ ON์ ˆ์œผ๋กœ ์˜ฎ๊ฒจ์•ผ ํ•œ๋‹ค.

 

์—ฌ๊ธฐ์„œ๋„ ์˜ˆ์™ธ๋Š” ์žˆ๋‹ค
์˜ˆ์™ธ์ ์œผ๋กœ OUTER JOIN์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋Š” ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์— ๋Œ€ํ•œ ์กฐ๊ฑด์„ WHERE ์ ˆ์— ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ,
๋‹ค์Œ๊ณผ ๊ฐ™์ด ANTI-JOIN ํšจ๊ณผ๋ฅผ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๊ทธ๋Ÿฌํ•˜๋‹ค.

SELECT *
FROM A a
	LEFT JOIN B b ON b.emp_no=a.emp_no
WHERE b.emp_no IS NULL
LIMIT 10;

์œ„ ์ฟผ๋ฆฌ๋Š” A์˜ ๋ ˆ์ฝ”๋“œ ์ค‘์—์„œ B ๋ ˆ์ฝ”๋“œ์— ํ•ด๋‹น ๋˜์ง€ ์•Š๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ์ธ๋ฐ, ์ด ๊ฒฝ์šฐ์— WHERE ์ ˆ์— B ํ…Œ์ด๋ธ”์˜ emp_no ์ปฌ๋Ÿผ์ด NULL์ธ ๋ ˆ์ฝ”๋“œ๋“ค๋งŒ ์กฐํšŒํ•œ๋‹ค. ์ด๋Ÿฐ ํ˜•ํƒœ์˜ ์š”๊ฑด์ด ์•„์šฐํ„ฐ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์ด WHERE ์ ˆ์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๊ฒฝ์šฐ์ด๋‹ค.
์ด ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” WHERE ์ ˆ์— OUTER JOIN ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ ์กฐ๊ฑด์ด ๋“ค์–ด๊ฐ„๋‹ค๋ฉด INNER JOIN์œผ๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ž.

 

4. JOIN๊ณผ ์™ธ๋ž˜ํ‚ค (FOREIGN KEY)

DB์— ์™ธ๋ž˜ํ‚ค๊ฐ€ ์ƒ์„ฑ๋ผ ์žˆ์–ด์•ผ๋งŒ ์กฐ์ธํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์˜๋ฌธ์„ ํ’ˆ์„ ์ˆ˜ ์žˆ๋‹ค.
๊ฒฐ๋ก ์€ ์™ธ๋ž˜ํ‚ค๋Š” ์กฐ์ธ๊ณผ ์•„๋ฌด๋Ÿฐ ์—ฐ๊ด€์ด ์—†๋‹ค. ์™ธ๋ž˜ํ‚ฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฃผ๋ชฉ์ ์€ ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ๋‹ค.

 

์™ธ๋ž˜ํ‚ค์™€ ์—ฐ๊ด€๋œ ๋ฌด๊ฒฐ์„ฑ์„ ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ์ด๋ผ๊ณ  ํ‘œํ˜„ํ•œ๋‹ค. 
์‚ฌ์› ํ…Œ์ด๋ธ”๊ณผ ๋ถ€์„œ ํ…Œ์ด๋ธ”์ด ์žˆ์„ ๋•Œ, ์‚ฌ์› ํ…Œ์ด๋ธ”์—๋Š” ์‚ฌ์›์˜ ๋ถ€์„œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ์ปฌ๋Ÿผ์ด ์žˆ๋‹ค.
์ด๋•Œ ์‚ฌ์› ํ…Œ์ด๋ธ”์˜ ๋ถ€์„œ ์ฝ”๋“œ๋Š” ๋ฐ˜๋“œ์‹œ ๋ถ€์„œ ํ…Œ์ด๋ธ”์— ์กด์žฌํ•˜๋Š” ๋ถ€์„œ ์ •๋ณด๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๋ฐ ์ด๊ฒŒ ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ์ด๋‹ค.
์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ์ด ๊นจ์ง€๋Š” ๋ฌธ์ œ๋ฅผ DBMS ์ฐจ์›์—์„œ ๋ง‰๊ธฐ ์œ„ํ•ด ์™ธ๋ž˜ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 ํ•˜์ง€๋งŒ SQL๋กœ ํ…Œ์ด๋ธ” ๊ฐ„์˜ ์กฐ์ธ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์ „ํ˜€ ๋ฌด๊ด€ํ•œ ์ปฌ๋Ÿผ์„ ์กฐ์ธ ์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉํ•ด๋„ ๋ฌธ๋ฒ•์ ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.