Day 21 Database

์›ฐ์น˜์Šคยท2022๋…„ 11์›” 21์ผ
0

22/11/21

๐Ÿ“Œ 4. ์กฐ์ธ(join)

  • employees์˜ manager_id : ์ง์›์˜ ๋งค๋‹ˆ์ € id (์ง์›์˜ ์ƒ์‚ฌ์˜ empid)
    departments์˜ manager_id : ๋ถ€์„œ์˜ ๋งค๋‹ˆ์ € id (๋ถ€์„œ์žฅ์˜ empid)

  • employees์˜ manager_id์™€ departments์˜ manager_id ์ข‹์ง€ ์•Š์€ ์ปฌ๋Ÿผ์˜ ๋ฐฐ์น˜!!
    ์ฐจ๋ผ๋ฆฌ Employees์•ˆ์—์„œ manager_id ์™€ Employee_id ์—ฐ๊ด€ ์žˆ๋‹ค.
    ย ย ย ย ย ย ย ย ย Departments์˜ manager_id์™€ Employee_id ์—ฐ๊ด€ ์žˆ๋‹ค.

Ex 2) employees ํ…Œ์ด๋ธ”๊ณผ departments ํ…Œ์ด๋ธ” ์‚ฌ์šฉ
department_id, department_name, ๋ถ€์„œ์˜ manager_id, ๋ถ€์„œ์˜ ๋งค๋‹ˆ์ € ์ด๋ฆ„(last_name)์„ ํ•จ๊ป˜ ์ถœ๋ ฅํ•˜์‹œ์˜ค.

select departments.department_id, department_name, 
		departments.manager_id, last_name as "๋งค๋‹ˆ์ € ์ด๋ฆ„"
from departments join employees
on departments.manager_id = employees.employee_id;
-- (==)
select departments.department_id, department_name, 
		departments.manager_id, last_name as "๋งค๋‹ˆ์ € ์ด๋ฆ„"
from departments join employees
on employees.employee_id = departments.manager_id;	
-- ์ฃ„๋ณ€๊ณผ ์šฐ๋ณ€์„ ๋ฐ”๊ฟจ์ง€๋งŒ ๊ฒฐ๊ณผ๋Š” ๊ฐ™๋‹ค.

Ex3) employees ํ…Œ์ด๋ธ”๊ณผ departments ํ…Œ์ด๋ธ” ์‚ฌ์šฉ
์ „์ฒด ์‚ฌ์›๋“ค์˜ employee_id, last_name, salary, ์ง์›์˜ manager_id, ์ง์›์ด ์†Œ์†๋œ ๋ถ€์„œ์˜ department_id, department_name, ๋ถ€์„œ์˜ manager_id๋ฅผ ํ•จ๊ป˜ ์ถœ๋ ฅํ•˜์‹œ์˜ค.

select employee_id, last_name, salary, 
		employees.manager_id as "์ง์›์˜ ๋งค๋‹ˆ์ €",
		departments.department_id, department_name, 
        departments.manager_id as "๋ถ€์„œ์˜ ๋งค๋‹ˆ์ €"
from employees join departments
on employees.department_id = departments.department_id;
-- (==)
select employees.employee_id,employees.last_name, employees.salary, 
		employees.manager_id as "์ง์›์˜ ๋งค๋‹ˆ์ €", 
		departments.department_id, departments.department_name, 
        departments.manager_id as "๋ถ€์„œ์˜ ๋งค๋‹ˆ์ €"
from employees join departments
on employees.department_id = departments.department_id;

  • ๋ชจ๋“  ์ปฌ๋Ÿผ๋ช… ์•ž์— ํ•˜๋‚˜ํ•˜๋‚˜(departments. employees.) ๋‹ค ๋ถ™์—ฌ์ฃผ๋ฉด ์ฟผ๋ฆฌ ๊ตฌ๋ฌธ์„ ์‹คํ–‰ํ•˜๋Š” ์†๋„(์„ฑ๋Šฅ)๊ฐ€ ํ›จ์”ฌ ๋นจ๋ผ์ง„๋‹ค.
    ์„ฑ๋Šฅ์€ ์ข‹์•„์งˆ์ง€ ๋ชจ๋ฅด์ง€๋งŒ ์ฟผ๋ฆฌ ๊ตฌ๋ฌธ์ด ๊ธธ์–ด์ง€๊ณ  ์ง€์ €๋ถ„ํ•ด์งˆ ์ˆ˜ ์žˆ์Œ
  • ํ…Œ์ด๋ธ” alias(๋ณ„๋ช…) : from ์ ˆ์— ์„ ์–ธํ•˜๊ณ  ์ฟผ๋ฆฌ๊ตฌ๋ฌธ ์ „์ฒด์— ์‚ฌ์šฉ๋จ.
