SQL & Python Study

[D+5] ์—‘์…€๋ณด๋‹ค ์‰ฌ์šด SQL(5) - ๊ธฐ์ค€ ๋ฐ–์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ํ”ผ๋ฒ— ํ…Œ์ด๋ธ” ์ œ์ž‘, ์œˆ๋„์šฐ ํ•จ์ˆ˜(rank, sum) ๋ณธ๋ฌธ

๐Ÿ”ฅ SQL

[D+5] ์—‘์…€๋ณด๋‹ค ์‰ฌ์šด SQL(5) - ๊ธฐ์ค€ ๋ฐ–์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ํ”ผ๋ฒ— ํ…Œ์ด๋ธ” ์ œ์ž‘, ์œˆ๋„์šฐ ํ•จ์ˆ˜(rank, sum)

๊น€์ˆฎ์—‰ 2024. 4. 19. 18:10

๐ŸŽ‰ (๊ฒฝ) ์—‘์…€๋ณด๋‹ค ์‰ฌ์šด SQL ์™„๊ฐ•!! (์ถ•)  ๐ŸŽ‰

 

โœ๏ธ STUDY INDEX

1. ๊ธฐ์ค€ ๋ฐ–์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ (NULL ๊ฐ’, ๋น„์ƒ์‹์ ์ธ ๋ฐ์ดํ„ฐ) 
2. SQL ํ”ผ๋ฒ—ํ…Œ์ด๋ธ”(Pivot Table) ์ œ์ž‘ํ•˜๊ธฐ 
3. ์œˆ๋„์šฐ ํ•จ์ˆ˜ Window Function 
  - โ‘  N๋ฒˆ์งธ๊นŒ์ง€ ๋Œ€์ƒ์„ ์กฐํšŒํ•˜๊ณ  ์‹ถ์„ ๋•Œ rank() over() 
  - โ‘ก ์ „์ฒด์—์„œ ์ฐจ์ง€ํ•˜๋Š” ๋น„์œจ, ๋ˆ„์ ํ•ฉ์„ ๊ตฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ sum() over()

 

1. ๊ธฐ์ค€ ๋ฐ–์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ (NULL ๊ฐ’, ๋น„์ƒ์‹์ ์ธ ๋ฐ์ดํ„ฐ) 

๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒ ๋˜๋Š” ์ง‘๊ณ„ํ•˜๋‹ค ๋ณด๋ฉด

null(๋ฐ์ดํ„ฐ ์—†์Œ) ๊ฐ’์ด๋‚˜ ๋น„์ƒ์‹์ ์ธ ๋ฐ์ดํ„ฐ(ex. ๊ณ ๊ฐ ๋‚˜์ด 2000์‚ด)๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๊ธฐ์ค€ ๋ฐ–์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•ด๋“œ๋ฆด๊ฒŒ์š”. 

๋ฐฉ๋ฒ• ๊ตฌ์ฒด์ ์ธ ํ•ด๊ฒฐ๋ฒ• ์˜ˆ์‹œ
โ‘  ์—†๋Š” ๊ฐ’ ์ œ๊ฑฐํ•˜๊ธฐ
์—†๋Š” ๋ฐ์ดํ„ฐ null ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๊ธฐ
IF (์ปฌ๋Ÿผ๋ช… <> 'no data', ์ปฌ๋Ÿผ๋ช…, NULL)

select gender, 
avg(if (age <> 'nodata', age, null)) avg_age
from user_info
group by 1 

NULL ๊ฐ’ ์ž์ฒด๋ฅผ ์ œ์™ธํ•˜๊ธฐ
WEHRE ์ปฌ๋Ÿผ๋ช… IS NOT NULL
  
select name, age, gender 
from user_info
where age is not null 
โ‘ก ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋Œ€์ฒดํ•˜๊ธฐ
NULL ๊ฐ’์— ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ๋„ฃ๊ธฐ 
COALESCE (์ปฌ๋Ÿผ๋ช…, ๋Œ€์ฒด๊ฐ’)

select name, price,
coalresce (age, 20) 'null์„ ๋Œ€์ฒดํ•œ ๋‚˜์ด'
from user_info
โ‘ข ๋น„์ƒ์‹์  ๊ฐ’ ํ•ด๊ฒฐํ•˜๊ธฐ 
์กฐ๊ฑด๋ฌธ์„ ํ™œ์šฉํ•œ ๊ธฐ์ค€ ๋ฒ”์œ„ ์ง€์ •
CASE WHEN ๊ธฐ์ค€ THEN ๊ฒฐ๊ณผ๊ฐ’ ...END 
 
