Claire's Study Note

[SQL Fundamentals] 02. ์กฐ์ธ(Join) - Outer ์กฐ์ธ, Non Equi ์กฐ์ธ, Cross ์กฐ์ธ

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

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

 

์„น์…˜2. ์กฐ์ธ(Join) - Outer ์กฐ์ธ, Non Equi ์กฐ์ธ, Cross ์กฐ์ธ

2-1. Inner ์กฐ์ธ, Left/Right Outer ์กฐ์ธ, Full Outer ์กฐ์ธ์˜ ์ดํ•ด

Inner Join

 

from A
	join B on A.key = B.key

 

inner๋ฅผ ์ƒ๋žตํ•˜๊ณ  (inner) join์œผ๋กœ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

join์˜ ๋ฐฉํ–ฅ์€ LEFT -> RIGHT์ด๋“  LEFT <- RIGHT์ด๋“  ์ƒ๊ด€์—†๋‹ค.

์œ„์˜ ์˜ˆ์‹œ์—์„œ LEFT ํ…Œ์ด๋ธ”๊ณผ RIGHT ํ…Œ์ด๋ธ”์˜ ๊ด€๊ณ„๊ฐ€ M:1์ด๋ฏ€๋กœ ์กฐ์ธ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ ๋ ˆ๋ฒจ์€ LEFT ํ…Œ์ด๋ธ”์˜ ์ง‘ํ•ฉ ๋ ˆ๋ฒจ์„ ๋”ฐ๋ฅด๊ฒŒ ๋˜๋ฉฐ ๊ฒฐ๊ณผ์ ์œผ๋กœ๋Š” ๋‘ ํ…Œ์ด๋ธ”์˜ ํ‚ค๊ฐ’์ด ์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๊ฑธ๋Ÿฌ์ ธ์„œ ๋‚˜์˜จ๋‹ค.

 

์„น์…˜1์˜ ์‹ค์Šต ์˜ˆ์ œ๊ฐ€ ๋ชจ๋‘ inner join์˜ ์˜ˆ์‹œ์ด๋ฏ€๋กœ ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” inner join์˜ ์‹ค์Šต ์˜ˆ์ œ๋Š” ์ƒ๋žตํ•œ๋‹ค.

 

(์ฐธ๊ณ ) inner join ์‹ค์Šต ์˜ˆ์ œ

https://moominie.tistory.com/33

 

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

๐Ÿ–ฅ๏ธ ๋ฐ์ดํ„ฐ ๋ถ„์„ SQL Fundamentals (๊ถŒ์ฒ ๋ฏผ, ์ธํ”„๋Ÿฐ) ์„น์…˜1. ์กฐ์ธ(Join) - ์กฐ์ธ ๊ธฐ๋ฐ˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜ 1-1. ์กฐ์ธ ๊ฐœ์š” ์กฐ์ธ(Join) RDBMS(Relational DBMS, ๊ด€๊ณ„ํ˜• DBMS)์—์„œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด์ž ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด

moominie.tistory.com

 

Left Outer Join

 

from A
	left join B on A.key = B.key

 

outer๋ฅผ ์ƒ๋žตํ•˜๊ณ  left (outer) join์œผ๋กœ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

join์˜ ๋ฐฉํ–ฅ์€ LEFT -> RIGHT๋กœ ์ •ํ•ด์ง€๋ฉฐ, ์ด๋•Œ LEFT ํ…Œ์ด๋ธ”์ด Outer ํ…Œ์ด๋ธ”์ด ๋˜๊ณ , RIGHT ํ…Œ์ด๋ธ”์ด Inner ํ…Œ์ด๋ธ”์ด ๋œ๋‹ค.

์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” LEFT ํ…Œ์ด๋ธ”๊ณผ RIGHT ํ…Œ์ด๋ธ”์˜ ๊ด€๊ณ„๊ฐ€ M:1์ด๋ฏ€๋กœ ์กฐ์ธ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์€ LEFT (Outer) ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ ๋ ˆ๋ฒจ์„ ๋”ฐ๋ผ๊ฐ€๋ฉด์„œ RIGHT ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” LEFT ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋“ค๋„ ๋ณด์กด๋œ๋‹ค.

 

