์กฐ์ธ Join

Bleuยท2023๋…„ 9์›” 5์ผ

sql

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

join

๐Ÿ“ ์กฐ์ธ(JOIN) ์ด๋ž€

: 2๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์— ์žˆ๋Š” ์ปฌ๋Ÿผ๋“ค์„ ํ•ฉ์ณ์„œ ๊ฐ€์ƒ์˜ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์–ด ์กฐํšŒํ•˜๋Š” ๋ฐฉ์‹

  • ์†Œ์Šค ํ…Œ์ด๋ธ” : ๋‚ด๊ฐ€ ๋จผ์ € ์ฝ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ํ…Œ์ด๋ธ”. ์กฐํšŒ ํ•ด์•ผ ํ•˜๋Š” ์ฃผ ์ •๋ณด(main information) ํ…Œ์ด๋ธ”
  • ํƒ€๊ฒŸ ํ…Œ์ด๋ธ” : ์†Œ์Šค๋ฅผ ์ฝ์€ ํ›„ ์†Œ์Šค์— ์กฐ์ธํ•  ๋Œ€์ƒ์ด ๋˜๋Š” ํ…Œ์ด๋ธ”. ์กฐํšŒํ•˜๋Š” ์ฃผ ์ •๋ณด์˜ ๋ถ€๊ฐ€ ์ •๋ณด(sub information) ์ œ๊ณต ํ…Œ์ด๋ธ”

์กฐ์ธ ์—ฐ์‚ฐ : ๊ฐ ํ…Œ์ด๋ธ”์„ ์–ด๋–ป๊ฒŒ ํ•ฉ์น  ์ง€๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ

  • ์กฐ์ธ ์—ฐ์‚ฐ์— ๋”ฐ๋ฅธ ์กฐ์ธ์ข…๋ฅ˜
    โ†’ Equi join , non-equi join
  • ์กฐ์ธ ์ข…๋ฅ˜
    Inner Join
    โ†’ ์–‘์ชฝ ํ…Œ์ด๋ธ”์—์„œ ์กฐ์ธ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํ–‰๋“ค๋งŒ ํ•ฉ์นœ๋‹ค.
    Outer Join
    โ†’ ํ•œ์ชฝ ํ…Œ์ด๋ธ”์˜ ํ–‰๋“ค์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๊ณ  ๋‹ค๋ฅธ ์ชฝ ํ…Œ์ด๋ธ”์€ ์กฐ์ธ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํ–‰๋งŒ ํ•ฉ์นœ๋‹ค. ์กฐ์ธ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํ–‰์ด ์—†๋Š” ๊ฒฝ์šฐ NULL์„ ํ•ฉ์นœ๋‹ค.
    โ†’ ์ข…๋ฅ˜ : Left Outer Join, Right Outer Join, Full Outer Join
    Cross Join
    โ†’ ๋‘ ํ…Œ์ด๋ธ”์˜ ๊ณฑ์ง‘ํ•ฉ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

<๋ฐ์ดํ„ฐ ๊ฐ„์˜ ๋‹ค์ค‘์„ฑ>

  • ๊ทธ๋ž˜ํ”„ ๊ฐ„์˜ ์—ฐ๊ฒฐ ํ‘œ์‹œ

A: ์ž์‹ table/ B: ๋ถ€๋ชจ table

โ†’ ์ด ๋ฐฉํ–ฅ์ผ ๋•Œ

Aโ€”-0|โ€” B : A ์˜ ๊ฒƒ์ด B ์˜ ํ•œ ํ–‰ ๊ณผ๋งŒ ๊ด€๊ณ„๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์•„๋ฌด๊ฒƒ๊ณผ๋„ ๊ด€๊ณ„๊ฐ€ ์—†๋‹ค

Aโ€”โ€”โ€”0|<-B : 0 ๋˜๋Š” 1 ๋˜๋Š” n ๊ฐœ์™€์˜ ๊ด€๊ณ„๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

Aโ€”โ€”-|<- B : A์—์„œ์˜ ๋ฐ์ดํ„ฐ ํ•œ๊ฐœ๊ฐ€B์˜ ๋ฐ์ดํ„ฐ1๊ฐœ ๋˜๋Š” n๊ฐœ๊ณผ ๊ด€๊ณ„๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ

Aโ€”โ€”0โ€” B : A ์˜ ๋ฐ์ดํ„ฐ ํ•œ ๊ฐœ์™€B ์˜ ๋ฐ์ดํ„ฐ ์•„๋ฌด๊ฒƒ๋„์™€ ๊ด€๊ณ„๋งบ์ง€ ์•Š์Œ

