: 2๊ฐ ์ด์์ ํ ์ด๋ธ์ ์๋ ์ปฌ๋ผ๋ค์ ํฉ์ณ์ ๊ฐ์์ ํ ์ด๋ธ์ ๋ง๋ค์ด ์กฐํํ๋ ๋ฐฉ์
์กฐ์ธ ์ฐ์ฐ : ๊ฐ ํ ์ด๋ธ์ ์ด๋ป๊ฒ ํฉ์น ์ง๋ฅผ ํํํ๋ ๊ฒ
<๋ฐ์ดํฐ ๊ฐ์ ๋ค์ค์ฑ>
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)์ด๋ค.
{๋์ฐฉํ๋ ์ง์ ์๋ค๊ฐ ๋ค์ค์ฑ ํ์}
Foreign key (์ธ๋ํค)
: ํ ํ ์ด๋ธ์ด ๋ค๋ฅธ ํ ์ด๋ธ์ column ๊ฐ์ ์ฐธ์กฐํ๋ ๊ฒ
โช ๋ถ๋ชจ table - ์ฐธ์กฐ ๋๋ table (PK)
โช ์์ table - ์ฐธ์กฐ ํ๋ table (FK column )
ํ์ดํ ์ถ๋ฐ ์ง์ ์ด ์์ table ๋ฐ๋ ์ ๊ฐ ๋ถ๋ชจ table
=> (์์ ๊ฐ์ ๊ฒฝ์ฐ์๋ ์ง์ table์ด ์์ table ์ด๊ณ ๋ถ์ table์ด ๋ถ๋ชจtable ์ด๋ผ๊ณ ํ ์ ์์)โ ์ง์ ํ ์ด๋ธ์ ๋ฐ์ดํฐ(row) ๋ ๋ถ์ ํ ์ด๋ธ ์ ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐ
โ ๋ถ์ ํ ์ด๋ธ์ row ๋ ์ง์ ํ ์ด๋ธ ์ ๋ฐ์ดํฐ 0 ๊ฐ ~N ๊ฐ๊ฐ ์ฐธ์กฐ ํ ์ ์์
โ ์ง์ ํ ์ด๋ธ์ ๋ฐ์ดํฐ ํ๋๋ ์ง์ ํ ์ด๋ธ ์ ๋ฐ์ดํฐ ํ๋๋ฅผ ์์ฌ_ID ๋ก ์ฐธ์กฐ
๊ธฐ๋ณธ ๊ตฌ๋ฌธ
: CONSTRAINT ์ ์ฝ์กฐ๊ฑด์ด๋ฆ FOREIGN KEY(์ปฌ๋ผ) REFERECES๋ถ๋ชจํ
์ด๋ธ(PK ์ปฌ๋ผ) [ON ์ค์ ]
โ ์ฐธ์กฐ์ปฌ๋ผ์ PK ๊ฑฐ๋ Index ์ค์ ๋ ์ปฌ๋ผ์ด์ด์ผ ํ๋ค
์์ ํ ์ด๋ธ๋ก๋ถํฐ ์ฐธ์กฐ ๋นํ๋ ๋ถ๋ชจ ํ ์ด๋ธ์ row ๋ ์ญ์ ํ ์ ์์
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
๊ธฐ๋ณธ์ ์ผ๋ก ์์ ํ ์ด๋ธ์์ ์ฐธ์กฐํ๊ณ ์์ผ๋ฉด ๋ถ๋ชจ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ์์ ํ์ง ๋ชปํจ
โ Foreign key ์ปฌ๋ผ ์ค์ ํ ๋ ์ด๊ฒ์ ๋ณ๊ฒฝํ ์ ์๋๋ฐ ์ด๋ on ์ค์ ์ ์ฌ์ฉ
ON DELETE|UPDATE ์ฒ๋ฆฌ๋ฐฉ์
ON DELETE:
์ฐธ์กฐํ๋ ๋ถ๋ชจํ
์ด๋ธ์ ํ์ด ์ญ์ ๋์์ ๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊ฒ์ธ์ง ์ค์
ON UPDATE:
์ฐธ์กฐํ๋ ๋ถ๋ชจํ
์ด๋ธ์ ์ฐธ์กฐ ์ปฌ๋ผ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊ฒ์ธ์ง ์ค์
์ฒ๋ฆฌ๋ฐฉ์
CASCADE
: ๋ถ๋ชจ ํ ์ด๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ์์ ํ๋ฉด , ๊ทธ ํ์ ์ฐธ์กฐํ๋ ์์ํ ์ด๋ธ์ ํ๋ค๋ ๊ฐ์ด ์ญ์ ์์ ๋จSET NULL
: ๋ถ๋ชจ ํ ์ด๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ์์ ํ๋ฉด , ๊ทธ ํ์ ์ฐธ์กฐํ๋ ์์ํ ์ด๋ธ์ foreign key ์ปฌ๋ผ์ ๊ฐ์ NULL ๋ก ๋ณ๊ฒฝ
Table drop์ foreign key ์ ์ฝ์กฐ๊ฑด ์ ๊ฑฐ
set foreign_key_ckecks = 0; -- foreign key ํด์ ์ค์
DROP table ์ญ์ ํ ํ
์ด๋ธ
set foreign_key_ckecks = 1; -- foreign key ์ ์ฉ ์ค์ โ ๋์ค์ ๋ค์ 1๋ก ๋ฐ๊ฟ๋ ์์ด์ก๋ foreign key ์ค์ ์ด ๋ค์ ์๊ธฐ์ง๋ ์์JOIN: ๊ด๊ณ์๋ ๋ ๊ฐ์ ํ
์ด๋ธ์ ํฉ์ณ์ (JOIN) ์กฐํ (SELECT) ํ๋ ๊ฒ
โช์กฐ์ธํ ๋ ํ
์ด๋ธ์ ํน์ column๋ค์ ๊ฐ๋ค์ด ๊ฐ์ ํ๋ผ๋ฆฌ ํฉ์นจ
JOIN์ฐ์ฐ
: ์ด๋ค ํ๋ค์ ๊ฐ์ด ๊ฐ์ ๊ฒ๋ผ๋ฆฌ ํฉ์น ๊ฒ์ธ์ง ์ค์ ํ๋ ๊ตฌ๋ฌธ
โ ์ผ๋ฐ์ ์ผ๋ก ๋ถ๋ชจ table๊ณผ ์์ table์ ์ฐ๊ฒฐํด์ ์กฐํํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋ฉฐ ์ด ๊ฒฝ์ฐ ๋ถ๋ชจ tabled ์ PK(primary key) ์ ์์ table์ FK(foreign key) column ์ ๊ฐ์ด ๊ฐ์ ํ๋ค์ JOIN ํ๋ค
ex)