select e.employee_id,e.last_name, e.salary,
		e.manager_id as "์ง์›์˜ ๋งค๋‹ˆ์ €", 
		d.department_id, d.department_name,
        d.manager_id as "๋ถ€์„œ์˜ ๋งค๋‹ˆ์ €"
from employees e join departments d
on e.department_id = d.department_id;

Ex4) departments ํ…Œ์ด๋ธ”๊ณผ locations ํ…Œ์ด๋ธ” ์‚ฌ์šฉ
๋ถ€์„œ์˜ department_id, department_name, ๋ถ€์„œ๊ฐ€ ์œ„์น˜ํ•œ city๋ช…์„ ํ•จ๊ป˜ ์ถœ๋ ฅํ•˜์‹œ์˜ค.

select d.department_id, d.department_name, l.city
from departments d join locations l
on d.location_id = l.location_id;

Ex5) employees ํ…Œ์ด๋ธ”๊ณผ jobs ํ…Œ์ด๋ธ” ์‚ฌ์šฉ
์ „์ฒด ์‚ฌ์›๋“ค์˜ employee_id, last_name, job_id, ์—…๋ฌด์˜ ์ „์ฒด ์ด๋ฆ„(job_title)์„ ํ•จ๊ป˜ ์ถœ๋ ฅํ•˜๋˜
employee_id๊ฐ€ 200๋ฏธ๋งŒ์ธ ์‚ฌ์›๋งŒ ์ถœ๋ ฅํ•˜๊ณ , employee_id๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•ด์„œ ์ถœ๋ ฅํ•˜์‹œ์˜ค.

select e.employee_id, e.last_name, e.job_id, j.job_title
from employees e join jobs j
on e.job_id = j.job_id
where e.employee_id < 200
order by e.employee_id;


๐Ÿ“‚ N๊ฐœ์˜ ํ…Œ์ด๋ธ” ์กฐ์ธํ•˜๊ธฐ

Ex6) employees, departments, locations ํ…Œ์ด๋ธ” ์‚ฌ์šฉ
์ง์›๋“ค์˜ employee_id, last_name, salary, department_id, department_name,
location_id, city์„ ํ•จ๊ป˜ ์ถœ๋ ฅํ•˜์‹œ์˜ค.

select e.employee_id, e.last_name, e.salary, d.department_id, 
		d.department_name, l.location_id, l.city
from employees e join departments d
on e.department_id = d.department_id
join locations l
on d.location_id = l.location_id;
-- (==)
select e.employee_id, e.last_name, e.salary, d.department_id, 
		d.department_name, l.location_id, l.city
from employees e join departments d join locations l
on e.department_id = d.department_id
and d.location_id = l.location_id; 		-- (on/and ๊ฐ€๋Šฅ)

-- ๋ฌธ๋ฒ• ์˜ค๋ฅ˜ (on / on ์—ฐ์†์œผ๋กœ๋Š” ๋ถˆ๊ฐ€๋Šฅ)
select e.employee_id, e.last_name, e.salary, d.department_id, 
		d.department_name, l.location_id, l.city
from employees e join departments d join locations l
on e.department_id = d.department_id
on d.location_id = l.location_id; 		-- (on / on ๋ถˆ๊ฐ€๋Šฅ)


๐Ÿ“‚ Self-join(์ž์ฒด์กฐ์ธ)

: ์ž๊ธฐ ์ž์‹  ํ…Œ์ด๋ธ”๊ณผ ์กฐ์ธํ•˜๋Š” ์œ ํ˜•.
ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์„ ๋งˆ์น˜ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์ธ๋“ฏ alias๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๋ถ€์—ฌํ•ด์„œ ์กฐ์ธ์„ ํ•จ.