โ† ์ด ๋ฐฉํ–ฅ์ผ ๋•Œ

A ->โ€”โ€”-B : ๋Š” ๋ถˆ๊ฐ€ ( ->โ€” ์ด ๋ชจ์–‘์€ ์–ด๋–ค ๊ฒƒ์ด ๊ฐ™์ด ์˜ค๋“  ๋ถˆ๊ฐ€ํ•˜๋‹ค - ๋ถ€๋ชจ table์ด ์ž์‹table์„ ์ฐธ์กฐ ํ•  ์ˆ˜๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์—)

A โ€”|โ€”โ€”-B : fk๊ฐ€ not null

A โ€”|โ€”โ€”-B : nullable column โ†’ null์„ ํ—ˆ์šฉํ•˜๋Š” column

โ†’ ์„ ์€ ๋งจ ์ฒ˜์Œ ์„ค๊ณ„ํ•  ๋•Œ ์„ค์ • ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ฌผ๋ฆฌ์ ์œผ๋กœ๋Š” ๋ง‰์„ ์ˆ˜ ์—†๋‹ค.

โ†’ - - - -๋Š” fk ๊ฐ€ pk์— ํฌํ•จ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

โ†’ โ€”โ€”-๋Š” fk๊ฐ€ pk์— ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ


๋ถ€๋ชจtable(PK) ๊ณผ ์ž์‹ table(FK)์€ ๊ด€๊ณ„๊ฐ€ 0(์ž์‹ table ์˜ FK ๊ฐ€ null์„ ํ—ˆ์šฉ) ์•„๋‹ˆ๋ฉด 1(์ž์‹ table์˜ FK๊ฐ€ not null)์ด๋‹ค.

  • | : ๊ด€๊ณ„์„ฑ 1
  • 0| : ๊ด€๊ณ„์„ฑ 0 ๋˜๋Š” ๊ด€๊ณ„์„ฑ 1

    {๋„์ฐฉํ•˜๋Š” ์ง€์ ์—๋‹ค๊ฐ€ ๋‹ค์ค‘์„ฑ ํ‘œ์‹œ}



Foreign key ์ œ์•ฝ ์กฐ๊ฑด

Foreign key (์™ธ๋ž˜ํ‚ค)
: ํ•œ ํ…Œ์ด๋ธ”์ด ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ column ๊ฐ’์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ
โ–ช ๋ถ€๋ชจ table - ์ฐธ์กฐ ๋˜๋Š” table (PK)
โ–ช ์ž์‹ table - ์ฐธ์กฐ ํ•˜๋Š” table (FK column )


ํ™”์‚ดํ‘œ ์ถœ๋ฐœ ์ง€์ ์ด ์ž์‹ table ๋ฐ›๋Š” ์• ๊ฐ€ ๋ถ€๋ชจ table
=> (์œ„์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ์ง์› table์ด ์ž์‹ table ์ด๊ณ  ๋ถ€์„œ table์ด ๋ถ€๋ชจtable ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Œ)

โ†’ ์ง์› ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ(row) ๋Š” ๋ถ€์„œ ํ…Œ์ด๋ธ” ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐ
โ†’ ๋ถ€์„œ ํ…Œ์ด๋ธ”์˜ row ๋Š” ์ง์› ํ…Œ์ด๋ธ” ์˜ ๋ฐ์ดํ„ฐ 0 ๊ฐœ ~N ๊ฐœ๊ฐ€ ์ฐธ์กฐ ํ•  ์ˆ˜ ์žˆ์Œ
โ†’ ์ง์› ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ ํ•˜๋‚˜๋Š” ์ง์› ํ…Œ์ด๋ธ” ์˜ ๋ฐ์ดํ„ฐ ํ•˜๋‚˜๋ฅผ ์ƒ์‚ฌ_ID ๋กœ ์ฐธ์กฐ

primary key : ๊ฐ ํ–‰์„ ๊ตฌ๋ถ„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ ์œ ํ•œ key


  • ๊ธฐ๋ณธ ๊ตฌ๋ฌธ
    : CONSTRAINT ์ œ์•ฝ์กฐ๊ฑด์ด๋ฆ„ FOREIGN KEY(์ปฌ๋Ÿผ) REFERECES๋ถ€๋ชจํ…Œ์ด๋ธ”(PK ์ปฌ๋Ÿผ) [ON ์„ค์ •]

    โ†’ ์ฐธ์กฐ์ปฌ๋Ÿผ์€ PK ๊ฑฐ๋‚˜ Index ์„ค์ •๋œ ์ปฌ๋Ÿผ์ด์–ด์•ผ ํ•œ๋‹ค