select name, 
case when age < 15 then 15 
         when age > 80 then 80
         else age end '๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•ด์ค€ ๋‚˜์ด'
from user_info

 

* <> ๋Š” '๊ฐ™์ง€ ์•Š๋‹ค'๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค.  

* 1-1๋ฒˆ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€ ์—ฐ์‚ฐํ•  ๋•Œ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

  My sql์€ ์—ฐ์‚ฐ์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฐ’์€ 0์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ธฐ ๋•Œ๋ฌธ์— null๋กœ ์—ฐ์‚ฐ์—์„œ ์ œ์™ธํ•ด ์ฃผ๋ ค๊ณ ์š”! 

 

2. SQL ํ”ผ๋ฒ— ํ…Œ์ด๋ธ”(Pivot Table) ์ œ์ž‘ํ•˜๊ธฐ 

์—‘์…€์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ํ”ผ๋ฒ— ํ…Œ์ด๋ธ”, SQL์—์„œ๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! 

ํ”ผ๋ฒ— ํ…Œ์ด๋ธ”์€ 2๊ฐœ ์ด์ƒ์˜ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ง‘๊ณ„ํ•  ๋•Œ ๋ณด๊ธฐ ์‰ฝ๊ฒŒ ๋ฐฐ์—ดํ•˜์—ฌ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ธ๋ฐ์š”. 

์—ด(์„ธ๋กœ)์—๋Š” ์ง‘๊ณ„ ๊ธฐ์ค€์ด, ํ–‰(๊ฐ€๋กœ)์—๋Š” ๊ตฌ๋ถ„ ์ปฌ๋Ÿผ์ด ๋“ค์–ด๊ฐ€๋Š” ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. ๊ธ€๋กœ ์“ฐ์—ฌ์žˆ์œผ๋‹ˆ๊น, ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต์ฃ ?

์•„๋ž˜ ์ œ๊ฐ€ ๊ฐ•์˜ ์‹ค์Šต์—์„œ ์งฐ๋˜ ์ฟผ๋ฆฌ๋ฅผ ์†Œ๊ฐœ๋“œ๋ฆฌ๋ฉฐ, ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋Š”์ง€ ์•Œ๋ ค๋“œ๋ฆด๊ฒŒ์š”! 

 

โœ”๏ธ ํ”ผ๋ฒ— ํ…Œ์ด๋ธ”์„ ๋งŒ๋“œ๋Š” ์ˆœ์„œ 

  • โ‘  ๋ฒ ์ด์Šค ๋ฐ์ดํ„ฐ ๋งŒ๋“ค๊ธฐ 
  • โ‘ก ํ”ผ๋ฒ— ๋ทฐ ์ œ์ž‘ํ•ด ์ฃผ๊ธฐ 

์œ„ ์ˆœ์„œ์— ๋งž์ถฐ [์„ฑ๋ณ„, ๋‚˜์ด๋ณ„ ์ฃผ๋ฌธ๊ฑด์ˆ˜๋ฅผ ์ง‘๊ณ„ํ•œ ํ”ผ๋ฒ— ํ…Œ์ด๋ธ”]์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค! (*10~59์„ธ ์‚ฌ์ด๋งŒ ์ง‘๊ณ„)

โ‘  ํ”ผ๋ฒ— ํ…Œ์ด๋ธ” ์•ˆ์— ๋“ค์–ด๊ฐ€๋Š” ๋ฒ ์ด์Šค ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค. 

-- step 1. ๋ฒ ์ด์Šค ๋ฐ์ดํ„ฐ ์ œ์ž‘ํ•˜๊ธฐ 
-- 1) ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•œ jion ์‚ฌ์šฉ 
-- 2) ์„ฑ๋ณ„, ์ฃผ๋ฌธ๊ฑด์ˆ˜(count()), ์—ฐ๋ น๋Œ€๋ณ„๋กœ ๊ตฌ๊ฐ„ ๋‚˜๋ˆ„๊ธฐ 
-- 3) 10~59์„ธ๋กœ ์กฐ๊ฑด ์ฃผ๊ธฐ where, ๊ทธ๋ฃน๋ณ„์— ๋งž์ถฐ ๋ฐ์ดํ„ฐ ์ง‘๊ณ„ํ•˜๊ธฐ group by