Right Outer Join

 

from A
	right join B on A.key = B.key

 

Left Outer Join์˜ ๋ฐ˜๋Œ€ ๊ฐœ๋…์ด๋‹ค.

outer๋ฅผ ์ƒ๋žตํ•˜๊ณ  right (outer) join์œผ๋กœ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

join์˜ ๋ฐฉํ–ฅ์€ LEFT <- RIGHT๋กœ ์ •ํ•ด์ง€๋ฉฐ, ์ด๋•Œ RIGHT ํ…Œ์ด๋ธ”์ด Outer ํ…Œ์ด๋ธ”์ด ๋˜๊ณ , LEFT ํ…Œ์ด๋ธ”์ด Inner ํ…Œ์ด๋ธ”์ด ๋œ๋‹ค.

์œ„์˜ ์˜ˆ์‹œ์—์„œ LEFT ํ…Œ์ด๋ธ”๊ณผ RIGHT ํ…Œ์ด๋ธ”์˜ ๊ด€๊ณ„๊ฐ€ M:1์ด๋ฏ€๋กœ ์กฐ์ธ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์€ LEFT (Inner) ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ ๋ ˆ๋ฒจ์„ ๋”ฐ๋ผ๊ฐ€๋ฉด์„œ LEFT ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” RIGHT ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋„ ๋ณด์กด๋œ๋‹ค.

 

(์ฐธ๊ณ )

right join์€ LEFT ํ…Œ์ด๋ธ”๊ณผ RIGHT ํ…Œ์ด๋ธ”์˜ ์œ„์น˜๋งŒ ๋ฐ”๊พธ๋ฉด left join๊ณผ ๊ฒฐ๊ณผ๊ฐ€ ๋˜‘๊ฐ™๋‹ค.

์•„๋ž˜ ๋‘ join์˜ ๊ฒฐ๊ณผ๋Š” ๊ฐ™๋‹ค.

from A
	right join B on A.key = B.key

 

from B
	left join A on B.key = A.key

 

Full Outer Join

 

from A
	full join B on A.key = B.key

 

Online๋ณด๋‹ค๋Š” Batch์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

outer๋ฅผ ์ƒ๋žตํ•˜๊ณ  full (outer) join์œผ๋กœ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„์˜ ์˜ˆ์‹œ์—์„œ LEFT ํ…Œ์ด๋ธ”๊ณผ RIGHT ํ…Œ์ด๋ธ”์˜ ๊ด€๊ณ„๊ฐ€ M:1์ด๋ฏ€๋กœ ์กฐ์ธ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ ๋ ˆ๋ฒจ์€ LEFT ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ ๋ ˆ๋ฒจ์„ ๋”ฐ๋ผ๊ฐ€๋ฉด์„œ ์„œ๋กœ์˜ ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋“ค๊นŒ์ง€ ๋ชจ๋‘ ๋ณด์กด๋œ๋‹ค.

 

2-2. Outer ์กฐ์ธ ์‹ค์Šต

์‹ค์Šต์˜ˆ์ œ

1. ์ฃผ๋ฌธ์ด ๋‹จ ํ•œ๋ฒˆ๋„ ์—†๋Š” ๊ณ ๊ฐ ์ •๋ณด ๊ตฌํ•˜๊ธฐ

1
2
3
4
select c.*
from customers c 
    left join orders o on c.customer_id = o.customer_id
where o.order_id isnull;
 

 

๋‹จ ํ•œ๋ฒˆ๋„ ์ฃผ๋ฌธ์„ ํ•˜์ง€ ์•Š์•˜๋”๋ผ๋„ ๊ณ ๊ฐ ํ…Œ์ด๋ธ”์˜ ์ •๋ณด๋Š” ๋ณด์กด์ด ๋ผ์•ผ ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ customers ํ…Œ์ด๋ธ”์„ LEFT (Outer) ํ…Œ์ด๋ธ”๋กœ ํ•˜์—ฌ left join์„ ํ•˜๊ฒŒ ๋˜๋ฉด orders ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋”๋ผ๋„ customers ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์˜จ์ „ํžˆ ๋ณด์กด๋œ๋‹ค.

 