์ž์‹ ํ…Œ์ด๋ธ”๋กœ๋ถ€ํ„ฐ ์ฐธ์กฐ ๋‹นํ•˜๋Š” ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์˜ row ๋Š” ์‚ญ์ œ ํ•  ์ˆ˜ ์—†์Œ


CASCADE DELETE

  • FOREIGN KEY ์„ค์ • ์‹œ ON DELETE CASCADE ์„ค์ •
    โ†’ ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์˜ ์ฐธ์กฐ ROW ์‚ญ์ œ ์‹œ ์ž์‹ ํ…Œ์ด๋ธ”์˜ ์ฐธ์กฐ ROW ์‚ญ์ œ
    CONSTRAINT ์ œ์•ฝ์กฐ๊ฑด์ด๋ฆ„ FOREIGN KEY(์ปฌ๋Ÿผ) REFERECES ๋ถ€๋ชจํ…Œ์ด๋ธ”(PK ์ปฌ๋Ÿผ) ON DELETE CASCADE

  • FOREIGN KEY ์„ค์ • ์‹œ ON DELETE SET NULL ์„ค์ •
    โ†’ ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์˜ ์ฐธ์กฐ ROW ์‚ญ์ œ ์‹œ ์ฐธ์กฐ ํ•˜๋Š” ์ž์‹ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ ๊ฐ’์„ NULL ๋กœ ์„ค์ •
    CONSTRAINT ์ œ์•ฝ์กฐ๊ฑด์ด๋ฆ„ FOREIGN KEY(์ปฌ๋Ÿผ) REFERECES ๋ถ€๋ชจํ…Œ์ด๋ธ”(PK ์ปฌ๋Ÿผ) ON DELETE SET NULL


ON ์„ค์ •

๊ธฐ๋ณธ์ ์œผ๋กœ ์ž์‹ ํ…Œ์ด๋ธ”์—์„œ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์œผ๋ฉด ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œ ์ˆ˜์ •ํ•˜์ง€ ๋ชปํ•จ

โ†’ Foreign key ์ปฌ๋Ÿผ ์„ค์ •ํ•  ๋•Œ ์ด๊ฒƒ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋•Œ on ์„ค์ •์„ ์‚ฌ์šฉ

ON DELETE|UPDATE ์ฒ˜๋ฆฌ๋ฐฉ์‹

ON DELETE:
์ฐธ์กฐํ•˜๋Š” ๋ถ€๋ชจํ…Œ์ด๋ธ”์˜ ํ–‰์ด ์‚ญ์ œ ๋˜์—ˆ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ์ง€ ์„ค์ •
ON UPDATE:
์ฐธ์กฐํ•˜๋Š” ๋ถ€๋ชจํ…Œ์ด๋ธ”์˜ ์ฐธ์กฐ ์ปฌ๋Ÿผ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ์ง€ ์„ค์ •

์ฒ˜๋ฆฌ๋ฐฉ์‹

  • CASCADE
    : ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œ ์ˆ˜์ •ํ•˜๋ฉด , ๊ทธ ํ–‰์„ ์ฐธ์กฐํ•˜๋Š” ์ž์‹ํ…Œ์ด๋ธ”์˜ ํ–‰๋“ค๋„ ๊ฐ™์ด ์‚ญ์ œ ์ˆ˜์ •๋จ

  • SET NULL
    : ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œ ์ˆ˜์ •ํ•˜๋ฉด , ๊ทธ ํ–‰์„ ์ฐธ์กฐํ•˜๋Š” ์ž์‹ํ…Œ์ด๋ธ”์˜ foreign key ์ปฌ๋Ÿผ์˜ ๊ฐ’์„ NULL ๋กœ ๋ณ€๊ฒฝ


Table drop์‹œ foreign key ์ œ์•ฝ์กฐ๊ฑด ์ œ๊ฑฐ

  • ๋ถ€๋ชจ ํ…Œ์ด๋ธ” DROP ์ „์— MySQL ์˜ foreign key ์ ์šฉ์ด ์•ˆ๋˜๋„๋ก ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค
    set foreign_key_ckecks = 0; -- foreign key ํ•ด์ œ ์„ค์ •
    DROP table ์‚ญ์ œํ• ํ…Œ์ด๋ธ”
    set foreign_key_ckecks = 1; -- foreign key ์ ์šฉ ์„ค์ •
    โ†’ ๋‚˜์ค‘์— ๋‹ค์‹œ 1๋กœ ๋ฐ”๊ฟ”๋„ ์—†์–ด์กŒ๋˜ foreign key ์„ค์ •์ด ๋‹ค์‹œ ์ƒ๊ธฐ์ง€๋Š” ์•Š์Œ


