์กฐ์ธ(JOIN)์ SQL ์์์ ๊ฐ์ฅ ๋ง์ด ์ฐ์ด๋ ๋ฌธ ์ค ํ๋์ ๋๋ค. ์ด๋ฏธ ํด๋น ๊ฐ๋ ์ ๊ณต๋ถํ์ จ๋ค๋ฉด, ์ฌ๋ฌ๋ถ์ ์ด๋ฏธ ์กฐ์ธ์ด 2๊ฐ ํน์ ๊ทธ ์ด์์ ํ ์ด๋ธ์ 1๊ฐ์ ๊ณตํต๋ ๋ฐ์ดํฐ ์ธํธ๋ก ํฉ์น ๋ ์ฌ์ฉ๋๋ค๋ ๊ฒ์ ์์ค ๊ฒ๋๋ค. ์ด ๊ธ์์๋ ์กฐ์ธ ์ค์์๋ ๋ ํนํ ์ข ๋ฅ์ ์กฐ์ธ์ ์ดํด๋ณด๊ณ ์ ํฉ๋๋ค. ๋ฐ๋ก ๋์ผํ ํ ์ด๋ธ 1๊ฐ๋ฅผ ๊ทธ ์์ ์๊ฒ ํฉ์น๋, ์ฆ ๋๊ฐ์ ํ ์ด๋ธ์ ํฉ์น๋ ์ ํ ์กฐ์ธ์ ์ดํด๋ณผ ๊ฒ์ ๋๋ค. ์ ํ ์กฐ์ธ์ ์ ํ์ํ ๊ฒ์ผ๊น์? ๊ทธ๋ฆฌ๊ณ ์ ํ ์กฐ์ธ์ ์ด๋ ํ ๊ฒฝ์ฐ์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒ์ผ๊น์? ๊ทธ๋ฆฌ๊ณ SQL ๋ฌธ์์๋ ์ด๋ค ์์ผ๋ก ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํด์ผ ํ ๊น์? ์ง๊ธ๋ถํฐ ์ดํด๋ณด๋๋ก ํฉ์๋ค.

JOINs : ๊ฐ๋ ๋ค์ ์ง๊ณ ๊ฐ๊ธฐ
2๊ฐ์ ํ ์ด๋ธ์ด ์๋ค๊ณ ๊ฐ์ ํ์ ๋, ๊ณตํต๋ ์ด์ ํ์ฉํด 2๊ฐ์ ํ ์ด๋ธ์ ํฉ์น๋ ๊ฒ์ ์ฐ๋ฆฌ๋ ์กฐ์ธ์ด๋ผ๊ณ ๋งํฉ๋๋ค. ์ด๋ฅผ ์ดํดํ๊ธฐ ์ํด ์๋ ๊ทธ๋ฆผ์ ์ดํด๋ณด๋๋ก ํฉ์๋ค.

ํ์ฌ ์ผ์ชฝ์๋ customer ํ
์ด๋ธ์ด ์๊ณ , ์ค๋ฅธ์ชฝ์๋ city ํ
์ด๋ธ์ด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๋ ํ
์ด๋ธ์ city_id ๋ผ๋ ๊ณตํต๋ ์ด์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์, ์ด์ ์ฐ๋ฆฌ๋ ํ ํ
์ด๋ธ ๋ด์์ ๊ฐ ๊ณ ๊ฐ์ ์ด๋ฆ, ์๋
์์ผ, ๋ฐฐ์ฐ์ ์ ๋ณด ์ด์ธ์๋ ๊ทธ๋ค์ด ์ฌ๋ ๋์์ ์ด๋ฆ๊น์ง ํจ๊ป ์ดํด๋ณด๊ณ ์ถ์ต๋๋ค. ์๋์ ๊ฐ์ด ์กฐ์ธ์ ์ฌ์ฉํด ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํด ๋ณผ ์ ์๊ฒ ๋ค์.
SELECT
c1.customer_id,
c1.firstname,
c1.lastname,
c1.birthdate,
c1.spouse_id,
c1.city_id,
c2.name AS city_name
FROM customer AS c1
INNER JOIN city AS c2
ON c1.city_id = c2.city_id;
์์์ ์ฌ์ฉ๋ ์กฐ์ธ์ ์ดํด๋ณด๋ฉด ๊ณตํต๋ ์ด์ธ city_id๋ฅผ ์ค์ฌ์ผ๋ก customer ํ ์ด๋ธ๊ณผ city ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ง์ง์์ต๋๋ค. customer ํ ์ด๋ธ์์๋ ์ด 6๊ฐ์ ์ด์, city ํ ์ด๋ธ์์๋ ๋จ 1๊ฐ์ ์ด(name)์ ์ ํํ์ต๋๋ค. ์กฐ์ธ์ ์ข ๋ฅ๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์๋๋ฐ, ์ด๋ฒ ์์๋ ๊ทธ์ค์์๋ ์ด๋ ์กฐ์ธ(INNER JOIN)์ ์ฌ์ฉํ๋ค์.
์กฐ์ธ์ ๊ธฐ๋ณธ์ ์ธ ๋ฌธ๋ฒ์ ๊ดํด์ ์ด ๊ธ์์ ๋ค๋ฃจ์ง ์๊ฒ ์ต๋๋ค. ์ ์ฟผ๋ฆฌ๋ฌธ์ ์คํํ๋ฉด ์๋์ ๊ฐ์ด customer ํ ์ด๋ธ์ 6๊ฐ ์ด๊ณผ city ํ ์ด๋ธ์ 1๊ฐ ์ด๋ก ๊ตฌ์ฑ๋ 1๊ฐ์ ํ ์ด๋ธ์ ๋ฐํํด์ค๋๋ค.

