Computer Science/๐พ Database
[DB] SQL ์กฐ์ธ(Join) ๊ฐ๋ , ์ข ๋ฅ
J1Yun
2023. 3. 24. 14:59
728x90
์กฐ์ธ(Join)
- ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด์ ์ฌ๋ฌ ํ ์ด๋ธ์ ๋ ์ฝ๋๋ฅผ ์กฐํฉํ์ฌ ํ๋์ ์ด๋ก ํํํ ๊ฒ\
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ ์๋ก ๊ด๊ณ์๋ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฌ ํ ์ด๋ธ๋ก ๋๋์ด ์ ์ฅ๋์์ด ์กฐ์ธ์ ํตํด ๊ฐ ํ ์ด๋ธ์ ์ฐ๊ฒฐํ์ฌ ํจ๊ณผ์ ์ผ๋ก ๊ฒ์
- ๋ ํ ์ด๋ธ์ ์กฐ์ธ์ ์ํด์๋๊ธฐ๋ณธํค(PRIMARY KEY, PK)์ ์ธ๋ํค(FOREIGN KEY, FK) ๊ด๊ณ๋ก ๋งบ์ด์ ธ์ผ ํจ
์กฐ์ธ์ ์ข ๋ฅ
- ๋ด๋ถ ์กฐ์ธ(INNER JOIN): ๋ ํ ์ด๋ธ์ ์กฐ์ธํ ๋, ๋ ํ ์ด๋ธ์ ๋ชจ๋ ์ง์ ํ ์ด์ ๋ฐ์ดํฐ๊ฐ ์์ด์ผ ํจ
- ์ธ๋ถ ์กฐ์ธ(OUTER JOIN): ๋ ํ ์ด๋ธ์ ์กฐ์ธํ ๋, 1๊ฐ์ ํ ์ด๋ธ์๋ง ๋ฐ์ดํฐ๊ฐ ์์ด๋ ๊ฒฐ๊ณผ๊ฐ ๋์ด
- ์ํธ ์กฐ์ธ(CROSS JOIN): ํ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ํ๊ณผ ๋ค๋ฅธ ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ํ์ ์กฐ์ธํ๋ ๊ธฐ๋ฅ
- ์์ฒด ์กฐ์ธ(SELF JOIN): ์์ ์ด ์์ ๊ณผ ์กฐ์ธํ๋ค๋ ์๋ฏธ๋ก, 1๊ฐ์ ํ ์ด๋ธ์ ์ฌ์ฉ
โป ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์
๋ด๋ถ ์กฐ์ธ(INNER JOIN)
- ๊ฐ์ฅ ํํ ๊ฒฐํฉ ๋ฐฉ์์ด๋ฉฐ ๊ธฐ๋ณธ ์กฐ์ธ ํ์์ผ๋ก ๊ฐ์ฃผ
- ๊ณตํต์ ์ธ ๋ถ๋ถ๋ง SELECT
๋ช ์์ ์กฐ์ธ ํํ(explicit)
- Join ํค์๋์ ํจ๊ป On ํค์๋ ์ฌ์ฉ
SELECT *
FROM STUDENT_TABLE
INNER JOIN DEPARTMENT_TABLE
ON STUDENT_TABLE.DEPARTMENT_ID = DEPARTMENT_TABLE.DEPARTMENT_ID;
์์์ ์กฐ์ธ ํํ(implicit)
- From ์ ์์ ํ ์ด๋ธ์ ๋ถ๋ฆฌํ๋ ์ปด๋ง(,)๋ฅผ ์ฌ์ฉ
SELECT *
FROM STUDENT_TABLE, DEPARTMENT_TABLE
WHERE STUDENT_TABLE.DEPARTMENT_ID = DEPARTMENT_TABLE.DEPARTMENT_ID;
์ธ๋ถ ์กฐ์ธ(OUTER JOIN)
- ์กฐ์ธ ๋์ ํ ์ด๋ธ์์ ํน์ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ํ์ํ ์ํฉ์์ ํจ๊ณผ์ ์ผ๋ก ๊ฒฐ๊ณผ ์งํฉ์ ์์ฑ
- ๋ ํ ์ด๋ธ์ด ๊ฐ์ง๊ณ ์๋ ์ ์ฒด ๋ถ๋ถ SELECT
์ผ์ชฝ ์ธ๋ถ ์กฐ์ธ(LEFT OUTER JOIN)
- ์ผ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ ๊ฒฐ๊ณผ ์งํฉ์ ์์ฑ
# ๊ณตํต๋ถ๋ถ ํฌํจ
SELECT *
FROM STUDENT_TABLE S LEFT OUTER JOIN DEPARTMENT_TABLE D
ON S.DEPARTMENT_ID = D.DEPARTMENT_ID;
# ๊ณตํต๋ถ๋ถ ๋ถํฌํจ
SELECT *
FROM STUDENT_TABLE S LEFT OUTER JOIN DEPARTMENT_TABLE D
ON S.DEPARTMENT_ID = D.DEPARTMENT_ID
WHERE D.DEPARTMENT_ID IS NULL;
์ค๋ฅธ์ชฝ ์ธ๋ถ ์กฐ์ธ(RIGHT OUTER JOIN)
- ํ ์ด๋ธ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ ๊ฒฐ๊ณผ ์งํฉ์ ์์ฑ
# ๊ณตํต๋ถ๋ถ ํฌํจ
SELECT *
FROM STUDENT_TABLE S RIGHT OUTER JOIN DEPARTMENT_TABLE D
ON S.DEPARTMENT_ID = D.DEPARTMENT_ID;
# ๊ณตํต๋ถ๋ถ ๋ถํฌํจ
SELECT *
FROM STUDENT_TABLE S RIGHT OUTER JOIN DEPARTMENT_TABLE D
ON S.DEPARTMENT_ID = D.DEPARTMENT_ID
WHERE S.DEPARTMENT_ID IS NULL;
์์ ์ธ๋ถ ์กฐ์ธ(FULL OUTER JOIN)
- ๋ ํ ์ด๋ธ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ ๊ฒฐ๊ณผ ์งํฉ์ ์์ฑ
# ๊ณตํต๋ถ๋ถ ํฌํจ
-- ORACLE
SELECT *
FROM STUDENT_TABLE S FULL OUTER JOIN DEPARTMENT_TABLE D
ON S.DEPARTMENT_ID = D.DEPARTMENT_ID;
-- MYSQL
SELECT *
FROM STUDENT_TABLE S LEFT OUTER JOIN DEPARTMENT_TABLE D
ON S.DEPARTMENT_ID = D.DEPARTMENT_ID
UNION
SELECT *
FROM STUDENT_TABLE S RIGHT OUTER JOIN DEPARTMENT_TABLE D
ON S.DEPARTMENT_ID = D.DEPARTMENT_ID;
# ๊ณตํต๋ถ๋ถ ๋ถํฌํจ
-- ORACLE
SELECT *
FROM STUDENT_TABLE S FULL OUTER JOIN DEPARTMENT_TABLE D
ON S.DEPARTMENT_ID = D.DEPARTMENT_ID
WHERE S.DEPARTMENT_ID IS NULL OR D.DEPARTMENT_ID IS NULL;
-- MYSQL
SELECT *
FROM STUDENT_TABLE S LEFT OUTER JOIN DEPARTMENT_TABLE D
ON S.DEPARTMENT_ID = D.DEPARTMENT_ID
WHERE D.DEPARTMENT_ID IS NULL
UNION
SELECT *
FROM STUDENT_TABLE S RIGHT OUTER JOIN DEPARTMENT_TABLE D
ON S.DEPARTMENT_ID = D.DEPARTMENT_ID
WHERE S.DEPARTMENT_ID IS NULL;
์ํธ ์กฐ์ธ(CROSS JOIN)
- ํ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ํ๊ณผ ๋ค๋ฅธ ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ํ์ ๊ฒฐํฉ์์ผ ๋ชจ๋ SELECT
- ์นดํฐ์ ๊ณฑ(CARTESIAN PRODUCT)์ด๋ผ๊ณ ๋ ํจ
SELECT *
FROM STUDENT_TABLE S CROSS JOIN DEPARTMENT_TABLE D
728x90