JOIN ๊ฐœ๋…

JOIN: ๊ด€๊ณ„์žˆ๋Š” ๋‘ ๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ ํ•ฉ์ณ์„œ (JOIN) ์กฐํšŒ (SELECT) ํ•˜๋Š” ๊ฒƒ
โ–ช์กฐ์ธํ•  ๋‘ ํ…Œ์ด๋ธ”์˜ ํŠน์ • column๋“ค์˜ ๊ฐ’๋“ค์ด ๊ฐ™์€ ํ–‰๋ผ๋ฆฌ ํ•ฉ์นจ

JOIN์—ฐ์‚ฐ

: ์–ด๋–ค ํ–‰๋“ค์˜ ๊ฐ’์ด ๊ฐ™์€ ๊ฒƒ๋ผ๋ฆฌ ํ•ฉ์น  ๊ฒƒ์ธ์ง€ ์„ค์ •ํ•˜๋Š” ๊ตฌ๋ฌธ

โ†’ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ถ€๋ชจ table๊ณผ ์ž์‹ table์„ ์—ฐ๊ฒฐํ•ด์„œ ์กฐํšŒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋ฉฐ ์ด ๊ฒฝ์šฐ ๋ถ€๋ชจ tabled ์˜ PK(primary key) ์™€ ์ž์‹ table์˜ FK(foreign key) column ์˜ ๊ฐ’์ด ๊ฐ™์€ ํ–‰๋“ค์„ JOIN ํ•œ๋‹ค

ex)

์นดํ‹ฐ์…˜ ๊ณฑ (Cartesian Product)

: ๋‘ ํ…Œ์ด๋ธ”์˜ ์ „์ฒด ํ–‰๋“ค์„ ํ•ฉ์น  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์กฐํ•ฉ์ด ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒฝ์šฐ
โ–ช Nํ–‰ , M ํ–‰ ์˜ ๋‘ ํ…Œ์ด๋ธ” ์กฐ์ธ์‹œ N x M ๊ฐœ์˜ ํ–‰์ด ์ƒ์„ฑ๋จ

  • ์ด์œ 
    โ†’ ์กฐ์ธ ์—ฐ์‚ฐ์„ ์ƒ๋žตํ•œ ๊ฒฝ์šฐ (CROSS JOIN)
    โ†’ ์กฐ์ธ ์—ฐ์‚ฐ์ด ์ž˜๋ชป๋œ ๊ฒฝ์šฐ

์กฐ์ธ ์ข…๋ฅ˜

INNER JOIN
โ–ช ์กฐ์ธ ์—ฐ์‚ฐ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํ–‰๋“ค์„ ํ•ฉ์นœ๋‹ค

OUTER JOIN
โ–ช ์กฐ์ธ ์—ฐ์‚ฐ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š” ํ–‰๋“ค๋„ ํฌํ•จํ•ด์„œ ํ•ฉ์นœ๋‹ค
โ†’ LEFT OUTER JOIN
โ†’ RIGHT OUTER JOIN
โ†’ FULL OUTER JOIN


INNER JOIN

inner join์ด๋ž€...

: ์กฐ์ธ ์—ฐ์‚ฐ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํ–‰๋ผ๋ฆฌ ๋งŒ ํ•ฉ์น˜๋Š” JOIN

inner๋Š” ์ƒ๋žต ๊ฐ€๋Šฅ

โ†’ ๋ถ€์„œ_ID ๊ฐ€ 300 ์ธ ๋ถ€์„œ๋Š” ์ง์› ํ…Œ์ด๋ธ”์˜ ์–ด๋–ค ํ–‰ ๊ณผ๋„ ๊ด€๊ณ„๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์กฐ์ธ ๋Œ€์ƒ ํฌํ•จ๋˜์ง€ ์•Š์Œ

  • ๊ตฌ๋ฌธ
