[Oracle] ๐Ÿ’พ Join (์กฐ์ธ)

๐Ÿ’ก ๊ฐ„๋‹จ ๊ฐœ๋… ์ •๋ฆฌ

๊ธฐ๋ณธ ํ‚ค (Primary Key)
ํ–‰์„ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ค€์ด ๋˜๋Š” ์ปฌ๋Ÿผ์ด๋‹ค.
ex) ์ฃผ๋ฏผ ๋“ฑ๋ก ๋ฒˆํ˜ธ, ํ•™๋ฒˆ, ํœด๋Œ€ํฐ ๋ฒˆํ˜ธ, ์ฃผ๋ฌธ ๋ฒˆํ˜ธ ๋“ฑ

์™ธ๋ž˜ ํ‚ค (Foreign Key)
๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์ปฌ๋Ÿผ์œผ๋กœ, ์„œ๋กœ ๊ด€๋ จ๋œ ๋‘˜ ์ด์ƒ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์—ฐ๊ฒฐ ๊ณ ๋ฆฌ๊ฐ€ ๋œ๋‹ค. 1 : N ๊ด€๊ณ„์—์„œ๋Š” 1 ์ชฝ์˜ ๊ธฐ๋ณธ ํ‚ค๋ฅผ N ์ชฝ์—์„œ ์™ธ๋ž˜ ํ‚ค๋กœ ์ฐธ์กฐํ•œ๋‹ค. ์ด๋•Œ N ์ชฝ์—์„œ๋Š” 1 ์ชฝ์— ์—†๋Š” ๊ฐ’์€ ์ž…๋ ฅํ•  ์ˆ˜ ์—†๋‹ค. (๋‹จ null ๊ฐ’์€ ์ž…๋ ฅ ๊ฐ€๋Šฅํ•˜๋‹ค.)
ex) ์‚ฌ์› ํ…Œ์ด๋ธ”์ด ๋ถ€์„œ ํ…Œ์ด๋ธ”์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค. ๋ถ€์„œ ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ํ‚ค์ธ ๋ถ€์„œ ๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์› ํ…Œ์ด๋ธ”์ด ์™ธ๋ž˜ ํ‚ค๋กœ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋•Œ ์‚ฌ์› ํ…Œ์ด๋ธ”์˜ ๋ถ€์„œ ๋ฒˆํ˜ธ์— ๋ถ€์„œ ํ…Œ์ด๋ธ”์˜ ๋ถ€์„œ ๋ฒˆํ˜ธ์— ์—†๋Š” ๊ฐ’์„ ์ž…๋ ฅํ•  ์ˆ˜ ์—†๋‹ค.

Join (์กฐ์ธ)


๋‘˜ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๋‘ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•˜๋ ค๋ฉด ๋‘ ํ…Œ์ด๋ธ” ์‚ฌ์ด์—์„œ ๊ณต์œ ํ•˜๋Š” ์ปฌ๋Ÿผ์ด ํ•„์š”ํ•˜๋‹ค.

๊ทธ๋ƒฅ select * from table1, table2; ์ด๋ ‡๊ฒŒ ๊ฒ€์ƒ‰ํ•˜๋ฉด ์•ˆ ๋˜๋Š” ๊ฒƒ์ผ๊นŒ? ์˜ˆ์‹œ์ฒ˜๋Ÿผ ์–ด๋–ค ์กฐ๊ฑด ์—†์ด ๋‘˜ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์„ ๊ฒ€์ƒ‰ํ•˜๋ฉด ํ–‰์˜ ๊ฐœ์ˆ˜๋Š” ๋‹จ์ˆœ ๊ฒฐํ•ฉ(Cross Join)ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด table1์˜ ํ–‰์ด 5๊ฐœ, table2์˜ ํ–‰์ด 3๊ฐœ๋ผ๋ฉด select * from table1, table2;๋Š” 15๊ฐœ์˜ ํ–‰์ด ์ถœ๋ ฅ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ์กฐ์ธ์„ ํ•  ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ ์กฐ๊ฑด์„ ๊ฑธ์–ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.


Join์€ ์™œ ํ•„์š”ํ•œ๊ฐ€?


ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์— ๋งŽ์€ ์ •๋ณด๊ฐ€ ๋“ค์–ด๊ฐˆ์ˆ˜๋ก ์ด์ƒ ํ˜„์ƒ(anormaly)์ด ๋ฐœ์ƒํ•  ํ™•๋ฅ ์ด ๋†’์•„์ง„๋‹ค. ๋”ฐ๋ผ์„œ ํ…Œ์ด๋ธ”์„ ๋ถ„๋ฆฌํ•˜๋Š” ์ •๊ทœํ™”๋ฅผ ๊ฑฐ์น˜๊ณ  ๋‚˜๋ฉด ํ…Œ์ด๋ธ”์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜๊ณ  ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์— ๊ฑธ์ณ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ด์งˆ ์ˆ˜๋ฐ–์— ์—†๋‹ค.