SELECT c.gender as gender, 
	count(*) as cnt_orders,
    case when c.age between 10 and 19 then 10
    	when c.age between 20 and 29 then 20
        when c.age between 30 and 39 then 30
        when c.age between 40 and 49 then 40
        when c.age between 50 and 59 then 50 end age 
FROM food_orders f inner join customers c on f.customer_id = c.customer_id
WHERE c.age BETWEEN 10 and 59  
group by 1,3

 

โ‘ก ๋ฒ ์ด์Šค ๋ฐ์ดํ„ฐ๋Š” ์„œ๋ธŒ ์ฟผ๋ฆฌ๋กœ ๋„ฃ์–ด์ฃผ๊ณ , ์ด์ œ ํ”ผ๋ฒ— ๋ทฐ๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๊ฒŒ์š”. 

-- STEP 2. ํ”ผ๋ฒ—๋ทฐ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ 
-- 1) ๊ฐ€์žฅ ์ฒซ๋ฒˆ์งธ ์ปฌ๋Ÿผ = ํ–‰ ๋ฐ์ดํ„ฐ, ๊ทธ ์™ธ๋Š” ์—ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. 
-- 2) ์ค‘์š”ํ•œ ๊ฒƒ์€ ์—ด ๋ฐ์ดํ„ฐ๋Š” max()๋กœ ๊ฐ์‹ธ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

SELECT gender, 
	   max(if(age = 10, cnt_orders, 0)) '10๋Œ€', 
	   max(if(age = 20, cnt_orders, 0)) '20๋Œ€', 
	   max(if(age = 30, cnt_orders, 0)) '30๋Œ€', 
	   max(if(age = 40, cnt_orders, 0)) '40๋Œ€', 
	   max(if(age = 50, cnt_orders, 0)) '50๋Œ€' 
FROM 
	(SELECT c.gender as gender, 
		   count(*) as cnt_orders,
		   case when c.age between 10 and 19 then 10
		   	    when c.age between 20 and 29 then 20
		   	    when c.age between 30 and 39 then 30
		   	    when c.age between 40 and 49 then 40
		   	    when c.age between 50 and 59 then 50 end age 
	FROM food_orders f inner join customers c on f.customer_id = c.customer_id
	WHERE c.age BETWEEN 10 and 59  
	group by 1,3)a

 

๊ทธ๋Ÿผ ์•„๋ž˜์™€ ๊ฐ™์€ ํ”ผ๋ฒ— ํ…Œ์ด๋ธ”์„ ์–ป์œผ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์™€์„œ ์ƒ๊ฐํ•˜์ง€๋งŒ ํ–‰์„ ๋‚˜์ด๋Œ€๋กœ ๊ตฌ๋ถ„ํ–ˆ์–ด๋„ ๊ดœ์ฐฎ์•˜์„ ๊ฒƒ ๊ฐ™๋„ค์š”. 

์„ฑ๋ณ„, ๋‚˜์ด๋Œ€๋ณ„ ์ฃผ๋ฌธ๊ฑด์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ”ผ๋ฒ—ํ…Œ์ด๋ธ”

 

3. ์œˆ๋„์šฐ ํ•จ์ˆ˜ Window function (rank, sum ํ™œ์šฉ) 

์œˆ๋„์šฐ ํ•จ์ˆ˜(Window function)๋Š” ๊ด€๋ จ ํ–‰์˜ ๊ทธ๋ฃน ์—ฐ์‚ฐ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๋Š” ํ•จ์ˆ˜๋กœ

๋ฐ์ดํ„ฐ ๋ถ„์„, ์ง‘๊ณ„, ์ˆœ์œ„ ๋งค๊ธฐ๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.  

 

group by ์ ˆ์€ ์—ด์„ ๊ธฐ์ค€์œผ๋กœ ์—ฌ๋Ÿฌ ํ–‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ์ง‘๊ณ„ํ•˜์—ฌ ๋ณด์—ฌ์ค€๋‹ค๋ฉด,

์œˆ๋„์šฐ ํ•จ์ˆ˜๋Š” ์ •์˜ํ•œ ๊ทธ๋ฃน ๊ธฐ์ค€(๋ฒ”์œ„)์— ๋”ฐ๋ฅธ ์ง‘๊ณ„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”. 

์œˆ๋„์šฐํ•˜๋ฉด ์ƒ๊ฐ๋‚˜๋Š” ์ฐฝ๋ฌธ๐ŸชŸ๊ณผ ๊ฐ™์ด ๊ฐ ๊ทธ๋ฃน์˜ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๊ณ  ์ดํ•ดํ•ด ์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค!