SELECT ์ปฌ๋Ÿผ์„ ํƒ
FROM ํ…Œ์ด๋ธ” _1 INNER JOIN ํ…Œ์ด๋ธ” _2 ON ์กฐ์ธ์—ฐ์‚ฐ   -- INNER ์ƒ๋žต๊ฐ€๋Šฅ
     		 [INNER JOIN ํ…Œ์ด๋ธ” _3 ON ์กฐ์ธ์—ฐ์‚ฐ

โ†’์œ„์˜ ๊ฒฝ์šฐ์—๋Š”

SELECT b.๋ถ€์„œ _ID, ๋ถ€์„œ์ด๋ฆ„, e.์ง์›์ด๋ฆ„
FROM ๋ถ€์„œ b INNER JOIN ์ง์› e ON b. ์†Œ์†๋ถ€์„œ e. ๋ถ€์„œ _ID

ex)

-- ์ง์›์˜ ID(emp.emp_id)๊ฐ€ 100์ธ ์ง์›์˜ ์ง์›_ID(emp.emp_id), ์ด๋ฆ„(emp.emp_name), ์ž…์‚ฌ๋…„๋„(emp.hire_date), ์†Œ์†๋ถ€์„œ์ด๋ฆ„(dept.dept_name)์„ ์กฐํšŒ.

select e.emp_name as "์ง์›์ด๋ฆ„", 
		e.hire_date as "์ž…์‚ฌ์ผ", 
        d.dept_name as "๋ถ€์„œ๋ช…"
from emp e join dept d on e.dept_id = d.dept_id
where e.emp_id = 100;

ex)

-- ๋ถ€์„œ_ID(dept.dept_id)๊ฐ€ 30์ธ ๋ถ€์„œ์˜ ์ด๋ฆ„(dept.dept_name), ์œ„์น˜(dept.loc), ๊ทธ ๋ถ€์„œ์— ์†Œ์†๋œ ์ง์›์˜ ์ด๋ฆ„(emp.emp_name)์„ ์กฐํšŒ.
select d.dept_id, 
	   d.dept_name, 
       d.loc, 
       e.emp_name
from dept d join emp e on d.dept_id = e.dept_id
where d.dept_id = 30;

Self ์กฐ์ธ

: ๋ฌผ๋ฆฌ์ ์œผ๋กœ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์„ ๋‘๊ฐœ์˜ ํ…Œ์ด๋ธ”์ฒ˜๋Ÿผ ์กฐ์ธํ•˜๋Š” ๊ฒƒ.

ex)

-- ์ง์› ID๊ฐ€ 101์ธ ์ง์›์˜ ์ง์›์˜ ID(emp.emp_id), ์ด๋ฆ„(emp.emp_name), ์ƒ์‚ฌ์ด๋ฆ„(emp.emp_name)์„ ์กฐํšŒ

select e.emp_id,
	   e.emp_name as "์ง์› ์ด๋ฆ„",
       m.emp_name as "์ƒ์‚ฌ ์ด๋ฆ„"
from emp e join emp m on e.mgr_id = m.mgr_id
where e.emp_id = 101;

OUTER JOIN

outer join์ด๋ž€...

= ๋ถˆ์ถฉ๋ถ„ ์กฐ์ธ

OUTER ๋Š” ์ƒ๋žต ๊ฐ€๋Šฅ

  • ์กฐ์ธ์—ฐ์‚ฐ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š” ํ–‰๋„ ํฌํ•จํ•ด์„œ ํ•ฉ์นจ

Source Table

โ€“ ์กฐ์ธ์‹œ ์กฐํšŒ ๊ธฐ์ค€์ด ๋˜๋Š” ํ…Œ์ด๋ธ”๋กœ ์กฐํšŒํ•˜๋ ค๋Š” ์ฃผ (main) ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ…Œ์ด๋ธ”

Target Table

โ€“ ์กฐ์ธ์‹œ Source table ๋ฐ์ดํ„ฐ์˜ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ…Œ์ด๋ธ”๋กœ ๋ณด์กฐ (sub) ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ…Œ์ด๋ธ”

โ–ช ์กฐ์ธ ์‹œ Source ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ ํ–‰์€ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๊ณ  Target table ์˜ ๋ฐ์ดํ„ฐ ํ–‰์€ ์กฐ์ธ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํ–‰๋งŒ ๋‚˜์˜ค๋„๋ก ํ•จ

< Outer Join ์ข…๋ฅ˜ >

  • LEFT OUTER JOIN
    : Source ํ…Œ์ด๋ธ”์ด ์™ผ์ชฝ์— ์„ ์–ธํ•œ ํ…Œ์ด๋ธ”์ธ ๊ฒฝ์šฐ์˜ outer join

    ๊ตฌ๋ฌธ์ƒ ์†Œ์Šค ํ…Œ์ด๋ธ”์ด ์™ผ์ชฝ


