๐Ÿ’ป [Theory] ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด๋ถ€ ์กฐ์ธ๊ณผ ์™ธ๋ถ€ ์กฐ์ธ

๐Ÿ’ป [Theory] ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐ์ธ(join)

์ด๋ฒˆ์—๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด๋ถ€ ์กฐ์ธ๊ณผ ์™ธ๋ถ€ ์กฐ์ธ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐ์ธ(join)์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

  • join(์กฐ์ธ) ๋˜๋Š” ๊ฒฐํ•ฉ ๊ตฌ๋ฌธ์€ ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด์˜ ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ์—ด๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์กฐ์ธ์€ ํ…Œ์ด๋ธ”๋กœ์„œ ์ €์žฅ๋˜๊ฑฐ๋‚˜, ๊ทธ ์ž์ฒด๋กœ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฐ๊ณผ ์…‹์„ ๋งŒ๋“ค์–ด ๋‚ธ๋‹ค.
  • JOIN์€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ…Œ์ด๋ธ”์—์„œ ๊ฐ๊ฐ์˜ ๊ณตํ†ต๊ฐ’์„ ์ด์šฉํ•จ์œผ๋กœ์จ ํ•„๋“œ๋ฅผ ์กฐํ•ฉํ•˜๋Š” ์ˆ˜๋‹จ์ด ๋œ๋‹ค.

์กฐ์ธ(join)์˜ ์ข…๋ฅ˜

sql-joins

ANSI ํ‘œ์ค€ SQL ์€ ๋„ค ๊ฐ€์ง€ ์œ ํ˜•์˜ JOIN์„ ๊ทœ์ •ํ•œ๋‹ค.

  • INNER JOIN: ๋‚ด๋ถ€์กฐ์ธ -> ๊ต์ง‘ํ•ฉ
  • OUTER JOIN: ์™ธ๋ถ€์กฐ์ธ -> ํ•ฉ์ง‘ํ•ฉ
    • LEFT OUTER JOIN
    • RIGHT OUTER JOIN

๊ฐ ์กฐ์ธ๋“ค์„ ์˜ˆ์‹œ์™€ ํ•จ๊ป˜ ์•Œ์•„๋ณด๊ฒ ๋‹ค.

์ง์ ‘ JOIN์„ ์‚ฌ์šฉํ•˜๋ฉฐ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด

์•„๋ž˜์™€ ๊ฐ™์€ ํ…Œ์ด๋ธ” ๋‘๊ฐœ๋ฅผ ์ƒ์„ฑํ•˜์˜€๋‹ค.

example-tables

์ด์ œ ์ง์ ‘ ๊ฐ ์กฐ์ธ๋“ค์„ ์‹คํ–‰ํ•ด๋ณด์ž.

1.INNER JOIN

  • ๊ต์ง‘ํ•ฉ์— ํ•ด๋‹น๋˜๋ฉฐ ์กฐ๊ฑด์— ๋งž๋Š” ๊ณตํ†ต์ ์ธ ๋ถ€๋ถ„๋งŒ์„ SELECT ํ•œ๋‹ค.

example-inner-join

inner-join

SELECT A.ID, A.KOREAN_NAME, B.ENGLISH_NAME
FROM A INNER JOIN B
ON A.ID = B.ID;

2.OUTER JOIN

  • OUTER JOIN์€ ์กฐ์ธํ•˜๋Š” ์—ฌ๋Ÿฌํ…Œ์ด๋ธ”์—์„œ ํ•œ ์ชฝ์—๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๊ณ , ํ•œ ์ชฝ์—๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋‚ด์šฉ์„ ๋ชจ๋‘ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, ์กฐ๊ฑด์— ๋งž์ง€ ์•Š์•„๋„ ํ•ด๋‹นํ•˜๋Š” ํ–‰์„ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

OUTER JOIN์€

  • ๋ชจ๋“  ์ง‘ํ•ฉ์„ ์ถœ๋ ฅํ•˜๋Š” FULL OUTER JOIN
  • ์™ผ์ชฝ ์ง‘ํ•ฉ์— ์†ํ•˜๋Š” ๊ฒƒ๋“ค์„ ๋ชจ๋‘ ์ถœ๋ ฅํ•˜๋Š” FULL LEFT OUTER JOIN
  • ์˜ค๋ฅธ์ชฝ ์ง‘ํ•ฉ์— ์†ํ•˜๋Š” ๊ฒƒ๋“ค์„ ๋ชจ๋‘ ์ถœ๋ ฅํ•˜๋Š” FULL RIGHT OUTER JOIN ๋“ฑ์ด ์žˆ๋‹ค.

๊ทธ ๋ฐ–์—๋„ LEFT OUTER JOIN ์„ ํ†ตํ•ด ์ฐจ์ง‘ํ•ฉ (A-B) ์ง‘ํ•ฉ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๊ณ  ๋ฐ˜๋Œ€๋กœ RIGHT OUTER JOIN์„ ํ†ตํ•ด ์ฐจ์ง‘ํ•ฉ (B-A) ์ง‘ํ•ฉ๋„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

2-1 LEFT OUTER JOIN

  • ์กฐ์ธ๋ฌธ์˜ ์™ผ์ชฝ์— ์žˆ๋Š” ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ ์˜จ ํ›„ ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋งค์นญํ•˜๊ณ , ๋งค์นญ๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ NULL๋กœ ํ‘œ์‹œํ•œ๋‹ค.

example-left-join

left-join

SELECT A.ID, A.KOREAN_NAME, B.ENGLISH_NAME
FROM A LEFT OUTER JOIN B
ON A.ID = B.ID;

2-2 RIGHT OUTER JOIN

  • ์กฐ์ธ๋ฌธ์˜ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜จ ํ›„ ์™ผ์ชฝ์˜ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋งค์นญํ•˜๊ณ , ๋งค์นญ๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ NULL์„ ํ‘œ์‹œํ•œ๋‹ค.

example-right-join

right-join

SELECT B.ID, A.KOREAN_NAME, B.ENGLISH_NAME
FROM A RIGHT OUTER JOIN B
ON A.ID = B.ID;

2-3 FULL OUTER JOIN

  • LEFT OUTER JOIN ๊ณผ RIGHT OUTER JOIN์„ ํ•ฉ์นœ ๊ฒƒ์œผ๋กœ, ์–‘์ชฝ ๋ชจ๋‘ ์กฐ๊ฑด์ด ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๊นŒ์ง€ ๋ชจ๋‘ ๊ฒฐํ•ฉํ•ด ์ถœ๋ ฅํ•œ๋‹ค.

example-right-join

SELECT B.ID, A.KOREAN_NAME, B.ENGLISH_NAME
FROM A FULL OUTER JOIN B
ON A.ID = B.ID;

โ€ป MySQL ์—์„œ๋Š” FULL OUTER JOIN ์ด ์—†์œผ๋ฏ€๋กœ, LEFT OUTER JOIN ๊ณผ RIGHT OUTER JOIN ์„ UNION ํ•˜๋Š” ์‹์œผ๋กœ ํ•˜์—ฌ FULL OUTER JOIN ์„ ๋งŒ๋“ค์–ด ์ค€๋‹ค.

๋

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด๋ถ€ ์กฐ์ธ๊ณผ ์™ธ๋ถ€ ์กฐ์ธ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค.
๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ™

Reference

https://ko.wikipedia.org/wiki/Join_(SQL)

https://www.w3schools.com/sql/sql_join.asp

https://rh-cp.tistory.com/44

Written on June 9, 2021