Join์˜ ์ข…๋ฅ˜


  • Inner Join (๋‚ด๋ถ€ ์กฐ์ธ)
  • Equi Join (๋“ฑ๊ฐ€ ์กฐ์ธ)
  • Non-equi Join (๋น„๋“ฑ๊ฐ€ ์กฐ์ธ)
  • Outer Join (์™ธ๋ถ€ ์กฐ์ธ)
  • Self Join

Inner Join (๋‚ด๋ถ€ ์กฐ์ธ)


๋‘ ํ…Œ์ด๋ธ”์˜ ์กฐ์ธ ์กฐ๊ฑด์ด ์„ฑ๋ฆฝํ•˜๋Š” ์ปฌ๋Ÿผ๋งŒ์„ ์ถœ๋ ฅํ•œ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•ด ๋‘ ํ…Œ์ด๋ธ”์˜ ๊ต์ง‘ํ•ฉ๋งŒ์„ ์ถœ๋ ฅํ•œ๋‹ค.


Equi Join (๋“ฑ๊ฐ€ ์กฐ์ธ)


์กฐ์ธ ์กฐ๊ฑด์ด ๊ฐ™๋‹ค(=)์ธ ์กฐ์ธ์„ ๋งํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ์ค‘๋ณต๋˜๋Š” ๊ณตํ†ต ์ปฌ๋Ÿผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ์‹œ๋ฅผ ์‚ดํŽด ๋ณด์ž.


Non-equi Join (๋น„๋“ฑ๊ฐ€ ์กฐ์ธ)


์กฐ์ธ ์กฐ๊ฑด์œผ๋กœ ๊ฐ™๋‹ค(=)๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•˜๋Š” ์กฐ๊ฑด์‹์œผ๋กœ ์กฐ์ธํ•˜๋Š” ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค. ์ฃผ๋กœ emp ํ…Œ์ด๋ธ”๊ณผ salgrade๋ฅผ ๋น„๋“ฑ๊ฐ€ ์กฐ์ธ์œผ๋กœ ์กฐ์ธํ•œ๋‹ค.

์˜ˆ์‹œ๋ฅผ ์‚ดํŽด ๋ณด์ž.


Outer Join (์™ธ๋ถ€ ์กฐ์ธ)


์กฐ์ธ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š” ํ–‰๋„ ๋ชจ๋‘ ์ถœ๋ ฅํ•˜๊ฒŒ๋” ํ•˜๋Š” ์กฐ์ธ ๋ฐฉ์‹์ด๋‹ค.

์˜ˆ์‹œ๋ฅผ ๋“ค์–ด ๋ณด์ž. ๋‹ค์Œ๊ณผ ๊ฐ™์€ professor ํ…Œ์ด๋ธ”๊ณผ student ํ…Œ์ด๋ธ”์ด ์žˆ๋‹ค.

ํ•™์ƒ ๋ช…๋‹จ์„ ๋ชจ๋‘ ์ถœ๋ ฅํ•˜๋ฉด์„œ, ์ง€๋„ ๊ต์ˆ˜๋ฅผ ํ•จ๊ป˜ ์ถœ๋ ฅํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์ด๋•Œ ๋‚ด๋ถ€ ์กฐ์ธ์„ ํ•˜๊ฒŒ ๋˜๋ฉด ์ง€๋„ ๊ต์ˆ˜๊ฐ€ ์—†๋Š” ํ•™์ƒ๋“ค์€ ์ถœ๋ ฅ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋Ÿด ๋•Œ ์™ธ๋ถ€ ์กฐ์ธ์„ ์‚ฌ์šฉํ•œ๋‹ค.

select s.name, p.name from student s left outer join professor p on p.profno=s.profno;

ํ•™์ƒ๊ณผ ๊ต์ˆ˜ ๋ชจ๋‘ ๋ˆ„๋ฝ ์—†์ด ์ถœ๋ ฅํ•˜๋ ค๊ณ  ํ•  ๋•Œ๋Š” full outer join์„ ์‚ฌ์šฉํ•œ๋‹ค.

select p.name, s.name from professor p full outer join student s on p.profno=s.profno;


Self Join


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

์˜ˆ์‹œ๋ฅผ ๋“ค์–ด ๋ณด์ž. ๋‹ค์Œ๊ณผ ๊ฐ™์€ emp ํ…Œ์ด๋ธ”์ด ์žˆ๋‹ค.

์‚ฌ์›์˜ ๊ด€๋ฆฌ์ž๋Š” ๊ด€๋ฆฌ์ž์˜ ์‚ฌ๋ฒˆ์œผ๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ๋‹ค. SMITH์˜ ๊ด€๋ฆฌ์ž(MGR)์ธ 7902๋ผ๋Š” ์‚ฌ๋ฒˆ์„ ๊ฐ–๊ณ  ์žˆ๋Š” ์‚ฌ์›์€ FORD์ด๋‹ค. FORD๋ผ๋Š” ๊ด€๋ฆฌ์ž์˜ ์ด๋ฆ„์„ SMITH์˜ ํ–‰์— ํ•จ๊ป˜ ์ถœ๋ ฅํ•˜๊ณ ์ž ํ•  ๋•Œ ์…€ํ”„ ์กฐ์ธ์„ ํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