: ๋ ํ
์ด๋ธ์ ์ ์ฒด ํ๋ค์ ํฉ์น ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์กฐํฉ์ด ๋ง๋ค์ด์ง๋ ๊ฒฝ์ฐ
โช Nํ , M ํ ์ ๋ ํ
์ด๋ธ ์กฐ์ธ์ N x M ๊ฐ์ ํ์ด ์์ฑ๋จ
INNER JOIN
โช ์กฐ์ธ ์ฐ์ฐ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ํ๋ค์ ํฉ์น๋ค
OUTER JOIN
โช ์กฐ์ธ ์ฐ์ฐ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์๋ ํ๋ค๋ ํฌํจํด์ ํฉ์น๋ค
โ LEFT OUTER JOIN
โ RIGHT OUTER JOIN
โ FULL OUTER 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;
: ๋ฌผ๋ฆฌ์ ์ผ๋ก ํ๋์ ํ ์ด๋ธ์ ๋๊ฐ์ ํ ์ด๋ธ์ฒ๋ผ ์กฐ์ธํ๋ ๊ฒ.
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 ๋ ์๋ต ๊ฐ๋ฅ
โ ์กฐ์ธ์ ์กฐํ ๊ธฐ์ค์ด ๋๋ ํ ์ด๋ธ๋ก ์กฐํํ๋ ค๋ ์ฃผ (main) ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ ํ ์ด๋ธ
โ ์กฐ์ธ์ Source table ๋ฐ์ดํฐ์ ์ถ๊ฐ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ ํ ์ด๋ธ๋ก ๋ณด์กฐ (sub) ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ ํ ์ด๋ธ
โช ์กฐ์ธ ์ Source ํ ์ด๋ธ์ ๋ฐ์ดํฐ ํ์ ๋ชจ๋ ์ฌ์ฉํ๊ณ Target table ์ ๋ฐ์ดํฐ ํ์ ์กฐ์ธ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ํ๋ง ๋์ค๋๋ก ํจ
๊ตฌ๋ฌธ์ ์์ค ํ ์ด๋ธ์ด ์ผ์ชฝ

โ ๊ตฌ๋ฌธ:
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
๊ตฌ๋ฌธ์ ์์ค ํ ์ด๋ธ์ด ์ค๋ฅธ์ชฝ

โ๊ตฌ๋ฌธ:
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
> 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 ๋ ์ ๋์ฌ ๊ฒฝ์ฐ๋ ์๊ธฐ ๋๋ฌธ์ ์ฐจ๋ผ๋ฆฌ ๋ง์ด ๋ณด๋๊ฒ์ด ๋ฌ๋ค