๐ ๊ณต๋ถ ๊ธฐ๊ฐ : 07. 24(์)
๋ ๊ฐ์ ํ ์ด๋ธ(๊ด๊ณ๊ฐ ํ์ฑ๋์ด ์๋ ํ ์ด๋ธ)๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์กฐํ
๐ก ๋ ํ ์ด๋ธ์ PK(Primary Key), FK(Foreign Key)๊ฐ ์์ด์ผ ํจ

์ ์ฐ์ง๋ ์์
-- hr.employees e : ์ฒซ ๋ฒ์งธ ์งํฉ, hr.departments d : ๋ ๋ฒ์งธ ์งํฉ
SELECT *
FROM hr.employees e CROSS JOIN hr.departments d ;
-- CROSS JOIN ์๋ต ๊ฐ๋ฅ
SELECT *
FROM hr.employees e, hr.departments d ;
SELECT *
FROM hr.employees e INNER JOIN hr.departments d
ON e.department_id = d.department_id ;
/* ON์ ์ USING์ ๋ก ๋์ฒด ๊ฐ๋ฅ
USING (department_id);
*/
-- [๋ฌธ์ ] ์ ์ง์์ ์ด๋ฆ, ๊ธ์ฌ, ๋ถ์๋ช
์ ์กฐํํ์์ค
-- employees ํ
์ด๋ธ์ด ์์, departments ํ
์ด๋ธ์ด ๋ถ๋ชจ
SELECT e.first_name, e.salary, e.department_id
FROM hr.employees e
LEFT OUTER JOIN hr.departments d
ON e.department_id = d.department_id;
-- [๋ฌธ์ ] ๋ถ์๋ช
๊ณผ ๋ถ์๊ฐ ์์นํ ๋์์ ํด๋น ๋์๊ฐ ์๋ ๋๋ผ๋ฅผ ์กฐํํ์์ค
--- 1) locations ํ
์ด๋ธ์ด ์์, countries ํ
์ด๋ธ์ด ๋ถ๋ชจ
--- 2) departments ํ
์ด๋ธ์ด ์์, locations ํ
์ด๋ธ์ด ๋ถ๋ชจ
SELECT d.department_name , l.city, c.country_name
FROM hr.countries c RIGHT OUTER JOIN hr.locations l
ON c.country_id = l.country_id
RIGHT OUTER JOIN hr.departments d
ON l.location_id = d.location_id ;
์์์ FK <= ๋ถ๋ชจ์ PK๊ฐ ์ ์ด
-- [๋ฌธ์ ] ์ฌ์ ๋ฒํธ์ ์ด๋ฆ, ์๊ด์ ์ฌ์ ๋ฒํธ์ ์๊ด์ ์ด๋ฆ์ ์กฐํํ์์ค
SELECT e1.employee_id, e1.first_name AS "์ง์๋ช
", e2.employee_id, e2.first_name AS "๋งค๋์ ๋ช
"
FROM hr.employees e1 /* ์์์ ์ผ์ชฝ์ FK */
INNER JOIN hr.employees e2 /* ๋ถ๋ชจ๋ฅผ ์ค๋ฅธ์ชฝ์ PK */
ON e1.manager_id = e2.employee_id ; -- ์์์ FK์ ๋ถ๋ชจ์ PK
-- [๋ฌธ์ ] ์ ๋ฌธ์ ์์ Steven(์ฌ์ฅ, ์๊ด์ด ์์)๋ ์ถ๋ ฅ๋๋๋ก ํ์์ค
-- left outer join
SELECT e1.employee_id, e1.first_name AS "์ง์๋ช
", e2.employee_id, e2.first_name AS "๋งค๋์ ๋ช
"
FROM hr.employees e1 /* ์์์ ์ผ์ชฝ์ FK */
LEFT JOIN hr.employees e2 /* ๋ถ๋ชจ๋ฅผ ์ค๋ฅธ์ชฝ์ PK */
ON e1.manager_id = e2.employee_id ; -- ์์์ FK์ ๋ถ๋ชจ์ PK
๐ก key point : Steven์ ์ฌ์ฅ์ด๋ผ ์๊ด(๋งค๋์ )์ด ์์ด์ e1.manager_id๊ฐ NULL ๊ฐ. ๋ฐ๋ผ์ Steven์ ํจ๊ป ์กฐํํ๋ ค๋ฉด FK๊ฐ NULL ๊ฐ์ด๋ฉด ์กฐํํ์ง ์๋ INNER JOIN ๋์ FK๊ฐ NULL ๊ฐ์ด์ด๋ ์กฐํํ๋ OUTER JOIN์ ์ฌ์ฉํด์ผ ํจ