๐Ÿ”ฅ SQL

[D+4] ์—‘์…€๋ณด๋‹ค ์‰ฌ์šด SQL(4) - ๋‹ค์–‘ํ•œ ์—ฐ์‚ฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— ์กฐํšŒ&์—ฐ์‚ฐํ•˜๊ธฐ (Sub query, INNER JOIN, LEFT JOIN)

๊น€์ˆฎ์—‰ 2024. 4. 18. 15:25

SQL ๊ธฐ์ดˆ ๊ฐ•์˜ ๋์„ ํ–ฅํ•ด ๋‹ฌ๋ ค๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค - !! ๋›ฐ์–ด, ๋‹ฌ๋ ค, ๋ฉˆ์ถ”์ง€๋งˆ!

 

โœ๏ธ STUDY INDEX 

1. ์—ฌ๋Ÿฌ ๋ฒˆ์˜ ์—ฐ์‚ฐ์„ ํ•œ ๋ฒˆ์˜ SQL๋ฌธ์œผ๋กœ, ์„œ๋ธŒ์ฟผ๋ฆฌ(Subquery)
2. ์„œ๋กœ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์„ ๋ฌถ์–ด์ฃผ๋Š” JOIN (inner, left)  
3. SQL ๊ตฌ์กฐ๋ฅผ ๋ณด๊ธฐ ์‰ฝ๊ฒŒ ์“ฐ๋Š” ์—ฐ์Šต

 

1. ์—ฌ๋Ÿฌ๋ฒˆ์˜ ์—ฐ์‚ฐ์„ ํ•œ ๋ฒˆ์˜ SQL๋ฌธ์œผ๋กœ, ์„œ๋ธŒ์ฟผ๋ฆฌ(Subquery)

ํ•œ ๋ฒˆ์— ๋๋‚˜์ง€ ์•Š๋Š” ์—ฐ์‚ฐ์„ ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ์œ ์šฉํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ ์„œ๋ธŒ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค. 

์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ๋ง ๊ทธ๋Œ€๋กœ SQL ์ฟผ๋ฆฌ ๋‚ด์— ํฌํ•จ๋œ ์ฟผ๋ฆฌ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์ฟผ๋ฆฌ์˜ ์ผ๋ถ€๋กœ ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ ๊ฐ’์€ ๋ณต์žกํ•œ ์—ฐ์‚ฐ, ๊ฒ€์ƒ‰, ํ•„ํ„ฐ๋ง ๋“ฑ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๋Š” ์—ญํ• ์„ ํ•ด์š”. ์ฟผ๋ฆฌ ์•ˆ์— ์ฟผ๋ฆฌ๋ฅผ ( ) ๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด ์ฃผ๋Š” ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 

 

๊ฐ„๋‹จํ•˜๊ฒŒ ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์†Œ๊ฐœํ•ด๋“œ๋ฆด๊ฒŒ์š”. 

  • ์—ฌ๋Ÿฌ ๋ฒˆ์˜ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ๋•Œ  
  • ์กฐ๊ฑด๋ฌธ์— ์—ฐ์‚ฐ ๋˜๋Š” ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋“ฑ๋“ฑ.  

๊ฐ•์˜์—์„œ ๋ฐฐ์šด ์‹ค์Šต์„ ์˜ˆ์‹œ๋กœ ๊ฐ€์ ธ์™€๋ดค์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์“ด ์ฟผ๋ฆฌ๋ผ ํ˜•ํƒœ๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์–ด์š”.

์ฐธ๊ณ ๋กœ ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ’์ด ์•„๋‹Œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณธ ์ฟผ๋ฆฌ์—์„œ ์กฐํšŒํ•  ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค.

(์–ด๋–ป๊ฒŒ ์•Œ์•˜๋ƒ๊ตฌ์š”? ์ œ ๊ฒฝํ—˜๋‹ด์ž…๋‹ˆ๋‹ค.)

-- [์‹ค์Šต] ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ํ™œ์šฉํ•œ ์—ฐ์‚ฐ๋ฌธ : ์Œ์‹์  ํ‰๊ท  ๋‹จ๊ฐ€๋ณ„ ์ˆ˜์ˆ˜๋ฃŒ ๊ณ„์‚ฐํ•˜๊ธฐ 
-- 1) ํ‰๊ท  ๋‹จ๊ฐ€ ๊ตฌํ•˜๊ธฐ, ๋‹จ๊ฐ€์— ๋”ฐ๋ฅธ ๊ตฌ๊ฐ„ ๊ตฌ๋ถ„ํ•˜๊ธฐ - avg, group by ์‚ฌ์šฉ  
-- 2) ๊ตฌ๊ฐ„์— ๋”ฐ๋ฅธ ์ˆ˜์ˆ˜๋ฃŒ ์ง€์ •ํ•˜๊ธฐ - case ๋ฌธ ์‚ฌ์šฉ 
-- 3) ์Œ์‹์  ์ด๋ฆ„, ์ˆ˜์ˆ˜๋ฃŒ๊ฐ€ ์ ์šฉ๋œ ๊ฐ’ ๊ฒฐ๊ณผ๋กœ ๋‚˜ํƒ€๋‚ด๊ธฐ 

select restaurant_name '์Œ์‹์ ๋ช…',
	   avg_price * raion_of_add as '์ˆ˜์ˆ˜๋ฃŒ๊ฐ€ ์ ์šฉ๋œ ๊ฐ€๊ฒฉ'
FROM 
	(SELECT restaurant_name,
		    avg_price,
		    case when avg_price < 5000 then 0.005
		   	     when avg_price between 5000 and 19999 then 0.01
		   	     when avg_price between 20000 and 29999 then 0.02
		   	     else 0.03 end as raion_of_add
	FROM 
		(SELECT restaurant_name , 
			    avg(price/quantity) as avg_price
		FROM food_orders 
		GROUP BY 1) a )b

 

2. ์„œ๋กœ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์„ ๋ฌถ์–ด์ฃผ๋Š” JOIN (inner join, left join)

ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์— ๋‚˜๋‰˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ์—” ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?  

๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ '๊ณตํ†ต ์ปฌ๋Ÿผ'์„ ๊ธฐ์ค€์„ ๋ฌถ์–ด์ฃผ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ์กฐ์ธ(Join) ์ž…๋‹ˆ๋‹ค. 

์—‘์…€ Vlook up๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ๊ณตํ†ต ์ปฌ๋Ÿผ์„ ๊ธฐ์ค€์œผ๋กœ ๋‘ ํ…Œ์ด๋ธ”์„ ํ•ฉ์ณ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ด ์ค๋‹ˆ๋‹ค!

๊ตฌ๋ถ„ ์‚ฌ์šฉ๋ฐฉ๋ฒ• ์˜๋ฏธ 
left join  select ์กฐํšŒํ•  ์ปฌ๋Ÿผ 
from ํ…Œ์ด๋ธ”1 as a left join ํ…Œ์ด๋ธ”2 as
on a.๊ณตํ†ต์ปฌ๋Ÿผ๋ช… = b.๊ณตํ†ต์ปฌ๋Ÿผ๋ช… 
๊ณตํ†ต ์ปฌ๋Ÿผ์„ ๊ธฐ์ค€์œผ๋กœ ๋ชจ๋‘ ์กฐํšŒ. 
์ฆ‰, ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์— ๊ฐ’์ด ์—†์–ด๋„ ์กฐํšŒ ๊ฐ€๋Šฅ 
inner join select ์กฐํšŒํ•  ์ปฌ๋Ÿผ 
from ํ…Œ์ด๋ธ”1 as a inner join ํ…Œ์ด๋ธ”2 as 
on a.๊ณตํ†ต์ปฌ๋Ÿผ๋ช… = b.๊ณตํ†ต์ปฌ๋Ÿผ๋ช… 
๊ณตํ†ต ์ปฌ๋Ÿผ์„ ๊ธฐ์ค€์œผ๋กœ, 
๋‘ ํ…Œ์ด๋ธ”์— ๋ชจ๋‘ ์žˆ๋Š” ๊ฐ’๋งŒ ์กฐํšŒ 

 

๊ฐ•์˜์—์„œ ์‹ค์Šต์œผ๋กœ ์งฐ๋˜ ์ฟผ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์™€ ๋ดค์–ด์š”.

์ถ”๊ฐ€๋กœ, ์•„๋ž˜ ๋‚ด์šฉ์€ join์„ ์‚ฌ์šฉํ•  ๋•Œ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”. 

  • ๊ณตํ†ต ์ปฌ๋Ÿผ์€ ๋ฌถ์–ด์ฃผ๊ธฐ ์œ„ํ•œ ๊ณตํ†ต ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— '์ปฌ๋Ÿผ๋ช…(์ด๋ฆ„)'์€ ๋‹ฌ๋ผ๋„ ๊ดœ์ฐฎ์•„์š”. 
  • join์œผ๋กœ ๋ฌถ์€ ํ…Œ์ด๋ธ”์—์„œ ์ปฌ๋Ÿผ์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋Š” ํ…Œ์ด๋ธ”๋ช….์ปฌ๋Ÿผ๋ช… ์œผ๋กœ ์ž‘์„ฑํ•ด์ฃผ์…”์•ผ ํ•ด์š”. 
-- ์ฃผ๋ฌธ ๊ฐ€๊ฒฉ๊ณผ ์ˆ˜์ˆ˜๋ฃŒ์œจ์„ ๊ณฑํ•˜์—ฌ ์ฃผ๋ฌธ๋ณ„ ์ˆ˜์ˆ˜๋ฃŒ์œจ ๊ตฌํ•˜๊ธฐ 
-- ์กฐํšŒ ์ปฌ๋Ÿผ : ์ฃผ๋ฌธ๋ฒˆํ˜ธ, ์‹๋‹น์ด๋ฆ„, ์ฃผ๋ฌธ ๊ฐ€๊ฒฉ, ์ˆ˜์ˆ˜๋ฃŒ์œจ, ์ˆ˜์ˆ˜๋ฃŒ (*์ˆ˜์ˆ˜๋ฃŒ์œจ์ด ์žˆ๋Š” ๊ฒฝ์šฐ๋งŒ ์กฐํšŒ)
-- 1) ๊ณตํ†ต์ปฌ๋Ÿผ์œผ๋กœ ํ•„์š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ํ…Œ์ด๋ธ”์„ ๋ฌถ๊ธฐ (*์ˆ˜์ˆ˜๋ฃŒ์œจ์ด ์—†๋Š” ๊ฒฝ์šฐ ์ œ์™ธ, inner join)
-- 2) ํ•„์š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๊ณ„์‚ฐํ•˜๊ธฐ 

SELECT f.order_id as '์ฃผ๋ฌธ๋ฒˆํ˜ธ' ,
	   f. restaurant_name as '์‹๋‹น ์ด๋ฆ„',
	   f.price as '์ฃผ๋ฌธ ๊ฐ€๊ฒฉ',
	   p.vat as '์ˆ˜์ˆ˜๋ฃŒ์œจ',
	   f.price * p.vat as '์ˆ˜์ˆ˜๋ฃŒ'
FROM food_orders f inner join payments p on f.order_id = p.order_id

 

์˜ค๋Š˜์˜ ๊ณต๋ถ€๋Š” ์—ฌ๊ธฐ๊นŒ์ง€์ž…๋‹ˆ๋‹ค. 

 

4์ผ ์ฐจ๋ถ€ํ„ฐ ์ฟผ๋ฆฌ ๊ธธ์ด๊ฐ€ ๊ธ‰ ์ฆ๊ฐ€ํ•œ ๊ธฐ๋ถ„์ž…๋‹ˆ๋‹ค.

์•„์ง๊นŒ์ง€ ์ €์—๊ฒ ์„œ๋ธŒ ์ฟผ๋ฆฌ๋Š” ์กฐ๊ธˆ ์–ด๋ ต๋„ค์š”. 

์–ธ์ œ ์“ฐ๋Š” ๊ฒƒ์ด ์ œ์ผ ์ ํ•ฉํ•œ์ง€ ๊ฐ์„ ์žก์ง€ ๋ชปํ–ˆ๊ฑฐ๋“ ์š”..  

์Šคํ„ฐ๋”” ๋กœ๊ทธ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ๊ฐ•์˜ ์‹ค์Šต์„ ๋ณต์Šตํ•˜๋Š”๋ฐ๋„ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์„œ ์Šฌํ”•๋‹ˆ๋‹ค๐Ÿฅฒ

 

๊ทธ๋ฆฌ๊ณ  ๋งค์ผ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค๋ฅผ ํ™œ์šฉํ•ด์„œ 2~3๊ฐœ์˜ ๊ฐ„๋‹จํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š”๋ฐ์š”. 

์•„์ง ์ €๋Š” ์ฟผ๋ฆฌ๋ฅผ ์งง๊ณ  ๋ช…๋ฃŒํ•˜๊ฒŒ ์งœ๊ธฐ๋ณด๋‹ค if ๋ฌธ์œผ๋กœ ๋Œ๋ ค๋Œ๋ ค ๋Œ๋ฆผํŒ๐ŸŽฏ ์ฒ˜๋Ÿผ ์งœ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์–ด์„œ,

์ž˜ํ•˜์‹œ๋Š” ๋ถ„๋“ค์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  '์–ด๋–ป๊ฒŒ ์ €๋ ‡๊ฒŒ ์ƒ๊ฐํ–ˆ์ง€?'๋ผ๋Š” ์ขŒ์ ˆ๊ฐ๊ณผ ์—ด๋“ฑ๊ฐ์„ ๋А๋ผ๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ๋ญ ์–ด์ฉŒ๊ฒ ์–ด์š”. ์—ด์‹ฌํžˆ ๋…ธ๋ ฅํ•ด์•ผ์ง€..

๊ฐœ๋ฐœ์ž๋“ค์˜ ์‚ฌ๊ณ ๋ฐฉ์‹(๋…ผ๋ฆฌ ๊ณผ์ •)์„ ์ €์—๊ฒŒ๋„ ํƒ‘์žฌํ•  ์ˆ˜ ์žˆ๋„๋ก

๊ณต๋ถ€๋Ÿ‰์œผ๋กœ ์Šน๋ถ€๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋”๋” ์—ด์‹ฌํžˆ ํ•ด์•ผ๊ฒ ์–ด์š”! ์ œ ์žฅ์ ์€ ๋ˆ๊ธฐ๋ž๋‹ˆ๋‹ค ^^

 

ํ˜น์‹œ ์ €์ฒ˜๋Ÿผ ๋น„์ „๊ณต์ž์ธ๋ฐ ๋น„์Šทํ•œ ๊ณ ๋ฏผ์„ ๊ฐ–๊ณ  ๊ณ„์‹  ๋ถ„์ด ์žˆ๋‹ค๋ฉด, ๋˜๋Š”

์ด ๊ณผ์ •์„ ๊ทน๋ณตํ•ด์„œ ํ˜„์žฌ๋Š” ์‹ค๋ฌด์—์„œ ๋ฐ์ดํ„ฐ ๋ถ„์„์„ ํ•˜๊ณ  ๊ณ„์‹  ๋ถ„์ด ์žˆ๋‹ค๋ฉด

์–ด๋–ป๊ฒŒ ๊ณต๋ถ€ํ•˜์…จ๋Š”์ง€ ์ €์—๊ฒŒ๋„ ์•Œ๋ ค์ฃผ์„ธ์š” ๐Ÿ™๐Ÿ™ 

๋งˆ์ง€๋ง‰์€ ๊ฑฐ์˜ ํ•˜์†Œ์—ฐ์ด ๋˜์—ˆ๋„ค์š”. ์•”ํŠผ, ํ™”์ดํŒ…์ž…๋‹ˆ๋‹ค๐Ÿ€