โ—โ—โ—โ—โ— ํ—ท๊ฐˆ๋ฆผ ์ฃผ์˜ โ—โ—โ—โ—โ—
Ex7) employees ํ…Œ์ด๋ธ”๋กœ๋ถ€ํ„ฐ ์‚ฌ์›๋“ค์˜ employee_id, last_name, salary, job_id,
์ง์›์˜ ์ƒ์‚ฌID(manager_id)์™€ ์ง์›์˜ ์ƒ์‚ฌ ์ด๋ฆ„(last_name)์„ ํ•จ๊ป˜ ์ถœ๋ ฅํ•˜์‹œ์˜ค.

select  e1.employee_id, e1.last_name, e1.salary, e1.job_id, 
		e1.manager_id as "๋งค๋‹ˆ์ € ID", e2.last_name as "๋งค๋‹ˆ์ € ์ด๋ฆ„"
from employees e1 join employees e2
on e1.manager_id = e2.employee_id;
-- (==)
select  e1.employee_id, e1.last_name, e1.salary, e1.job_id, 
		e2.employee_id as "๋งค๋‹ˆ์ € ID", e2.last_name as "๋งค๋‹ˆ์ € ์ด๋ฆ„"
from employees e1 join employees e2
on e1.manager_id = e2.employee_id;

Ex8) employees, departments, jobs ํ…Œ์ด๋ธ” ์‚ฌ์šฉ
์ง์›๋“ค์˜ employee_id, last_name, salary, job_title, department_name์„ ํ•จ๊ป˜ ์ถœ๋ ฅํ•˜์‹œ์˜ค.

select e.employee_id, e.last_name, e.salary, j.job_title, d.department_name
from employees e join jobs j
on e.job_id = j.job_id
join departments d
on e.department_id = d.department_id;
-- (==)
select e.employee_id, e.last_name, e.salary, j.job_title, d.department_name
from employees e join jobs j join departments d
on e.job_id = j.job_id
and e.department_id = d.department_id;


โœ๏ธ <์—ฐ์Šต๋ฌธ์ œ>

  1. employees ํ…Œ์ด๋ธ”๊ณผ departments ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•˜์—ฌ ๋ชจ๋“  ์‚ฌ์›์˜ ์ •๋ณด์™€ ํ•จ๊ป˜
    ๋ถ€์„œ ์ •๋ณด๋ฅผ ํ•จ๊ป˜ ์ถœ๋ ฅํ•˜์‹œ์˜ค.
select e.employee_id, e.last_name, e.salary, e.department_id, d.department_name
from employees e join departments d
on e.department_id = d.department_id;

  1. employees ํ…Œ์ด๋ธ”๋กœ๋ถ€ํ„ฐ ๋ชจ๋“  ์‚ฌ์›์˜ last_name, employee_id, ๋งค๋‹ˆ์ € ์ด๋ฆ„, manager_id๋ฅผ
    ํ•จ๊ป˜ ์ถœ๋ ฅํ•˜์‹œ์˜ค
select e1.last_name as "Employee", e1.employee_id as "Emp#", 
		e2.last_name as "Manager", e1.manager_id as "Mgr#"
from employees e1 join employees e2
on e1.manager_id = e2.employee_id;
-- (==)
select e1.last_name as "Employee", e1.employee_id as "Emp#", 
		e2.last_name as "Manager", e2.employee_id as "Mgr#"
from employees e1 join employees e2
on e1.manager_id = e2.employee_id;

-- [์˜ค๋‹ต] ์ง์›์˜ ์ด๋ฆ„, ์ง์›์˜ ์‚ฌ๋ฒˆ, ์ง์›์˜ ๋งค๋‹ˆ์ € ์ด๋ฆ„(์—ฌ๊ธฐ๊นŒ์ง„ O)
ย ย ย ย ย ย ย ย ย ย ย ย ์ง์›์˜ ๋งค๋‹ˆ์ €์˜ ๋งค๋‹ˆ์ € ๋ฒˆํ˜ธ(X)

select e1.last_name as "Employee", e1.employee_id as "Emp#", 
	e2.last_name as "Manager", e2.manager_id as "Mgr#"