์œˆ๋„์šฐ ํ•จ์ˆ˜ ์‚ฌ์šฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๊ณ ์š”. ๋ฌด์กฐ๊ฑด over() ์™€ ์Œ์„ ์ง€์–ด ์ฃผ์…”์•ผ ํ•ด์š”. 

-- ์œˆ๋„์šฐ ํ•จ์ˆ˜ ์‚ฌ์šฉ๋ฒ• 
ํ•จ์ˆ˜() OVER (PARTITION BY ๊ทธ๋ฃน ๊ธฐ์ค€ ์ปฌ๋Ÿผ ORDER BY ์ •๋ ฌ ๊ธฐ์ค€ ์ปฌ๋Ÿผ)

 

์œˆ๋„์šฐ ํ•จ์ˆ˜์˜ ์ข…๋ฅ˜๋Š” SUM(), MAX(), RANK(), LAG() ๋“ฑ ๋งค์šฐ ๋‹ค์–‘ํ•œ๋ฐ์š”, 

์ด ์ค‘ ๋งŽ์ด ํ™œ์šฉํ•˜๋Š” SUM()๊ณผ RANK() ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์–ด๋–ค ์‹์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์†Œ๊ฐœํ•ด๋“œ๋ฆด๊ฒŒ์š”. 

์–ด๋–ค ์ˆœ์„œ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์งฐ๋Š”์ง€๋Š” ์ฝ”๋“œ ๋ธ”๋Ÿญ ์•ˆ์— ํ•จ๊ป˜ ์ •๋ฆฌํ•ด ๋‘์—ˆ์Šต๋‹ˆ๋‹ค! 

 

โ‘  N๋ฒˆ์งธ๊นŒ์ง€ ๋Œ€์ƒ์„ ์กฐํšŒํ•˜๊ณ  ์‹ถ์„ ๋•Œ - Rank 

-- ์Œ์‹ ํƒ€์ž…๋ณ„๋กœ, ์ค€๋น„ ๋ฐ ๋ฐฐ๋‹ฌ ํ‰๊ท  ์‹œ๊ฐ„์ด ๊ฐ€์žฅ ๋น ๋ฅธ ์ƒ์  1~3์ˆœ์œ„๋ฅผ ๋ฝ‘์•„๋ณด์ž!
-- 1) ๋ฒ ์ด์Šค ๋ฐ์ดํ„ฐ ์ œ์ž‘ : ์Œ์‹ํƒ€์ž…, ์Œ์‹์ , ํ‰๊ท  ์ œ์ž‘ ์‹œ๊ฐ„ 
-- 2) ์Œ์‹ ํƒ€์ž…์— ๋”ฐ๋ผ ํ‰๊ท  ์ œ์ž‘์‹œ๊ฐ„์ด ์ ์€ ๊ฒƒ์˜ ์ˆœ์œ„ ๋งค๊ธฐ๊ธฐ rank() over() 
-- 3) ์ตœ์ข…์ ์œผ๋กœ where ์ ˆ์„ ํ™œ์šฉํ•˜์—ฌ 3์ˆœ์œ„ ์ด๋‚ด์˜ ๋ฐ์ดํ„ฐ๋งŒ ์กฐํšŒํ•˜๊ธฐ 

SELECT cuisine_type,restaurant_name, time_rank, avg_time
from (
	SELECT cuisine_type,restaurant_name, 
		rank() over (partition by cuisine_type order by avg_time) as time_rank,
		avg_time
	from(
		select cuisine_type, restaurant_name, 
			avg(food_preparation_time+delivery_time) as avg_time
		from food_orders
		group by 1, 2)a )b
WHERE time_rank <= 3

 

โ‘ก ์ „์ฒด์—์„œ ์ฐจ์ง€ํ•˜๋Š” ๋น„์œจ, ๋ˆ„์ ํ•ฉ์„ ๊ตฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ - Sum 

sum ์€ ํ•ฉ๊ณ„๋ฅผ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜์ง€๋งŒ, ๋ˆ„์ ํ•ฉ์ด๋‚˜ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ํ•ฉ๊ณ„๋ฅผ ๊ตฌํ•˜๊ณ ์ž ํ•  ๋•Œ ์œˆ๋„์šฐ ํ•จ์ˆ˜ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

-- ์Œ์‹ํƒ€์ž…๋ณ„, ์Œ์‹์ ๋ณ„ ๋งค์ถœ ์ง‘๊ณ„ํ•˜๊ณ , ๋ˆ„์  ๋งค์ถœํ•ฉ ๊ตฌํ•ด๋ณด๊ธฐ
-- 1) ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ œ์ž‘ : ์Œ์‹ ํƒ€์ž…, ์Œ์‹์ , ๋งค์ถœ sum(price * quantity) - group by
-- 2) ๋ˆ„์  ํ•ฉ๊ณ„ ์ง‘๊ณ„ํ•ด๋ณด๊ธฐ sum() over() *์ •๋ ฌ๊ธฐ์ค€์„ ์„ค์ •ํ• ๋•Œ ๋ˆ„์ ํ•ฉ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ์Œ. 

SELECT cuisine_type '์Œ์‹ ํƒ€์ž…', 
	restaurant_name '๋งค์žฅ๋ช…', 
	rev '๋งค์žฅ ๋งค์ถœ', 
	sum(rev)over(partition by cuisine_type) '์Œ์‹ ํƒ€์ž…๋ณ„ ์ด๋งค์ถœ',
	sum(rev)over(partition by cuisine_type order by rev, restaurant_name) '์Œ์‹ ํƒ€์ž…๋ณ„ ๋ˆ„์  ๋งค์ถœ'
FROM 
	(SELECT cuisine_type, 
		restaurant_name,
		sum(price*quantity) as rev
	FROM food_orders 
	GROUP BY 1, 2) a

 

sum() over()์— ์ •๋ ฌ ๊ธฐ์ค€ ์ ์šฉํ•˜๋ฉด ๋ˆ„์ ํ•ฉ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ์š”! ์ •๋ ฌ์„ ์ ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ํƒ€์ž…๋ณ„ ์ด๋งค์ถœ์„ ์ง‘๊ณ„ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ด๋ฏธ์ง€๋ฅผ ์ฒจ๋ถ€ํ•ด ๋“œ๋ฆด๊ฒŒ์š”. ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ์–ด๋–ป๊ฒŒ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”๋Š”์ง€ ์ดํ•ดํ•˜์‹ค ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”! 

 


 

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

 

๐Ÿ”ฅ๋“œ.๋””.์–ด [ ์—‘์…€๋ณด๋‹ค ์‰ฌ์šด SQL ] ๊ฐ•์˜๋ฅผ ์™„๊ฐ•ํ–ˆ์Šต๋‹ˆ๋‹ค๐Ÿ”ฅ

ํ™•์‹คํžˆ ๋งˆ์ง€๋ง‰ ์ฑ•ํ„ฐ์ด๋‹ค ๋ณด๋‹ˆ ์ด์ „ ๋‚ด์šฉ๋ณด๋‹ค ํ›จ์”ฌ ์–ด๋ ต๋„ค์š”.

์˜ค๋Š˜ ๋ธ”๋กœ๊ทธ๋ฅผ ์ž‘์„ฑํ•˜๋ฉฐ ๋ณต์Šตํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๊ณต๋ถ€๊ฐ€ ๋” ํ•„์š”ํ•œ ๊ฐœ๋…์ด๋ผ๊ณ  ์ƒ๊ฐ๋ฉ๋‹ˆ๋‹ค. 

์ฃผ๋ง์— ํ•œ๋ฒˆ ๋” ๊ฐ•์˜๋ฅผ ๋Œ๋ ค๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์•„์š”! ์–ด์ œ๋Š” ์„œ๋ธŒ ์ฟผ๋ฆฌ๊ฐ€ ์–ด๋ ค์› ์ง€๋งŒ, ์œˆ๋„์šฐ ํ•จ์ˆ˜๋‚˜ ํ”ผ๋ฒ— ํ…Œ์ด๋ธ” ๋“ฑ ๋” ์–ด๋ ค์šด ๊ฐœ๋…์ด ์ƒ๊ธฐ๋‹ˆ ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ์‰ฝ๊ณ  ๊ท€์—ฌ์šด ๊ฐœ๋…์ด ๋˜์—ˆ๋„ค์š” ๐Ÿ˜‚ 

 

์ €๋Š” ์ฒ˜์Œ์— ๊ธฐ์ดˆ ๊ฐ•์˜๋ฅผ ์ˆ˜๊ฐ•ํ•˜๋ฉด์„œ '๋Œ€์ฒด ์ด๋ ‡๊ฒŒ ์ถ”์ถœํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์‹ค๋ฌด์— ์ ์šฉํ•œ๋‹ค๋Š” ๊ฑฐ์ง€?' ๋งŽ์€ ๊ณ ๋ฏผ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ๋ฅผ ์งœ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง‘๊ณ„ํ•˜๋Š” ๊ฒƒ๋„ ํž˜๋“ค์ง€๋งŒ, ์ด๊ฑธ ๋Œ€์ฒด ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์„์ง€ ์ƒ์ƒ์ด ๋˜์ง€ ์•Š์•˜๊ฑฐ๋“ ์š”. ๊ทธ๋Ÿฐ๋ฐ ์˜ค๋Š˜ ๋‹ค๋ฅธ ๋ถ„๋“ค์ด ์ง„ํ–‰ํ•œ ๋ฐ์ดํ„ฐ ๋ถ„์„ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ณด๋ฉด์„œ, ์ด ์Šคํ‚ฌ์„ ์•ž์œผ๋กœ ์–ด๋–ป๊ฒŒ ์‹ค๋ฌด์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์„์ง€ ๊ฐ์ด ์žกํžˆ๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค! ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ, ๋ถ„์„์„ ํ† ๋Œ€๋กœ ๋น„์ฆˆ๋‹ˆ์Šค์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด์šฉ์„ ๋„์ถœํ•œ ํ”„๋กœ์ ํŠธ์˜€๊ฑฐ๋“ ์š”! 

 

๊ฐ•์˜๋ฅผ ๋“ค์œผ๋ฉด์„œ ์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ์€ 'ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ช…ํ™•ํžˆ ์ •์˜ ๋ฐ ์ง‘๊ณ„ํ•˜๊ณ , ๊ฐ€๊ณตํ•ด์„œ ์œ ์˜๋ฏธํ•œ ์ธ์‚ฌ์ดํŠธ๋ฅผ ๋„์ถœํ•˜๋Š” ๊ฒŒ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๋‹ค'๋ผ๊ณ  ๋А๋‚๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๊ฐ•์‚ฌ๋‹˜์ด ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ค ํ˜•ํƒœ๋กœ ์ถ”์ถœํ•ด ๋ณด๋ผ๊ณ  ๋ช…ํ™•ํžˆ ์•ˆ๋‚ดํ•ด ์ฃผ์‹œ์ง€๋งŒ, ์‹ค๋ฌด์—์„œ๋Š” ๊ทธ ์—ญํ•  ๋˜ํ•œ ์Šค์Šค๋กœ ํ•ด์•ผ ํ•  ์ผ์ด ๋  ํ…Œ๋‹ˆ๊นŒ์š”!

 

ํ•˜๋ฃจ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ SQL ๋‚œ์ด๋„๊ฐ€ ๊ธ‰์ฆ๊ฐ€ ํ•œ๋‹ค๊ณ  ๋А๋ผ๋Š” ์š”์ฆ˜์ž…๋‹ˆ๋‹ค.  

ํ•˜์ง€๋งŒ ์–ด์ œ๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ์–ด๋ ค์› ์ง€๋งŒ ์˜ค๋Š˜์€ ์œˆ๋„์šฐ ํ•จ์ˆ˜๊ฐ€ ์ œ์ผ ์–ด๋ ค์›Œ์ง„ ๊ฒƒ์ฒ˜๋Ÿผ, 

๋” ์–ด๋ ค์šด ์ƒ์œ„ ๊ฐœ๋…์œผ๋กœ '์ด๊ฑด ์•„์ง ์–ด๋ ค์šด๊ฒŒ ์•„๋‹ˆ๋ž€๋‹ค^^' ์ž˜ ์†์—ฌ๊ฐ€๋ฉฐ

์–ด๋ ต๊ฒŒ๋งŒ ๋А๊ปด์ง€๋Š” SQL์„ ์ž˜ ์ •๋ณตํ•ด๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค! SQL ๊ณต๋ถ€ํ•˜์‹œ๋Š” ๋ชจ๋“  ๋ถ„๋“ค ํ™”์ดํŒ…ํ•˜์„ธ์š”๐Ÿ€

 

*<์—‘์…€๋ณด๋‹ค ์‰ฌ์šด SQL> ์˜จ๋ผ์ธ ๊ฐ•์˜ 5์ฃผ ์ฐจ ์ž๋ฐœ์  ํ•™์Šต ๋…ธํŠธ์ž…๋‹ˆ๋‹ค.