2. ๋ถ€์„œ์ •๋ณด์™€ ๋ถ€์„œ์— ์†Œ์†๋œ ์ง์›๋ช… ์ •๋ณด ๊ตฌํ•˜๊ธฐ. ๋ถ€์„œ๊ฐ€ ์ง์›์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋”๋ผ๋„ ๋ถ€์„œ์ •๋ณด๋Š” ํ‘œ์‹œ๋˜์–ด์•ผ ํ•จ

1
2
3
4
select d.*, e.empno, e.ename 
from hr.dept d 
    left join hr.emp e on d.deptno = e.deptno
order by d.deptno;

 

๋ถ€์„œ์— ์†Œ์†๋œ ์ง์›์ด ์—†๋”๋ผ๋„ ๋ถ€์„œ ํ…Œ์ด๋ธ”์˜ ์ •๋ณด๋Š” ๋ณด์กด์ด ๋ผ์•ผ ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ dept ํ…Œ์ด๋ธ”์„ LEFT (Outer) ํ…Œ์ด๋ธ”๋กœ ํ•˜์—ฌ left join์„ ํ•˜๊ฒŒ ๋˜๋ฉด emp ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋”๋ผ๋„ dept ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์˜จ์ „ํžˆ ๋ณด์กด๋œ๋‹ค.

 

์•„๋ž˜์™€ ๊ฐ™์ด emp ํ…Œ์ด๋ธ”์„ LEFT (Outer) ํ…Œ์ด๋ธ”๋กœ ํ•˜์—ฌ right join์„ ํ•˜๋”๋ผ๋„ ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•˜๊ฒŒ ๋‚˜์˜จ๋‹ค.

1
2
3
4
select d.*, e.empno, e.ename
from hr.emp e 
    right join hr.dept d on e.deptno = d.deptno 
order by d.deptno;

 

3. Madrid์— ์‚ด๊ณ  ์žˆ๋Š” ๊ณ ๊ฐ์ด ์ฃผ๋ฌธํ•œ ์ฃผ๋ฌธ ์ •๋ณด๋ฅผ ๊ตฌํ•  ๊ฒƒ.

๊ณ ๊ฐ๋ช…, ์ฃผ๋ฌธid, ์ฃผ๋ฌธ์ผ์ž, ์ฃผ๋ฌธ์ ‘์ˆ˜ ์ง์›๋ช…, ๋ฐฐ์†ก์—…์ฒด๋ช…์„ ๊ตฌํ•˜๋˜, ๋งŒ์ผ ๊ณ ๊ฐ์ด ์ฃผ๋ฌธ์„ ํ•œ๋ฒˆ๋„ ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ผ๋„ ๊ณ ๊ฐ์ •๋ณด๋Š” ๋น ์ง€๋ฉด ์•ˆ๋จ. ์ด๊ฒฝ์šฐ ์ฃผ๋ฌธ ์ •๋ณด๊ฐ€ ์—†์œผ๋ฉด ์ฃผ๋ฌธid๋ฅผ 0์œผ๋กœ ๋‚˜๋จธ์ง€๋Š” Null๋กœ ๊ตฌํ• ๊ฒƒ.

 

(๋‚˜์˜ ์ƒ๊ฐ)

1
2
3
4
5
6
7
select c.contact_name as customer_name, coalesce(o.order_id,0) as order_id, o.order_date, concat(e.first_name, ' ', e.last_name) as employee_name, s.company_name as shipper_name
from customers c 
    left join orders o on c.customer_id = o.customer_id
    join employees e on o.employee_id = e.employee_id
    join shippers s on o.ship_via = s.shipper_id