from employees e1 join employees e2
on e1.manager_id = e2.employee_id;


๐Ÿ“‚ ์กฐ์ธ : ์ถ”๊ฐ€ ์œ ํ˜•(outer join)

  • Inner join(๋‚ด๋ถ€์กฐ์ธ) : ์กฐ์ธ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํ–‰๋งŒ ๋ฐ˜ํ™˜ํ•˜๋Š” ์กฐ์ธ
  • Outer join(์™ธ๋ถ€์กฐ์ธ) : ๋งŒ์กฑํ•˜๋Š” ํ–‰๊ณผ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š” ํ–‰๊นŒ์ง€ ๋ฐ˜ํ™˜ํ•˜๋Š” ์กฐ์ธ

  • [์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•˜๋Š” ํ…Œ์ด๋ธ” ๋‚ด ๋ฐ์ดํ„ฐ ์ •๋ณด]
select employee_id, last_name, department_id
from employees
where department_id is null;	-- ์†Œ์†๋œ ๋ถ€์„œ๊ฐ€ ์—†๋Š” ์‚ฌ์› 1๋ช… ์žˆ์Œ.

select count(distinct department_id)
from employees;					-- 107๋ช…์˜ ์ง์›๋“ค์ด ์†Œ์†๋œ ๋ถ€์„œ์˜ ๊ฐœ์ˆ˜๋Š” 11๊ฐœ์ž„.

select*
from departments;				-- ์šฐ๋ฆฌ ํšŒ์‚ฌ์— ์กด์žฌํ•˜๋Š” ๋ถ€์„œ๋Š” 27๊ฐœ์ž„.
								-- 16๊ฐœ์˜ ๋ถ€์„œ๋Š” ๋น„์–ด์žˆ์Œ.

โœ inner join๊ณผ outer join ์˜ˆ์ œ

employees ํ…Œ์ด๋ธ”๊ณผ departments ํ…Œ์ด๋ธ”์„ department_id๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์กฐ์ธ์„ ํ•ด์„œ
์ง์›์ •๋ณด์™€ ๋ถ€์„œ์ •๋ณด ํ•จ๊ป˜ ์ถœ๋ ฅํ•˜์‹œ์˜ค.

  • [์ž‘์„ฑ1] inner join - 106๋ช… ์ถœ๋ ฅ/11๊ฐœ์˜ ๋ถ€์„œ ์ถœ๋ ฅ๋จ.
    ๋ฌธ์ œ์  : 1) ๋ถ€์„œ๊ฐ€ ์—†๋Š” ์‹ ์ž…์‚ฌ์›์€ ๊ฒฐ๊ณผ์— ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Œ.
    ย ย ย ย ย ย ย ย ย ย ย 2) ์ง์›์ด ์†Œ์†๋˜์–ด ์žˆ์ง€ ์•Š์€ ๋นˆ๋ถ€์„œ๊ฐ€ ๊ฒฐ๊ณผ์— ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Œ.ย ย ย ย ย ย ย ย ย ย ย ย 
select e.employee_id, e.last_name, e.salary, 
		e.department_id, d.department_name
from employees e join departments d
on e.department_id = d.department_id;

  • [์ž‘์„ฑ2] outer join - 107๋ช… ์ถœ๋ ฅ
    ๋ถ€์„œ๊ฐ€ ์—†๋Š” ์‹ ์ž…์‚ฌ์›๋„ ๊ฒฐ๊ณผ์— ๋‚˜ํƒ€๋‚จ.
    ์กฐ์ธ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š” ์™ผ์ชฝ ํ…Œ์ด๋ธ”์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ์„๋•Œ
select e.employee_id, e.last_name, e.salary, 
		e.department_id, d.department_name
from employees e left outer join departments d
on e.department_id = d.department_id;

  • [์ž‘์„ฑ3] outer join - ๋นˆ๋ถ€์„œ 16๊ฐœ ์ถ”๊ฐ€๋กœ ์ถœ๋ ฅ๋จ
    ์กฐ์ธ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š” ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ์„๋•Œ
select e.employee_id, e.last_name, e.salary, 
		d.department_id, d.department_name
from employees e right outer join departments d
on e.department_id = d.department_id;	

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด