Claire's Study Note

[SQL Fundamentals] 01. ์กฐ์ธ(Join) - ์กฐ์ธ ๊ธฐ๋ฐ˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜

by Hi.Claire
๋ฐ˜์‘ํ˜•

๐Ÿ–ฅ๏ธ ๋ฐ์ดํ„ฐ ๋ถ„์„ SQL Fundamentals (๊ถŒ์ฒ ๋ฏผ, ์ธํ”„๋Ÿฐ)

 

์„น์…˜1. ์กฐ์ธ(Join) - ์กฐ์ธ ๊ธฐ๋ฐ˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜

1-1. ์กฐ์ธ(Join) ๊ฐœ์š”

์กฐ์ธ(Join)

RDBMS(Relational DBMS, ๊ด€๊ณ„ํ˜• DBMS)์—์„œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด์ž ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ

๋‘ ๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์„ ์„œ๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

๋‘ ํ…Œ์ด๋ธ”์ด join ํ‚ค ๊ฐ’์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋ฉด ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์–ผ๋งˆ๋“ ์ง€ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

 

1-2. ์กฐ์ธ ์‹œ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ ๋ ˆ๋ฒจ์˜ ๋ณ€ํ™” ์ดํ•ด

์กฐ์ธ ์‹œ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ ๋ ˆ๋ฒจ์˜ ๋ณ€ํ™”

์กฐ์ธ ์ปฌ๋Ÿผ์„ ๊ธฐ์ค€์œผ๋กœ 1์ธ ์ง‘ํ•ฉ(ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ uniqueํ•˜๊ฒŒ ์กด์žฌ)๊ณผ M(ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ์ค‘๋ณต์œผ๋กœ ์กด์žฌ)์ธ ์ง‘ํ•ฉ์ด ์žˆ์„ ๋•Œ, ์กฐ์ธ ๊ฒฐ๊ณผ๋Š” M ์ง‘ํ•ฉ์ด ๋œ๋‹ค.

์ฆ‰, 1:M ์กฐ์ธ ์‹œ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์€ M ์ง‘ํ•ฉ์˜ ๋ ˆ๋ฒจ์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•œ๋‹ค.

๋ฌผ๋ก  where ์กฐ๊ฑด ๋“ฑ์œผ๋กœ ๊ฑธ๋Ÿฌ์ง€๋ฉด ์กฐ์ธ ๊ฒฐ๊ณผ์˜ ๋ฐ์ดํ„ฐ ๊ฑด์ˆ˜๋Š” M ์ง‘ํ•ฉ์˜ ๋ฐ์ดํ„ฐ ๊ฑด์ˆ˜์™€ ๋™์ผํ•˜์ง€ ์•Š์„ ์ˆ˜๋Š” ์žˆ๋‹ค.

 

1-3. ์กฐ์ธ ์‹ค์Šต

๊ฐ•์˜ ์‹ค์Šต์šฉ HR ์Šคํ‚ค๋งˆ์˜ ERD

 

์ด๋ฏธ์ง€ ์ถœ์ฒ˜ : ๊ฐ•์˜์ž๋ฃŒ

 

Master ํ…Œ์ด๋ธ” : ๊ธฐ์ค€ ์ •๋ณด๋ฅผ ๊ฐ€์ง„๋‹ค.

์ด๋ ฅ ํ…Œ์ด๋ธ” : ์ด๋ ฅ์„ ๊ด€๋ฆฌํ•œ๋‹ค.

 

์‹ค์Šต ์˜ˆ์ œ

1. ๋ถ€์„œ๋ช… SALES์™€ RESEARCH์˜ ์†Œ์† ์ง์›๋“ค์˜ ๋ถ€์„œ๋ช…, ์ง์›๋ฒˆํ˜ธ, ์ง์›๋ช…, JOB ๊ทธ๋ฆฌ๊ณ  ๊ณผ๊ฑฐ ๊ธ‰์—ฌ ์ •๋ณด ์ถ”์ถœ

1
2
3
4
5
6
select d.dname, e.empno, e.ename, e.job, esh.fromdate, esh.todate, esh.sal
from dept d 
    join emp e on d.deptno = e.deptno 
    join emp_salary_hist esh on e.empno = esh.empno 
where d.dname in ('SALES''RESEARCH')
order by d.dname, e.empno, esh.fromdate;
 
 

 

์กฐ์ธ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ ๋ ˆ๋ฒจ์€ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™”ํ• ๊นŒ?

dept์™€ emp ํ…Œ์ด๋ธ”์˜ ๊ด€๊ณ„๊ฐ€ 1:M์ด๊ณ , ๋‹ค์‹œ emp์™€ emp_salary_hist ํ…Œ์ด๋ธ”์˜ ๊ด€๊ณ„๊ฐ€ 1:M์ด๋‹ค.

๋”ฐ๋ผ์„œ ์กฐ์ธ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ ๋ ˆ๋ฒจ์€ emp_salary_hist๋ฅผ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผ๊ฐ„๋‹ค.

 

2. ๋ถ€์„œ๋ช… SALES์™€ RESEARCH์˜ ์†Œ์† ์ง์›๋“ค์˜ ๋ถ€์„œ๋ช…, ์ง์›๋ฒˆํ˜ธ, ์ง์›๋ช…, JOB ๊ทธ๋ฆฌ๊ณ  ๊ณผ๊ฑฐ ๊ธ‰์—ฌ ์ •๋ณด์ค‘ 1983๋…„ ์ด์ „ ๋ฐ์ดํ„ฐ๋Š” ๋ฌด์‹œํ•˜๊ณ  ๋ฐ์ดํ„ฐ ์ถ”์ถœ

1
2
3
4
5
6
7
select d.dname, e.empno, e.ename, e.job, esh.fromdate, esh.todate, esh.sal
from dept d 
    join emp e on d.deptno = e.deptno 
    join emp_salary_hist esh on e.empno = esh.empno 
where d.dname in ('SALES''RESEARCH')
and esh.fromdate >= to_date('19830101''yyyymmdd'
order by d.dname, e.empno, esh.fromdate;
 
 

 

TO_DATE('๋ฌธ์ž์—ด', '๋‚ ์งœ ํ˜•์‹')

์˜ค๋ผํด ๋ฌธ์ž์—ด(varchar) ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ ์งœ(date) ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜

(์˜ˆ) TO_DATE('19830101', 'yyyymmdd')

 

3. ๋ถ€์„œ๋ช… SALES์™€ RESEARCH ์†Œ์† ์ง์›๋ณ„๋กœ ๊ณผ๊ฑฐ๋ถ€ํ„ฐ ํ˜„์žฌ๊นŒ์ง€ ๋ชจ๋“  ๊ธ‰์—ฌ๋ฅผ ์ทจํ•ฉํ•œ ํ‰๊ท  ๊ธ‰์—ฌ

1
2
3
4
5
6
7
8
9
10
11
12
with temp_01
as
(select d.dname, e.empno, e.ename, esh.fromdate, esh.todate, esh.sal 
from dept d
    join emp e on d.deptno = e.deptno
    join emp_salary_hist esh on e.empno = esh.empno
where d.dname in ('SALES''RESEARCH')
order by d.dname, e.empno, esh.fromdate
)
select empno, max(ename) as ename, avg(sal) as avg_sal
from temp_01
group by empno;
 
 

 

์ฟผ๋ฆฌ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ ๋ ˆ๋ฒจ์„ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™”ํ• ๊นŒ?

๋จผ์ € ์กฐ์ธ ๊ฒฐ๊ณผ๋กœ๋Š” ์‹ค์Šต ์˜ˆ์ œ 1์—์„œ ์‚ดํŽด๋ณธ ๋ฐ”์™€ ๊ฐ™์ด emp_salary_hist์˜ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ ๋ ˆ๋ฒจ์„ ๋”ฐ๋ฅด๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ group by๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ ๋ ˆ๋ฒจ์€ empno ๋ ˆ๋ฒจ๋กœ ๋ฐ”๋€Œ๊ฒŒ ๋œ๋‹ค.

 

(์ฃผ์˜) group by ์ˆ˜ํ–‰ ์‹œ select ์ ˆ์—๋Š” group by์— ๋ช…์‹œ๋œ ์ปฌ๋Ÿผ๊ณผ ์ง‘๊ณ„ ํ•จ์ˆ˜(aggregate function)๋งŒ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

 

1-4. ๋ฐ์ดํ„ฐ ์—ฐ๊ฒฐ ๊ด€๊ณ„ ํŒŒ์•…ํ•˜๊ธฐ

์ด๋ฏธ์ง€ ์ถœ์ฒ˜ : ๊ฐ•์˜์ž๋ฃŒ

 

๋Œ€๋ถ€๋ถ„์€ 1:M ๊ด€๊ณ„๋‹ค.

CUSTOMERS์™€ ORDERS์˜ ๊ด€๊ณ„๋Š” 1:M์ด๋ฉฐ, EMPLOYEES์™€ ORDERS์˜ ๊ด€๊ณ„๋„ 1:M์ด๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ PRODUCTS์™€ ORDERS์˜ ๊ด€๊ณ„, ํ˜น์€ PRODUCTS์™€ WAREHOUSE์˜ ๊ด€๊ณ„๋Š” M:N์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ƒํ’ˆ A๋Š” ์ฃผ๋ฌธ 1์—๋„ ์žˆ์„ ์ˆ˜ ์žˆ๊ณ , ์ฃผ๋ฌธ 2์—๋„ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฃผ๋ฌธ 1์—๋Š” ์ƒํ’ˆ A๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ , ์ƒํ’ˆ B๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค.

 

์ด๋Ÿด ๊ฒฝ์šฐ ๋ณดํ†ต ์ค‘๊ฐ„์— ๊ด€๊ณ„ํ…Œ์ด๋ธ”์„ ๋‘์–ด ๊ด€๊ณ„๋ฅผ ํ’€์–ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

PRODUCTS์™€ ORDERS์˜ ์‚ฌ์ด์—๋Š” ๊ด€๊ณ„ํ…Œ์ด๋ธ” ORDER_ITEMS๊ฐ€ ์žˆ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ PRODUCTS์™€ WAREHOUSES ์‚ฌ์ด์—๋Š” ๊ด€๊ณ„ํ…Œ์ด๋ธ” INVENTORIES๊ฐ€ ์žˆ๋‹ค.

๊ด€๊ณ„ํ…Œ์ด๋ธ”๋กœ M:N ๊ด€๊ณ„๋ฅผ ํ’€์–ด๋‚ด๋Š” ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ฃผ๋ฌธ 1์— ์ƒํ’ˆ A์˜ ์ฃผ๋ฌธ์ˆ˜๋Ÿ‰ 1๊ฐœ, ์ฃผ๋ฌธ 1์— ์ƒํ’ˆ B์˜ ์ฃผ๋ฌธ์ˆ˜๋Ÿ‰ 3๊ฐœ, ์ฃผ๋ฌธ 2์— ์ƒํ’ˆ A์˜ ์ฃผ๋ฌธ์ˆ˜๋Ÿ‰ 10๊ฐœ, ์ฃผ๋ฌธ 2์— ์ƒํ’ˆ B์˜ ์ฃผ๋ฌธ์ˆ˜๋Ÿ‰ 5๊ฐœ ๋ผ๊ณ  ๊ฐ€์ •ํ•˜์ž. 

์ด๋•Œ, PRODUCTS์™€ ORDER_ITEMS์˜ ๊ด€๊ณ„๋Š” 1:M, ORDERS์™€ ORDER_ITEMS์˜ ๊ด€๊ณ„๋„ 1:M์ด๋‹ค.

PRODUCTS์™€ ORDERS ํ…Œ์ด๋ธ” ์‚ฌ์ด์— ๊ด€๊ณ„ํ…Œ์ด๋ธ” ORDER_ITEMS๋ฅผ ๋‘์–ด M:N ๊ด€๊ณ„๋ฅผ ํ’€์–ด๋ƒˆ๋‹ค.

 

๊ฐ•์˜ ์‹ค์Šต์šฉ nw ์Šคํ‚ค๋งˆ

 

์ด๋ฏธ์ง€ ์ถœ์ฒ˜ : ๊ฐ•์˜์ž๋ฃŒ

 

1-5. ์กฐ์ธ ์‹ค์Šต

์‹ค์Šต ์˜ˆ์ œ

1. ๊ณ ๊ฐ๋ช… Antonio Moreno๊ฐ€ 1997๋…„์— ์ฃผ๋ฌธํ•œ ์ฃผ๋ฌธ ์ƒํ’ˆ์ •๋ณด๋ฅผ ๊ณ ๊ฐ ์ฃผ์†Œ, ์ฃผ๋ฌธ ์•„์ด๋””, ์ฃผ๋ฌธ์ผ์ž, ๋ฐฐ์†ก์ผ์ž, ๋ฐฐ์†ก ์ฃผ์†Œ ๋ฐ ์ฃผ๋ฌธ ์ƒํ’ˆ์•„์ด๋””, ์ฃผ๋ฌธ ์ƒํ’ˆ๋ช…, ์ฃผ๋ฌธ ์ƒํ’ˆ๋ณ„ ๊ธˆ์•ก, ์ฃผ๋ฌธ ์ƒํ’ˆ์ด ์†ํ•œ ์นดํ…Œ๊ณ ๋ฆฌ๋ช…, supplier๋ช…์„ ๊ตฌํ•  ๊ฒƒ.

1
2
3
4
5
6
7
8
9
10
11
select a.contact_name, a.address, b.order_id, b.order_date, b.shipped_date, b.ship_address
    , c.product_id, d.product_name, c.amount, e.category_name, f.contact_name as supplier_name
from nw.customers a
    join nw.orders b on a.customer_id = b.customer_id
    join nw.order_items c on b.order_id = c.order_id
    join nw.products d on c.product_id = d.product_id
    join nw.categories e on d.category_id = e.category_id
    join nw.suppliers f on d.supplier_id = f.supplier_id
where a.contact_name = 'Antonio Moreno'
and b.order_date between to_date('19970101''yyyymmdd') and to_date('19971231''yyyymmdd')
;
 
 

 

์กฐ์ธ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ ๋ ˆ๋ฒจ์€ ์–ด๋–ป๊ฒŒ ๋ณ€ํ• ๊นŒ?

customer์™€ orders๊ฐ€ 1:M, orders์™€ order_items๊ฐ€ 1:M ๊ด€๊ณ„๋‹ค.

products์™€ order_items๋„ 1:M ๊ด€๊ณ„๋‹ค.

categories์™€ products๋Š” 1:M, suppliers์™€ products๋„ 1:M ๊ด€๊ณ„์ด๋ฏ€๋กœ ๊ฒฐ๊ตญ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ ๋ ˆ๋ฒจ์„ order_items๋ฅผ ๋”ฐ๋ผ๊ฐ€๊ฒŒ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ์กฐ์ธ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋Š” order_items์˜ PK์ธ order_id, product_id๋ฅผ ํ‚ค๊ฐ’์œผ๋กœ ๊ฐ€์ง„๋‹ค.

์ตœ์ข…์ ์œผ๋กœ๋Š” where์ ˆ์— ์˜ํ•ด ์ œํ•œ๋œ ๊ฑด์ˆ˜์˜ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚˜์˜จ๋‹ค.

 

๊ฒฐ๊ณผ

 

๋ฐ˜์‘ํ˜•

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Claire's Study Note

Hi.Claire

ํ™œ๋™ํ•˜๊ธฐ