where c.city = 'Madrid'
order by c.customer_id, o.order_id;
 
 

 

์ฃผ๋ฌธ ์ •๋ณด๊ฐ€ ์—†๋”๋ผ๋„ ๊ณ ๊ฐ์ •๋ณด๋Š” ๋ณด์กด์ด ๋ผ์•ผ ํ•˜๋ฏ€๋กœ customers ํ…Œ์ด๋ธ”์„ LEFT (Outer) ํ…Œ์ด๋ธ”๋กœ ํ•˜์—ฌ orders ํ…Œ์ด๋ธ”์„ left join ํ–ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ orders ํ…Œ์ด๋ธ”์˜ employee ์ •๋ณด๋‚˜ shipper ์ •๋ณด๊ฐ€ employees ํ…Œ์ด๋ธ”๊ณผ shippers ํ…Œ์ด๋ธ”์— ํ•ญ์ƒ ์กด์žฌํ•˜๋ฏ€๋กœ employees, shippers ํ…Œ์ด๋ธ”์„ ๊ทธ๋ƒฅ inner join์œผ๋กœ ๊ฑธ์–ด์ฃผ์—ˆ๋Š”๋ฐ ์ด๊ฒŒ ์ž˜๋ชป๋œ ํŒ๋‹จ์ด์—ˆ๋‹ค.

์ฃผ๋ฌธ ์ •๋ณด๊ฐ€ ์—†๋Š” ๊ณ ๊ฐ์˜ ๊ฒฝ์šฐ orders ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ NULL ๊ฐ’์œผ๋กœ ๋‚˜์˜จ๋‹ค.

 

์ฆ‰, employees ํ…Œ์ด๋ธ”๊ณผ์˜ join ํ‚ค ๊ฐ’์ด ๋˜๋Š” employee_id๋„ NULL์ด๊ธฐ ๋•Œ๋ฌธ์— inner join์„ ํ•  ๊ฒฝ์šฐ ํ•ด๋‹น ๊ณ ๊ฐ์˜ ๋ฐ์ดํ„ฐ๋Š” ์ œ์™ธ๋œ๋‹ค.

shippers ํ…Œ์ด๋ธ”๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ join ํ‚ค ๊ฐ’์ด ๋˜๋Š” ship_via๊ฐ€ NULL์ด๊ธฐ ๋•Œ๋ฌธ์— inner join์„ ํ•  ๊ฒฝ์šฐ ํ•ด๋‹น ๊ณ ๊ฐ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ œ์™ธ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ์ฃผ๋ฌธ ์ •๋ณด๊ฐ€ ์—†๋Š” ๊ณ ๊ฐ์ •๋ณด๋„ ๋ณด์กด๋˜๊ธฐ ์œ„ํ•ด์„œ๋Š” employees, shippers ํ…Œ์ด๋ธ”๋„ ๋ชจ๋‘ left join์„ ๊ฑธ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

(์ •๋‹ต)

1
2
3
4
5
6
7
select c.contact_name as customer_name, coalesce(o.order_id,0) as order_id, o.order_date, e.first_name || ' ' || e.last_name as employee_name, s.company_name as shipper_name
from customers c 
    left join orders o on c.customer_id = o.customer_id
    left join employees e on o.employee_id = e.employee_id
    left join shippers s on o.ship_via = s.shipper_id
where c.city = 'Madrid'
order by c.customer_id, o.order_id;

 

์ฃผ๋ฌธ ์ •๋ณด๊ฐ€ ์—†๋Š” ๊ณ ๊ฐ์ •๋ณด๊ฐ€ ๋ณด์กด๋˜๋ฉด์„œ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”๋‹ค.

 

COALESCE(์ธ์ž1, ์ธ์ž2)

postgreSQL, MySQL, Oracle ๊ณตํ†ต ํ•จ์ˆ˜