๋๊ฐ์ ํ ์ด๋ธ์ ์ฌ๋ฌ ๋ฒ ์กฐ์ธํ๊ธฐ
์ง๊ธ๊น์ง ์กฐ์ธ์ ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ์ ๋ ์ฌ๋ ค ๋ณด์์ผ๋, ์ด์ ๋ ๋ณธ๊ฒฉ์ ์ผ๋ก ์ข ๋ ๋ณต์กํ ์กฐ์ธ์ ์ดํด๋ณด๋๋ก ํฉ์๋ค. ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ค ๋ณด๋ฉด ๊ฐ์ ํ ์ด๋ธ์ ์ฌ๋ฌ ๋ฒ ์กฐ์ธํด์ผ ํ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํฉ๋๋ค. Sometimes you need to join the same table multiple times. Generally, this involves adding one or more columns to a result set from the same table but to different records or by different columns. ์ฐ๋ฆฌ๋ 2๊ฐ์ง ์๋๋ฆฌ์ค๋ฅผ ์ดํด๋ณผ ๊ฒ์ ๋๋ค. ํ๋๋ ์๊ธฐ ์์ ์ ํฉ์น๋ ๊ฒฝ์ฐ์ด๊ณ ๋ค๋ฅธ ํ๋๋ ๋ค๋จ๊ณ ๊ด๊ณ๋ฅผ ๋ํ๋ด๊ธฐ ์ํด ํ ์ด๋ธ์ ์กฐ์ธํ๋ ๊ฒฝ์ฐ์ ๋๋ค.
์ ํ ์กฐ์ธ: ์๊ธฐ ์์ ์๊ฒ ํ ์ด๋ธ์ ์กฐ์ธํ๋ ๋ฒ
์ ํ ์กฐ์ธ์ ์ฌ๋ฌ ์กฐ์ธ ์ค์์๋ ๊ฝค๋ ๋ ํนํ ์์ด์ ๋๋ค. 2๊ฐ์ ์๋ก ๋ค๋ฅธ ํ ์ด๋ธ ๋ด์ ์๋ ๋ฐ์ดํฐ๋ฅผ ํ๋์ ํ ์ด๋ธ๋ก ๋ถ์ด๋ ๋์ ์๊ธฐ ์์ ์์ ์๋ ๋๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ๋ค ๋ถ์ด๋๊น์. ์ด์งธ์ ์ด๋ฏธ ์กด์ฌํ๋ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ธ์ ํตํด ๋ ๊ฐ์ ธ๋ค ๋ถ์ฌ ์ฐ๊ณ ์ถ์ ๊ฒ์ผ๊น์? ์์์ ์ดํด๋ณธ ์กฐ์ธ์ ์์๋ city ํ ์ด๋ธ ๋ด์ ์ด์ธ name ์ customer ํ ์ด๋ธ์ ๊ฐ์ ธ๋ค ๋ถ์ด๊ณ ์ถ์์ต๋๋ค. ๊ทธ๋์ 2๊ฐ์ ํ ์ด๋ธ์ ์กฐ์ธํด ์ฃผ์์ฃ . ํ์ง๋ง ์ ํ ์กฐ์ธ์ ํ๋ค๋ ๊ฒ์, ์๋ฅผ ๋ค์๋ฉด, customer ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ๋ค์ customer ํ ์ด๋ธ์๋ค๊ฐ ๊ฐ์ ธ๋ค ๋ถ์ด๋ ๊ฒ์ ๋๋ค.
customer ํ ์ด๋ธ์ ๊ฐ์ ธ์์ ๋ถ์ฐ ์ค๋ช ์ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.

spouse_id ์ด์ ๊ณ ๊ฐ์ ๋ฐฐ์ฐ์์ customer_id ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, customer_id 1๊ณผ 2๋ (John๊ณผ Mary) ์๋ก์ ๋ฐฐ์ฐ์์ ๋๋ค. customer_id 3๊ณผ 5 (Lisa์ Tom) ๋ํ ์๋ก์ ๋ฐฐ์ฐ์๋ค์. ์ด๋ฐ ์์ผ๋ก ๋ฐ์ดํฐ๊ฐ ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. ํ์ง๋ง ํด๋น ํ ์ด๋ธ์ ๋ณด๋ฉด ๊ณ ๊ฐ์ ์ด๋ฆ๊ณผ ๊ทธ ๊ณ ๊ฐ์ ๋ฐฐ์ฐ์์ ์์ด๋๋ ์ ์ ์์ง๋ง, ๋ฐฐ์ฐ์์ ์ฑ๊ณผ ์ด๋ฆ์ ๋ฐ๋ก ์์ง ๋ชปํ๋ ์ํฉ์ ๋๋ค. ๊ทธ๋์ customer ํ ์ด๋ธ์ ๋ฐฐ์ฐ์์ ์ฑ๊ณผ ์ด๋ฆ์ ๋ถ์ฌ์ฃผ๊ณ ์ถ์ต๋๋ค. ์ด๋ด ๋ ๋ฐ๋ก ์ ํ ์กฐ์ธ์ ์ฌ์ฉํฉ๋๋ค. customer ํ ์ด๋ธ์ customer ํ ์ด๋ธ์ ์กฐ์ธํ ๊ฒ์ ๋๋ค. ์ฆ, customer ํ ์ด๋ธ ์์ ์๋ ๋ฐ์ดํฐ๋ฅผ customer ํ ์ด๋ธ ์์ ์๋ ๋ฐ์ดํฐ์ ๋งค์นญ ํ์ฌ ์์๋ค๊ฐ ๊ณ ์ค๋ํ ๋ถ์ฌ์ค ๊ฒ์ ๋๋ค.
SELECT
cust.customer_id,
cust.firstname,
cust.lastname,
cust.birthdate,
cust.spouse_id,
spouse.firstname AS spouse_firstname,
spouse_lastname AS spouse_lastname
FROM customer AS cust
INNER JOIN customer AS spouse
ON cust.spouse_id = spouse.customer_id
์ด ์ฟผ๋ฆฌ๋ฌธ์ ์คํํ๋ฉด ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ต๋๋ค.

์ ํ ์กฐ์ธ์ ์ค ์์ ๋ฅผ ์ดํด๋ณด์์ผ๋, ๋ฐฉ๊ธ ์ฐ๋ฆฌ๊ฐ ์์์ ์์ฑํ๋ ์ฟผ๋ฆฌ๋ฌธ์ ์ ๋๋ก ๋ฏ์ด๋ณด๋ฉด์ ์ดํดํด ๋ด ์๋ค.
์ ํ ์กฐ์ธ ๋ฌธ๋ฒ
์ ํ ์กฐ์ธ์ ๋ฌธ๋ฒ์ ๋ค๋ฅธ ์กฐ์ธ๊ณผ ํฌ๊ฒ ๋ค๋ฅผ ๋ฐ๊ฐ ์์ต๋๋ค. ํธ์๋ฅผ ์ํด ์์์ ์์ฑํ๋ ์ฟผ๋ฆฌ๋ฌธ์ ๊ฐ์ ธ์ค๋๋ก ํ๊ฒ ์ต๋๋ค.
SELECT
cust.customer_id,
cust.firstname,
cust.lastname,
cust.birthdate,
cust.spouse_id,
spouse.firstname AS spouse_firstname,
spouse.lastname AS spouse_lastname
FROM customer AS cust
INNER JOIN customer AS spouse
ON cust.spouse_id = spouse_id;
์ฐ๋ฆฌ๊ฐ ์ถ๊ฐ์ ์ผ๋ก ํ์ํ ์ ๋ณด๋ ๋ฐฐ์ฐ์์ ์ฑ๊ณผ ์ด๋ฆ์ ๋๋ค. ๊ทผ๋ฐ ํด๋น ์ ๋ณด๋ ๋ฐ๋ก ๊ฐ์ ํ ์ด๋ธ ์์ customer_id ๋ก ์ ์ฅ์ด ๋์ด ์์ต๋๋ค. spouse_id ๊ฐ customer ํ ์ด๋ธ ๋ด์ ๋ค๋ฅธ ๊ณ ๊ฐ์ ์์ด๋, ์ฆ customer_id๋ฅผ ์๋ฏธํ๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ์ด๋ฅผ ์ค์ฌ์ผ๋ก ํ ์ด๋ธ์ ํฉ์ณ์ค ๊ฒ์ ๋๋ค.
์ข ๋ ์ฝ๊ฒ ์ค๋ช ํด๋ณด์๋ฉด, ์๋ณธ ํ ์ด๋ธ์ด ์๊ณ ๊ทธ ์๋ณธ ํ ์ด๋ธ์ ๋ณต์ฌ๋ณธ์ ์์ฑํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ ๊ฒ ๋๊ฐ์ 2๊ฐ์ ํ ์ด๋ธ์ ํฉ์น๋ค๊ณ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค. ์ฐ๋ฆฌ ์์๋ฅผ ๊ฐ์ง๊ณ ์ด์ผ๊ธฐํ์๋ฉด, customer ์ด๋ผ๋ ์๋ณธ ํ ์ด๋ธ์ด ์๊ณ ์ด๊ฒ์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค์ด์ spouse ํ ์ด๋ธ์ด๋ผ๊ณ ์ด๋ฆ์ ์ง์ด์ฃผ์์ต๋๋ค. customer ํ ์ด๋ธ ์์ spouse_id ๋ spouse ํ ์ด๋ธ ์์ spouse_id ์ ์ ํํ ์ผ์นํ ๊ฒ์ด๊ณ , ์ด๋ฅผ ๋งค์นญํจ์ผ๋ก์จ spouse ํ ์ด๋ธ์์ spouse_firstname ๊ณผ spouse_lastname ์ ๊ฐ์ ธ์ customer ํ ์ด๋ธ์ ๋ถ์ผ ๊ฒ์ ๋๋ค.
์ ํ ์กฐ์ธ์์ ์ ๋ ํ ์ ์ ์ ํ ์กฐ์ธ์ ํ ์ด๋ธ์ ์ด๋ฆ์ ๊ผญ ์ง์ ํด์ค์ผ ํฉ๋๋ค. ๊ทธ ์ด์ ๋ ๋๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์ด 2๊ฐ์ ํ ์ด๋ธ์ ์ ์ฅ๋์ด ์๋ ์ํฉ์์ SQL์ ํน์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ค ํ ์ด๋ธ์์ ๊ฐ์ ธ์์ผ ํ ์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ๋๋ค. SQL์ ์ ํ ์กฐ์ธ์ ๋์ผํ ํ ์ด๋ธ์ ํฉ์น๋ค๊ณ ์ธ์ํ์ง ์๊ณ , ๊ทธ๋ ๊ฒ ์ธ์ํ์ง ๋ชปํฉ๋๋ค. ๋๊ฐ์ ํ ์ด๋ธ์ ํฉ์น๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๊ฐ ์ ํ ์กฐ์ธ์ด๋ผ๋ ์ด๋ฆ์ ๋ถ์ธ ๊ฒ์ด์ง SQL ์์ฒด์๋ ์ ํ ์กฐ์ธ์ด๋ผ๋ ๊ฐ๋ ์ด ์กด์ฌํ์ง ์์ต๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ ํ ์กฐ์ธ์ ํ๊ณ ์ถ์ ๋ SQL ๋ฌธ์๋ค๊ฐ ์๋ก ๋ค๋ฅธ ํ ์ด๋ธ ๋ณ์นญ์ ์ฃผ์ด ์๋ก ๋ค๋ฅธ ํ ์ด๋ธ 2๊ฐ๋ฅผ ์กฐ์ธํ๋ ๊ฒ์ด๋ผ๊ณ ์ธ์์ผ ํฉ๋๋ค. ์ ์์์์๋ ์๋ณธ customer ํ ์ด๋ธ์ cust ๋ผ๋ ๋ณ์นญ์, ๋ณต์ฌ๋ณธ ํ ์ด๋ธ์๋ spouse ๋ผ๋ ๋ณ์นญ์ ์ฃผ์์ต๋๋ค.
SELECT ๋ฌธ์๋ ์ฐ๋ฆฌ๊ฐ ๋ณด๊ณ ์ถ์ ์ด์ ์ด๋ฆ์ ์ญ ๋์ดํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ํ ์ด ์ด๋ฆ ์์ ์ด๋ค ํ ์ด๋ธ ๋ด์ ์ด์ ๊ฐ์ ธ์์ผ ํ ์ง ๋งํด์ค์ผ ํฉ๋๋ค. ๋๊ฐ์ ์ด์ด 2๊ฐ์ ํ ์ด๋ธ์ ์กด์ฌํ๋๊น์. ์ฟผ๋ฆฌ๋ฌธ์ ๋ณด๋ฉด customer ํ ์ด๋ธ์์ ์ด 5๊ฐ์ ์ด์ (cust.customer_id, cust.firstname, cust.lastname, cust.birthdate, cust.spouse_id) ๊ฐ์ ธ์๊ณ , spouse ํ ์ด๋ธ์์ ์ด 2๊ฐ์ ์ด์ (spouse.firstname, spouse.lastname) ๊ฐ์ ธ์จ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ ์์์ ๊ฒฝ์ฐ ์ฐ๋ฆฌ๋ ์ด๋ ์กฐ์ธ์ ์ฌ์ฉํ์ง๋ง, ์ฌ๋ฌ๋ถ์ด ์ด๋ค ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธธ ์ํ๋์ง์ ๋ฐ๋ผ ๋ค๋ฅธ ์ข ๋ฅ์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ ๋ ๋ฉ๋๋ค. LEFT ์กฐ์ธ, RIGHT ์กฐ์ธ, CROSS ์กฐ์ธ ๋ฑ ๋ง์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ ์ชฝ ํ ์ด๋ธ์ ๊ณตํต์ผ๋ก ์กด์ฌํ๋ ๊ฒฐ๊ณผ๊ฐ๋ง ์ดํด๋ณด๊ณ ์ถ์๊ธฐ ๋๋ฌธ์ ์ด๋ ์กฐ์ธ์ ์ฌ์ฉํ ๊ฒ๋ฟ์ ๋๋ค. ๊ทธ๋์ ๊ฒฐ๊ณผ ํ ์ด๋ธ์ ์ดํด๋ณด๋ฉด ์ค์ง ๋ฐฐ์ฐ์๋ง ์๋ ๊ณ ๊ฐ๋ค๋ง ๋ฐํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์๋ ํ ์ด๋ธ์์ customer_id 7์ธ Donna๋ ๋ฐฐ์ฐ์๊ฐ ์๊ธฐ ๋๋ฌธ์, ์กฐ์ธ์ ํตํด ๋ง๋ค์ด๋ธ ๊ฒฐ๊ณผ ํ ์ด๋ธ์๋ Donna๊ฐ ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ ํ ์กฐ์ธ์ ์คํํ๊ธฐ ์ํด ๊ผญ ์ด๋ ์กฐ์ธ์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒ์ ์๋๋ผ๋ ์ ๊ธฐ์ตํด์ฃผ์ธ์.
# Reference
'Knowledge๐ฆข > SQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [SQL] SQL๋ฌธ์ ๋ฅผ ํ ๋ ์ค์ํ๋ค๊ณ ์๊ฐํ๋ ๊ฒ๋ค (0) | 2024.05.13 |
|---|---|
| [SQL] Cross Join - ํฌ๋ก์ค ์กฐ์ธ (0) | 2024.05.13 |
| [SQL] group by๋ฅผ ์ธ๋ ์ฃผ์์ฌํญ (0) | 2024.04.27 |
| [SQL 3ํ์ฐจ] union ๊ณผ join์ ์ฐจ์ด์ (0) | 2024.04.26 |
| [SQL 2ํ์ฐจ] where๊ณผ having์ ์ฐจ์ด์ , ์๋ธ์ฟผ๋ฆฌ, ์ ์์ฌํญ (1) | 2024.04.26 |