โ†’ ๊ตฌ๋ฌธ:

SELECT ์ปฌ๋Ÿผ์„ ํƒ
FROM ํ…Œ์ด๋ธ” _1 LEFT [OUTER] JOIN ํ…Œ์ด๋ธ” _2 ON ์กฐ์ธ์—ฐ์‚ฐ -- OUTER ์ƒ๋žต๊ฐ€๋Šฅ
-> Source table: ํ…Œ์ด๋ธ” _1, Target table: ํ…Œ์ด๋ธ” _2

๋”ฐ๋ผ์„œ ์œ„ ๊ทธ๋ฆผ์˜ ๊ฒฝ์šฐ

SELECT b. ๋ถ€์„œ _ID, ๋ถ€์„œ์ด๋ฆ„, 
		e.์ง์›์ด๋ฆ„
FROM ๋ถ€์„œ b LEFT OUTER JOIN ์ง์› e ON b. ์†Œ์†๋ถ€์„œ e. ๋ถ€์„œ _ID

  • RIGHT OUTER JOIN
    : Source ํ…Œ์ด๋ธ”์ด ์˜ค๋ฅธ์ชฝ์— ์„ ์–ธํ•œ ํ…Œ์ด๋ธ”์ธ ๊ฒฝ์šฐ์˜ outer join

    ๊ตฌ๋ฌธ์ƒ ์†Œ์Šค ํ…Œ์ด๋ธ”์ด ์˜ค๋ฅธ์ชฝ


โ†’๊ตฌ๋ฌธ:
SELECT ์ปฌ๋Ÿผ์„ ํƒ
FROM ํ…Œ์ด๋ธ” _1 RIGHT OUTER JOIN ํ…Œ์ด๋ธ” _2 ON ์กฐ์ธ์—ฐ์‚ฐ -- OUTER ์ƒ๋žต๊ฐ€๋Šฅ
-> Source table: ํ…Œ์ด๋ธ” _2, Target table: ํ…Œ์ด๋ธ” _1

๋”ฐ๋ผ์„œ ์œ„ ๊ทธ๋ฆผ์˜ ๊ฒฝ์šฐ

SELECT b. ๋ถ€์„œ _ID, ๋ถ€์„œ์ด๋ฆ„,
		e.์ง์›์ด๋ฆ„
FROM ๋ถ€์„œ b RIGHT OUTER JOIN ์ง์› e ON b. ์†Œ์†๋ถ€์„œ e. ๋ถ€์„œ _ID

  • FULL OUTER JOIN
    : ์–‘์ชฝ์— ์„ ์–ธํ•œ ํ…Œ์ด๋ธ”์ด ๋ชจ๋‘ Source table ์ธ ๊ฒฝ์šฐ์˜ outer join
    > left join, right join select ๋ฌธ์„ union ํ•˜์—ฌ ๊ตฌํ˜„
    >  MySQL ์€ ์ง€์› ์•ˆํ•จ

    ๋‘˜๋‹ค ์†Œ์Šค ํ…Œ์ด๋ธ”

์ด ๊ทธ๋ฆผ์˜ ๊ฒฝ์šฐ

SELECT b. ๋ถ€์„œ _ID, ๋ถ€์„œ์ด๋ฆ„ , ์ง์›์ด๋ฆ„
FROM ๋ถ€์„œ b LEFT OUTER JOIN ์ง์› e ON b. ์†Œ์†๋ถ€์„œ e. ๋ถ€์„œ _ID
UNION
SELECT b. ๋ถ€์„œ _ID, ๋ถ€์„œ์ด๋ฆ„ , ์ง์›์ด๋ฆ„
FROM ๋ถ€์„œ b RIGHT OUTER JOIN ์ง์› e ON b. ์†Œ์†๋ถ€์„œ e. ๋ถ€์„œ _

๐Ÿ“ ๋ช…์‹ฌ

inner join, outer join์ค‘ ๋ฌด์—ˆ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•  ์ง€ ๋ชจ๋ฅผ ๊ฒฝ์šฐ outer join์‚ฌ์šฉ
โ†’ inner ๋Š” ์•ˆ ๋‚˜์˜ฌ ๊ฒฝ์šฐ๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฐจ๋ผ๋ฆฌ ๋งŽ์ด ๋ณด๋Š”๊ฒƒ์ด ๋‚ฌ๋‹ค






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