์ธ์ž1์˜ ๊ฐ’์ด NULL์ด ์•„๋‹ˆ๋ฉด ์ธ์ž1๋กœ, ์ธ์ž1์˜ ๊ฐ’์ด NULL์ธ ๊ฒฝ์šฐ์—๋Š” ์ธ์ž2๋กœ ๋‚˜์˜จ๋‹ค.

 

(์ฐธ๊ณ )

IFNULL(์ธ์ž1, ์ธ์ž2)

MySQL ํ•จ์ˆ˜

COALESCE์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ธ์ž1์˜ ๊ฐ’์ด NULL์ด ์•„๋‹ˆ๋ฉด ์ธ์ž1๋กœ, ์ธ์ž1์˜ ๊ฐ’์ด NULL์ธ ๊ฒฝ์šฐ์—๋Š” ์ธ์ž2๋กœ ๋‚˜์˜จ๋‹ค.

 

NVL(์ธ์ž1, ์ธ์ž2)

Oracle ํ•จ์ˆ˜

COALESCE์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ธ์ž1์˜ ๊ฐ’์ด NULL์ด ์•„๋‹ˆ๋ฉด ์ธ์ž1๋กœ, ์ธ์ž1์˜ ๊ฐ’์ด NULL์ธ ๊ฒฝ์šฐ์—๋Š” ์ธ์ž2๋กœ ๋‚˜์˜จ๋‹ค.

 

NVL(์ธ์ž1, ์ธ์ž2, ์ธ์ž3)

Oracle ํ•จ์ˆ˜

์ธ์ž1์˜ ๊ฐ’์ด NULL์ด ์•„๋‹ˆ๋ฉด ์ธ์ž2๋กœ, ์ธ์ž1์˜ ๊ฐ’์ด NULL์ด๋ฉด ์ธ์ž3์œผ๋กœ ๋‚˜์˜จ๋‹ค.

 

COALESCE(์ธ์ž1, ์ธ์ž2, ์ธ์ž3)

์ธ์ž1์˜ ๊ฐ’์ด NULL์ด๋ฉด ์ธ์ž2๋กœ, ์ธ์ž2์˜ ๊ฐ’๋„ NULL์ด๋ฉด ์ธ์ž3์œผ๋กœ ๋‚˜์˜จ๋‹ค.

 

4. order_items์— ์ฃผ๋ฌธ๋ฒˆํ˜ธ(order_id)๊ฐ€ ์—†๋Š” order_id๋ฅผ ๊ฐ€์ง„ orders ๋ฐ์ดํ„ฐ ์ฐพ๊ธฐ

1
2
3
4
select *
from orders o 
    left join order_items oi on o.order_id = oi.order_id
where oi.order_id isnull;

 

์‹ค์ œ ์—…๋ฌด์—์„œ ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š”๋ฐ ์ž์‹ ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”์ง€ ์ •ํ•ฉ์„ฑ์„ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•ด ์œ„์™€ ๊ฐ™์ด left outer join์„ ์“ฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

 

2-3. Full Outer ์กฐ์ธ ์‹ค์Šต

์‹ค์Šต์˜ˆ์ œ

1. ์†Œ์† ์ง์›์ด ์—†๋Š” ๋ถ€์„œ ์ •๋ณด๋ฅผ ๋ณด์กดํ•˜๊ณ , ์†Œ์† ๋ถ€์„œ๊ฐ€ ์—†๋Š” ์ง์› ์ •๋ณด๋„ ๋ณด์กดํ•˜์—ฌ ์–‘์ชฝ ๋ชจ๋‘์˜ ์ง‘ํ•ฉ์ด ๋ˆ„๋ฝ๋˜์ง€ ์•Š๋„๋ก ๋ฐ์ดํ„ฐ ์ถ”์ถœํ•˜๊ธฐ

1
2
3
4
select d.deptno, d.dname, et.empno, et.ename
from dept d 
    full outer join emp_test et on d.deptno = et.deptno
order by d.deptno, et.empno;

 

2-4. Non Equi ์กฐ์ธ๊ณผ Cross ์กฐ์ธ์˜ ์ดํ•ด

Equi Join

