[SQL] join: ์™ธ๋ถ€ ์กฐ์ธ

[์›๋ณธ ๋งํฌ]

๋‚ด๋ถ€ ์กฐ์ธ์ด ๋ฌด์กฐ๊ฑด ์ผ์น˜ํ•˜๋Š” ํ–‰๋งŒ ํ•ฉ์ณ์„œ ๋นˆํ‹ˆ์ด ์—†๊ฒŒ ํ–ˆ๋‹ค๋ฉด, ์™ธ๋ถ€์กฐ์ธ์€ ์กฐ๊ฑด์ด ์ผ์น˜ํ•˜์ง€ ์•Š์•„๋„ ํ•ฉ์ณ์„œ ๋นˆํ‹ˆ์ด ์ข€ ์ƒ๊ธฐ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

๊ทผ๋ฐ ์™ธ๋ถ€ ์กฐ์ธ์—๋„ ์ข…๋ฅ˜๊ฐ€ 3๊ฐ€์ง€๋‚˜ ์žˆ๋‹ค.
์กฐ์ธ ๊ตฌ๋ฌธ์—์„œ from ์˜ค๋ฅธ์ชฝ์˜ ํ…Œ์ด๋ธ”์„ A, join ์˜ค๋ฅธ์ชฝ์˜ ํ…Œ์ด๋ธ”์„ B๋ผ๊ณ  ํ•˜๋ฉด.
A๋ฅผ ์šฐ์„ ์œผ๋กœ ์ฑ„์šฐ๊ณ  B๋งŒ ๋นˆ์นธ์ด ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์™ผ์ชฝ(left) ์™ธ๋ถ€์กฐ์ธ,
B๋ฅผ ์šฐ์„ ์œผ๋กœ ์ฑ„์šฐ๋Š” ๊ฒƒ์ด ์˜ค๋ฅธ์ชฝ(right) ์™ธ๋ถ€์กฐ์ธ์ด๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋ฌด์‹ํ•˜๊ฒŒ ๊ฐ–๋‹ค๋ฐ•๋Š” ์™„์ „(full) ์™ธ๋ถ€์กฐ์ธ์ด ์žˆ๋‹ค.

์˜ˆ์‹œ๋ฅผ ๋ณด๋Š” ๊ฒŒ ์ดํ•ด๊ฐ€ ๋น ๋ฅด๊ฒ ๋‹ค.

ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์€ postgreSQL์ด๋‹ค.
๊ทธ๋ฆฌ๊ณ  ํ…Œ์ด๋ธ” A, B์˜ ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

A๋Š” ์ด๋ฆ„, ์ง์—… ์ปฌ๋Ÿผ์„ ๊ฐ€์ง€๋Š” Worker๋ผ๋Š” ํ…Œ์ด๋ธ”์ด๋‹ค.

B๋Š” ์ด๋ฆ„, ์ข…๊ต์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๋Š” ์ข…๊ต์ธ ํ…Œ์ด๋ธ”์ด๋‹ค.



์™ผ์ชฝ ์กฐ์ธ

select ... from A left outer join B on ์กฐ๊ฑด์‹
outer ํ‚ค์›Œ๋“œ๋Š” ์ƒ๋žต์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

from์— ๋ถ™๋Š” ์™ผ์ชฝ ํ…Œ์ด๋ธ”์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์„ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
์™ผ์ชฝ ํ…Œ์ด๋ธ”์€ ์ „๋ถ€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๊ฐ€ ๋˜๊ณ , ์กฐ๊ฑด์‹์ด ์ผ์น˜ํ•˜๋Š” ๋ถ€๋ถ„์— ํ•œํ•ด์„œ๋งŒ ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์„ ๊ฐ–๋‹ค๋ถ™ํžŒ๋‹ค.
์ผ์น˜ํ•˜๋Š” ๊ฒƒ์ด ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ƒฅ null์ด ๋“ค์–ด๊ฐ„๋‹ค.
์•„๋ž˜์™€ ๊ฐ™์ด.



์˜ค๋ฅธ์ชฝ ์กฐ์ธ

select ... from A right outer join B on ์กฐ๊ฑด์‹
outer ํ‚ค์›Œ๋“œ๋Š” ์ƒ๋žต์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
๊ทธ๋ƒฅ ์™ผ์ชฝ ์กฐ์ธ๊ณผ ๋ฐ˜๋Œ€๋กœ, ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์„ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ ํ…Œ์ด๋ธ”์„ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ƒฅ ์œ„์น˜๋งŒ ๋ฐ”๋€Œ๋Š” ํ‘œํ˜„์˜ ์ฐจ์ด์ง€, ๊ธฐ๋Šฅ์€ ๊ฑฐ์˜ ๊ฐ™๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

๊ทธ๋ ‡๋‹ค.



์™„์ „ ์™ธ๋ถ€์กฐ์ธ

select ... from A full outer join B on ์กฐ๊ฑด์‹
์ด๊ฑด ์ผ์น˜ํ•˜๋Š”๊ฑด ์ผ๋‹จ ํ•˜๋‚˜์˜ Row๋กœ ์—ฐ๊ฒฐํ•˜๊ณ , ๋‚˜๋จธ์ง€๋Š” ๋ฌด์‹ํ•˜๊ฒŒ ๊ฐ–๋‹ค๋ฐ•๋Š”๋‹ค.
์ด๋ ‡๊ฒŒ ๋ง์ด๋‹ค.