week 7 hyowon - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki
Join์ ์ข ๋ฅ์ ๋ํด ์๋๋๋ก ๋ค ์ค๋ช
-
๋ด๋ถ ์กฐ์ธ(cross join, inner join, equi join, non-equi join, natural join)
-
์ธ๋ถ ์กฐ์ธ(left outer join, right outer join, full outer join)
1. ๋ด๋ถ ์กฐ์ธ
- cartesian join (cross join) : ๋ ํ ์ด๋ธ์ ๊ณฑ์งํฉ.
# ๋ช
์์ ํํ๋ฒ (explicit notation)
SELECT *
FROM employees
CROSS JOIN dept_emp;
# ์๋ฌต์ ํํ๋ฒ (implicit notation)
SELECT *
FROM employees, dept_emp;
- INNER JOIN : ๋ ํ ์ด๋ธ์ ์กฐ๊ฑด๋ฌธ์ ์ถฉ์กฑ์ํค๋ ๊ต์งํฉ
-- ๋ด๋ถ ์กฐ์ธ (INNER JOIN) && ๋ฑ๊ฐ ์กฐ์ธ(EQUI JOIN)
# ๋ช
์์ ํํ๋ฒ (explicit notation)
SELECT *
FROM employees
INNER JOIN dept_emp
ON employees.emp_no = dept_emp.emp_no;
# ์๋ฌต์ ํํ๋ฒ (implicit notation)
SELECT *
FROM employees, dept_emp
WHERE employees.emp_no = dept_emp.emp_no;
-
EQUI JOIN : ์กฐ๊ฑด๋ฌธ์์ ๋๋ฑ ๋น๊ต๋ฅผ ์ฌ์ฉํ๋ ์กฐ์ธ. ์ ์์ ์ฐธ๊ณ .
-
NON-EQUI JOIN : ๋๋ฑ๋น๊ต๋ฅผ ์ฌ์ฉํ์ง ์๋ ์กฐ์ธ. (๋ฒ์, ๋น๊ต ๋ฑ์ ์ฌ์ฉํ๋ ์กฐ์ธ.)
# ์๋ฌต์ ํํ๋ฒ (implicit notation)
SELECT *
FROM employees, departments
WHERE employees.emp_no between 10003 and 10004;
- NATURAL JOIN : ๋ ํ ์ด๋ธ์์ ๋์ผํ ์ปฌ๋ผ๋ช ์ ๊ฐ์ง ๊ฒ๋ค๋ก ์กฐ์ธ
-- ๊ผญ PK๊ฐ ์๋ ์ปฌ๋ผ๋ ์ด๋ฆ์ด ๊ฐ์ผ๋ฉด ์ค๋ณต์ ๊ฑฐํจ
-- ๊ทธ๋์ ์ธ์ผ ์์ ๊ฒ ๊ฐ๋ค.
SELECT *
FROM member NATURAL JOIN member_info;
mysql์๋ ๋ค๋ฅธ RDB์์ ์ง์๋๋๊ฒ ์ง์๋์ง ์๋๋ฐ, ๊ฐ๋ฐ์์ ๋ถ์กฑ ํ์ผ๋ก ๋ณด์. 2006๋ ์ ์ด๋ฏธ full outer join ๊ฐ๋ฐ ์์ฒญ์ด ์์์ผ๋ ์ฐ์ ์์๊ฐ ๋ฎ์ ๊ฐ๋ฐ๋์ง ์์.(๋งํฌ)
2. ์ธ๋ถ ์กฐ์ธ
- LEFT OUTER JOIN : ํ ์ด๋ธ a์ ๋ชจ๋ ๋ฐ์ดํฐ์ ํ ์ด๋ธ b์ ๊ต์งํฉ์ธ ๋ ์ฝ๋๋ฅผ ํฌํจํ๋ ์กฐ์ธ
# ๋ช
์์ ํํ๋ฒ (explicit notation)
SELECT *
FROM employees
LEFT OUTER JOIN departments
ON employees.dept_no = departments.dept_no;
- RIGHT OUTER JOIN : ํ ์ด๋ธ b์ ๋ชจ๋ ๋ฐ์ดํฐ์ ํ ์ด๋ธ a์ ๊ต์งํฉ์ธ ๋ ์ฝ๋๋ฅผ ํฌํจํ๋ ์กฐ์ธ
-- ์ค๋ฅธ์ชฝ ์ธ๋ถ ์กฐ์ธ (RIGHT OUTER JOIN)
# ๋ช
์์ ํํ๋ฒ (explicit notation)
SELECT *
FROM employees
RIGHT OUTER JOIN departments
ON employees.dept_no = departments.dept_no;
- FULL OUTER JOIN : ํ ์ด๋ธ a, b๋ฅผ ๋ชจ๋ ํฌํจํ๋ ์กฐ์ธ. mysql ์์ ๋ช ์์ ์ผ๋ก ์ง์ํ์ง ์์ง๋ง union์ ํ์ฉํด ์ฌ์ฉ ๊ฐ๋ฅ.
# ๋ฐฉ๋ฒ1 : JOIN์ UINION(์ค๋ณต์ ๊ฑฐ)
SELECT *
FROM table1
LEFT OUTER JOIN table2
ON table1.n = table2.n
UNION
SELECT *
FROM table1
RIGHT OUTER JOIN table2
ON table1.n = table2.n;
# ๋ฐฉ๋ฒ2 : UNION ALL(์ค๋ณต๋ฏธ์ ๊ฑฐ) and exclusion join
SELECT *
FROM table1
LEFT OUTER JOIN table2
ON table1.n = table2.n
UNION ALL
SELECT *
FROM table1
RIGHT OUTER JOIN table2
ON table1.n = table2.n
WHERE table1.n IS null; // ??????
- SELF JOIN : ์๊ธฐ ์์ ๊ณผ ์กฐ์ธ
# ์๋ฌต์ ํํ๋ฒ (implicit notation)
SELECT A.first_name AS EmployeeName1, B.first_name AS EmployeeName2, A.dept_no
FROM employees AS A, employees AS B
WHERE A.emp_no <> B.emp_no
AND A.dept_no = B.dept_no;
- ANTI JOIN : ์๋ธ์ฟผ๋ฆฌ์์ ์กด์ฌํ์ง ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ๋ฉ์ธ ์ฟผ๋ฆฌ์์ ์ถ์ถ
SELECT *
FROM employees AS e
WHERE emp_no >= 10002
AND NOT EXISTS(SELECT *
FROM departments AS d
WHERE e.dept_no = d.dept_no
AND d.dept_no >= 2);
- SEMI JOIN : ์๋ธ ์ฟผ๋ฆฌ ๋ด์์ ์กด์ฌํ๋ ๋ฐ์ดํฐ๋ง์ ๊ฐ์ง๊ณ ๋ฉ์ธ ์ฟผ๋ฆฌ์์ ์ถ์ถ
# EXISTS ์ฌ์ฉ
SELECT *
FROM departments as d
WHERE EXISTS(SELECT *
FROM employees AS e
WHERE e.dept_no = d.dept_no
AND e.emp_no >= 10003);
# IN ์ฌ์ฉ
SELECT *
FROM departments as d
WHERE d.dept_no IN (SELECT e.dept_no
FROM employees AS e
WHERE e.emp_no >= 10003);
์ ๊ทํ, ์ญ์ ๊ทํ๋ ๋ฌด์์ธ์ง?
์ ๊ทํ(normalization) : ๋ฐ์ดํฐ๋ฅผ ์ค๋ณต๋์ง ์๊ฒ ๊ด๋ฆฌํด ๋์คํฌ ๊ณต๊ฐ ๋ญ๋น๋ฅผ ์ต์ํํฉ๋๋ค. ์ด์, ํจ์์ ์ข ์์ผ๋ก ์๊ธฐ๋ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฆด๋ ์ด์ ์ ๋ถํดํ๋ ๊ณผ์
์ญ์ ๊ทํ(denormalization) : ์ฑ๋ฅ, ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๊ฐ์ ํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ์ค๋ณต๋ ์ํ๋ก ๋ง๋๋ ๊ณผ์ .
์ ๊ทํ์ ์ญ์ ๊ทํ์ ์ฐจ์ด
- ์ ๊ทํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ํ ์ด๋ธ๋ก ๋๋๊ณ , ์ญ์ ๊ทํ๋ ๋ฐ์ดํฐ ๊ฒ์ ์๋๋ฅผ ๋์ด๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ๋จ์ผ ํ ์ด๋ธ๋ก ๊ฒฐํฉ
- ์ ๊ทํ๋ OLTP ์์คํ ์์ ์ฌ์ฉ๋๋ฉฐ ์ฝ์ , ์ญ์ , ์ ๋ฐ์ดํธ๋ฅผ ๋น ๋ฅด๊ฒ ํ๋๋ฐ ์ค์ ์ ๋๊ณ , ์ญ์ ๊ทํ๋ OLAP ์์คํ ์์ ์ฌ์ฉ๋๋ฉฐ ๊ฒ์ ๋ฐ ๋ถ์ ์๋๋ฅผ ๋์ด๋๋ฐ ์ค์ ์ ๋ก๋๋ค.
- ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ. ์ ๊ทํ ํ๋ก์ธ์ค์์๋ ์ ์ง๋๋ ๋ฐ๋ฉด ์ญ์ ๊ทํ์์๋ ์ ์งํ๊ธฐ ์ด๋ ต์ต๋๋ค.
- ์ค๋ณต ๋ฐ์ดํฐ. ์ ๊ทํ์์๋ ์ค๋ณต ๋ฐ์ดํฐ๊ฐ ์ ๊ฑฐ๋๊ณ ์ญ์ ๊ทํ์์๋ ์ฆ๊ฐํฉ๋๋ค.
- ํ ์ด๋ธ๊ณผ ์กฐ์ธ ์. ์ ๊ทํ์์๋ ์ฆ๊ฐํ๋, ์ญ์ ๊ทํ์์๋ ์ค์ด๋ญ๋๋ค.
- ๋์คํฌ ๊ณต๊ฐ. ์ ๊ทํ์์๋ ์ต์ ํ๋๋ ์ญ์ ๊ทํ์์๋ ๋ ์๋ชจ๋ฉ๋๋ค.
์ํฉ์ ๋ฐ๋ผ ์ ๊ทํ, ์ญ์ ๊ทํ๋ฅผ ๊ณ ๋ คํ๊ฒ ๋๋๋ฐ, ์ ๊ทํ๋ ๋ ๋น ๋ฅธ ์ฐ๊ธฐ ์ฑ๋ฅ(์ฝ์ , ์ญ์ , ์ ๋ฐ์ดํธ)์ด ํ์ํ ๋ ์ฌ์ฉ๋๊ณ , ์ญ์ ๊ทํ๋ ์ฝ๊ธฐ ์ฑ๋ฅ์ ์ต์ ํํ ๋ ์ฌ์ฉํฉ๋๋ค.
โป ๋น์ ๊ทํ(unnormalized form
)๋ ๋ค๋ฅด๋ค. ์ด๊ฑด 1NF ์ด์ ๋จ๊ณ๋ก, ์ ๊ทํ๋๊ธฐ ์ด์ ์ ๋ ๊ฒ์ ๋ฐ์ดํฐ๋ฅผ ๋งํ๋ค. DB์ table์ ํจ์จ์ ์ผ๋ก ์ญ์ ๊ทํํ๊ธฐ ์ํด ์ฐ์ ์ ๊ทํ๋์ด์ผ ํ๋ค.
์ด์
ํ ์ด๋ธ์์ ์ผ๋ถ ์์ฑ๋ค์ ์ข ์์ผ๋ก ์ธํด ๋ฐ์ดํฐ์ ์ค๋ณต์ด ๋ฐ์ํ๊ณ , ์ด ์ค๋ณต์ผ๋ก ์ธํด ํ ์ด๋ธ ์กฐ์์ ๋ฌธ์
- ์ญ์ ์ด์ : ์์น ์๋ ์๋ฃ๊น์ง ์ญ์ ๊ฐ ์ด๋ค์ง
- ์ฝ์ ์ด์ : ์์น ์๋ ์๋ฃ๊ฐ ์ฝ์ ๋๊ฑฐ๋ ์๋ฃ๊ฐ ๋ถ์กฑํด ์ฝ์ ์ด ๋์ง ์๋ ๋ฌธ์ ์
- ๊ฐฑ์ ์ด์ : ์ผ๋ถ ํํ๋ง ๊ฐฑ์ ๋๊ฑฐ๋, ๊ฐฑ์ ๋์ง ์์. ๊ทธ๋์ ์ ๋ณด๊ฐ ๋ชจํธํด์ง๊ฑฐ๋ ์ผ๊ด์ฑ์ด ์์ด์ง.
ํจ์์ ์ข ์
A๊ฐ์ ์๋ฉด B๋ฅผ ์ ์ ์๊ฑฐ๋, A์ ๋ฐ๋ผ B๊ฐ ๋ฌ๋ผ์ง๋ค๋ฉด, B๋ A์ ์ข ์๋์ด ์๋ค.
- ์์ ํจ์ ์ข ์ : ๋ฆด๋ ์ด์ ์์ ํ ์์ฑ์ด ์ค์ง ๊ธฐ๋ณธํค์๋ง ์ข ์๋๋ ๊ฒฝ์ฐ
- ๋ถ๋ถํจ์ ์ข ์ : ๋ฆด๋ ์ด์ ์์ ํ ์์ฑ์ด ๊ธฐ๋ณธํค๊ฐ ์๋ ์์ฑ์ ์ข ์๋๊ฑฐ๋, ๊ธฐ๋ณธํค๊ฐ ์ฌ๋ฌ ์์ฑ์ผ๋ก ์ข ์๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธํค๋ฅผ ๊ตฌ์ฑํ๋ ์์ฑ ์ค ์ผ๋ถ๋ง ์ข ์๋๋ ๊ฒฝ์ฐ
- ์ดํ์ ํจ์ ์ข ์ : X โ Y, Y โ Z ์ธ ์ข ์๊ด๊ณ์ธ ๊ฒฝ์ฐ X โ Z ๊ฐ ์ฑ๋ฆฝ๋๋ ๊ฒฝ์ฐ. (X๋ฅผ ์๋ฉด Y๋ฅผ ์๊ณ ๊ทธ๋ฅผ ํตํด Z๋ฅผ ์ ์ ์๋ ๊ฒฝ์ฐ)
์ ๊ทํ์ 6 ์ข ๋ฅ
1NF, 2NF, 3NF, BCNF, 4NF, 5NF