์กฐ์ธ ์‹œ ์—ฐ๊ฒฐํ•˜๋Š” ํ‚ค ๊ฐ’์ด ์„œ๋กœ ๊ฐ™์€ ๊ฒฝ์šฐ (์ฆ‰, =๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒฝ์šฐ)

์—ฌํƒœ๊นŒ์ง€ ํ–ˆ๋˜ ์กฐ์ธ ์‹ค์Šต ๋ชจ๋‘ Equi Join์— ์†ํ•œ๋‹ค.

 

Non Equi Join

๋‘ ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•  ๋•Œ ๊ผญ ์กฐ์ธ ํ‚ค ๊ฐ’์ด ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„ ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•œ๋‹ค๋ฉด ์–ผ๋งˆ๋“ ์ง€ ์—ฐ๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ฆ‰, ํ‚ค ๊ฐ’์œผ๋กœ ์—ฐ๊ฒฐ ์‹œ =์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์—ฐ์‚ฐ์ž(between, >, >=, <, <=)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์กฐ์ธ์„ ๋งํ•œ๋‹ค.

 

(์˜ˆ์‹œ) Between Join

- ์ง์›์ •๋ณด์™€ ๊ธ‰์—ฌ๋“ฑ๊ธ‰ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ

 

1
2
3
4
select e.empno, e.ename, e.sal, s.grade
from emp e 
    join salgrade s on e.sal between s.losal and s.hisal
order by e.empno;
 
 

 

Cross Join (Cartesian Product Join)

์กฐ์ธ ์ปฌ๋Ÿผ์—†์ด ๋‘ ํ…Œ์ด๋ธ” ๊ฐ„ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์—ฐ๊ฒฐ์„ ๊ฒฐํ•ฉํ•˜๋Š” ์กฐ์ธ ๋ฐฉ์‹

์กฐ์ธ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์€ ๋‘ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ ๊ฑด์ˆ˜๋ฅผ ๊ณฑํ•œ ๊ฒฐ๊ณผ๋งŒํผ ๋‚˜์˜จ๋‹ค.

๋‹จ, where ์กฐ๊ฑด์œผ๋กœ ๊ฑธ๋Ÿฌ์งˆ ๊ฒฝ์šฐ ๊ณฑ์…ˆ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ ๊ฑด์ˆ˜์™€ ์ผ์น˜ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค.

 

(์˜ˆ์‹œ)

 

1
2
3
select a.*, b.*
from table a
    cross join table b;

 

2-5. Non Equi ์กฐ์ธ๊ณผ Cross ์กฐ์ธ ์‹ค์Šต

์‹ค์Šต์˜ˆ์ œ

1. ์ง์› ๊ธ‰์—ฌ์˜ ์ด๋ ฅ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ํ•ด๋‹น ๊ธ‰์—ฌ๋ฅผ ๊ฐ€์กŒ๋˜ ์‹œ์ž‘ ์‹œ์ ์—์„œ์˜ ๋ถ€์„œ๋ฒˆํ˜ธ๋„ ํ•จ๊ป˜ ๊ฐ€์ ธ์˜ฌ๊ฒƒ

1
2
3
select * 
from hr.emp_salary_hist a
    join hr.emp_dept_hist b on a.empno = b.empno and a.fromdate between b.fromdate and b.todate;

 

์•„๋ž˜์™€ ๊ฐ™์ด ๊ธ‰์—ฌ ์‹œ์ž‘ ์‹œ์  ์กฐ๊ฑด์„ join ์กฐ๊ฑด์ด ์•„๋‹Œ where์ ˆ์— ๋‘์–ด๋„ ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•˜๋‹ค.

1
2
3
4
select * 
from hr.emp_salary_hist a
    join hr.emp_dept_hist b on a.empno = b.empno
where a.fromdate between b.fromdate and b.todate;

 

(TODO) ๋‘ ์ฟผ๋ฆฌ์˜ ์„ฑ๋Šฅ์€?

๋ฐ˜์‘ํ˜•

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

Claire's Study Note

Hi.Claire

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