SQL

์ด๋‚˜๋ž˜ยท2022๋…„ 4์›” 3์ผ

Where ์ ˆ์˜ ๊ฐœ๋…

๐Ÿ‘‰ Where ์ ˆ์€, Select ์ฟผ๋ฆฌ๋ฌธ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ๋ฐ์ดํ„ฐ์— ์กฐ๊ฑด์„ ๊ฑธ์–ด์ฃผ๋Š” ๊ฒƒ์„ ์˜๋ฏธ

โ€‹

Select ์ฟผ๋ฆฌ๋ฌธ์— Where ์ ˆ ํ•จ๊ป˜ ์จ๋ณด๊ธฐ

โ€‹

select * from orders

where payment_method = "kakaopay";

  • ์•„์ฃผ ์ง๊ด€์ ์ด์ฃ ? "orders ํ…Œ์ด๋ธ”์—์„œ payment_method๊ฐ€ kakaopay์ธ ๊ฒƒ๋งŒ ๊ฐ€์ ธ์™€์ค˜!" ๋ผ๋Š” ์˜๋ฏธ๋ž๋‹ˆ๋‹ค.

Q) ์ž ๊น! ์™œ kakaopay๊ฐ€ ์•„๋‹ˆ๋ผ "kakaopay"๋ผ๊ณ  ์“ฐ๋‚˜์š”? A) kakaopay๋ฅผ ํ•„๋“œ๋ช…์ด๋‚˜ ํ…Œ์ด๋ธ”๋ช…์ด ์•„๋‹Œ ๋ฌธ์ž์—ด๋กœ ์ธ์‹์‹œํ‚ค๋ ค๋Š”๊ฑฐ์—์š”.

๋งŒ์•ฝ "kakaopay"๊ฐ€ ์•„๋‹ˆ๋ผ kakaopay๋ผ๊ณ  ์“ฐ๋ฉด? ๋‹น์—ฐํžˆ ์—๋Ÿฌ๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค!

[Unknown column 'kakaopay' in 'where clause'] ์—๋Ÿฌ๋ฌธ๊ตฌ๋ฅผ ์ฒœ์ฒœํžˆ ์ฝ์–ด๋ณผ๊นŒ์š”? Where ์ ˆ์— ์žˆ๋Š” kakaopay๋ผ๋Š” ์ปฌ๋Ÿผ์€ ์—†๋‹ค! ๋Š” ๋œป์ด์—์š”. ์—ฌ๊ธฐ์„œ ์ปฌ๋Ÿผ์€ ํ•„๋“œ๋ฅผ ์˜๋ฏธํ•ด์š”. ์ •๋ง, kakaopay๋ผ๋Š” ๊ธ€์ž๋ฅผ ์ปฌ๋Ÿผ(ํ•„๋“œ๋ช…)์œผ๋กœ ์ธ์‹ํ•ด๋ฒ„๋ ธ์ฃ ?

โ€‹

Select ์ฟผ๋ฆฌ๋ฌธ์— Where ์ ˆ ํ•จ๊ป˜ ์จ๋ณด๊ธฐ ์—ฐ์Šต

(1) ์›ํ•˜๋Š” ํ…Œ์ด๋ธ”๊ณผ (2) ์กฐ๊ฑด, ์ด ๋‘ ๊ฐ€์ง€๋งŒ ๊ธฐ์–ตํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค!

SQL์„ ์ž˜ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ์›ํ•˜๋Š” ์ •๋ณด๊ฐ€ ์–ด๋А ํ…Œ์ด๋ธ”์— ๋‹ด๊ฒจ์žˆ๋Š”์ง€ ์ž˜ ์ฐพ๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ต๋‹ˆ๋‹ค!

[ํ€ด์ฆˆ] ํฌ์ธํŠธ๊ฐ€ 20000์ ๋ณด๋‹ค ๋งŽ์€ ์œ ์ €๋งŒ ๋ฝ‘์•„๋ณด๊ธฐ!

select * from point_users where point > 20000;

โ€‹

[๊ฟ€ํŒ๐Ÿฏ] ์ด๋ ‡๊ฒŒ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ํŽธํ•ด์š”!

1) show tables๋กœ ์–ด๋–ค ํ…Œ์ด๋ธ”์ด ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด๊ธฐ 2) ์ œ์ผ ์›ํ•˜๋Š” ์ •๋ณด๊ฐ€ ์žˆ์„ ๊ฒƒ ๊ฐ™์€ ํ…Œ์ด๋ธ”์— select from ํ…Œ์ด๋ธ”๋ช… ์ฟผ๋ฆฌ ๋‚ ๋ ค๋ณด๊ธฐ 3) ์›ํ•˜๋Š” ์ •๋ณด๊ฐ€ ์—†์œผ๋ฉด ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์—๋„ 2)๋ฅผ ํ•ด๋ณด๊ธฐ 4) ํ…Œ์ด๋ธ”์„ ์ฐพ์•˜๋‹ค! ์กฐ๊ฑด์„ ๊ฑธ ํ•„๋“œ๋ฅผ ์ฐพ๊ธฐ 5) select from ํ…Œ์ด๋ธ”๋ช… where ์กฐ๊ฑด ์ด๋ ‡๊ฒŒ ์ฟผ๋ฆฌ ์™„์„ฑ!

โ€‹

Where ์ ˆ๊ณผ ์ž์ฃผ ๊ฐ™์ด์“ฐ๋Š” ๋ฌธ๋ฒ• ๋ฐฐ์šฐ๊ธฐ

'๊ฐ™์ง€ ์•Š์Œ' ์กฐ๊ฑด ๊ฑธ์–ด๋ณด๊ธฐ

'๊ฐ™์ง€ ์•Š์Œ' ์กฐ๊ฑด์€ != ๋กœ ๊ฑธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

[์ฝ”๋“œ์Šค๋‹ˆํŽซ] '๊ฐ™์ง€ ์•Š์Œ' ์กฐ๊ฑด ๊ฑธ์–ด๋ณด๊ธฐ

select * from orders

where course_title != "์›น๊ฐœ๋ฐœ ์ข…ํ•ฉ๋ฐ˜";

์ž ๊น ์ƒ์‹! '!=' ์—์„œ ! (๋А๋‚Œํ‘œ)๋Š” ๋ถ€์ • (not)์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. '='๋Š” ๊ฐ™์Œ์„ ์˜๋ฏธํ•˜๋‹ˆ, '!='๋Š” ๊ฐ™์ง€ ์•Š์Œ์ด๊ฒ ์ฃ !

โ€‹

*'๋ฒ”์œ„' ์กฐ๊ฑด ๊ฑธ์–ด๋ณด๊ธฐ

7์›” 13์ผ, 7์›” 14์ผ์˜ ์ฃผ๋ฌธ๋ฐ์ดํ„ฐ๋งŒ ๋ณด๊ณ  ์‹ถ์–ด์กŒ์–ด์š”. ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?

'๋ฒ”์œ„' ์กฐ๊ฑด์€ between ์œผ๋กœ ๊ฑธ ์ˆ˜ ์žˆ์–ด์š”.

select * from orders

where created_at between "2020-07-13" and "2020-07-15";

*'ํฌํ•จ' ์กฐ๊ฑด ๊ฑธ์–ด๋ณด๊ธฐ

๐Ÿ‘‰ 1, 3์ฃผ์ฐจ ์‚ฌ๋žŒ๋“ค์˜ '์˜ค๋Š˜์˜ ๋‹ค์ง' ๋ฐ์ดํ„ฐ๋งŒ ๋ณด๊ณ  ์‹ถ์–ด์กŒ์–ด์š”.

'ํฌํ•จ' ์กฐ๊ฑด์€ in ์œผ๋กœ ๊ฑธ ์ˆ˜ ์žˆ์–ด์š”.

select * from checkins

where week in (1, 3);

๐Ÿ‘‰ ๋‹ค์Œ (daum) ์ด๋ฉ”์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ์œ ์ €๋งŒ ๋ณด๊ณ  ์‹ถ์–ด์กŒ์–ด์š”. ์–ด๋–ป๊ฒŒ ํ•˜์ฃ ?

'ํŒจํ„ด' ์กฐ๊ฑด์€ like ์œผ๋กœ ๊ฑธ ์ˆ˜ ์žˆ์–ด์š”.

*'ํŒจํ„ด' (๋ฌธ์ž์—ด ๊ทœ์น™) ์กฐ๊ฑด ๊ฑธ์–ด๋ณด๊ธฐ

select * from users

where email like '%daum.net';

[๊ฟ€ํŒ๐Ÿฏ] Like์˜ ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ๋ฒ•

where email like 'a%': email ํ•„๋“œ๊ฐ’์ด a๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ

where email like '%a' email ํ•„๋“œ๊ฐ’์ด a๋กœ ๋๋‚˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ

where email like '%co%' email ํ•„๋“œ๊ฐ’์— co๋ฅผ ํฌํ•จํ•˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ

where email like 'a%o' email ํ•„๋“œ๊ฐ’์ด a๋กœ ์‹œ์ž‘ํ•˜๊ณ  o๋กœ ๋๋‚˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ

โ€‹

*์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ: Limit

๐Ÿ‘‰ ํ…Œ์ด๋ธ”์— ์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์žˆ๋‚˜ ์ž ๊น ๋ณด๋ ค๊ณ  ๋“ค์–ด์™”๋Š”๋ฐ, ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค ๋ถˆ๋Ÿฌ์˜ค๋А๋ผ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋ฉด ํž˜๋“ค๊ฒ ์ฃ ?

๊ทธ๋Ÿฐ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•ด, ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ค๋Š” Limit์ด๋ผ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

select * from orders

where payment_method = "kakaopay"

limit 5;

๋”ฑ 5๊ฐœ๋งŒ ์ถœ๋ ฅ๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์ฃ ?

*์ค‘๋ณต ๋ฐ์ดํ„ฐ๋Š” ์ œ์™ธํ•˜๊ณ  ๊ฐ€์ ธ์˜ค๊ธฐ: Distinct

select distinct(payment_method) from orders;

์š”๋ ‡๊ฒŒ, ๋„ค ๊ฐœ์˜ ๊ฒฐ์ œ์ˆ˜๋‹จ์ด ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ํ•œ ์ค„๋กœ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค!

*๋ช‡ ๊ฐœ์ธ์ง€ ์ˆซ์ž ์„ธ๋ณด๊ธฐ: Count

์ด๋ฒˆ์—๋Š” orders ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋ช‡ ๊ฐœ ๋“ค์–ด์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ด์š”! (๊ฒฐ์ œ๊ฐ€ ๋ช‡ ๊ฑด์ด๋‚˜ ๋“ค์–ด์™”์ฃ ? ๋‘๊ทผ๋‘๊ทผ) 1) orders ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ๋ถˆ๋Ÿฌ์™€์„œ, ํ•œ์ค„ํ•œ์ค„์”ฉ ์„ผ๋‹ค 2) count ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด์„œ ํ•œ๋ฐฉ์— ๋ณธ๋‹ค

๋‹น์—ฐํžˆ 2๋ฒˆ์ด์ฃ ?

select count(*) from orders

ํ•œ ์ค„๋กœ ๋! select from orders์—์„œ ์„, count๋กœ ๊ฐ์‹ธ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

*[์‘์šฉ] Distinct์™€ Count๋ฅผ ๊ฐ™์ด ์จ๋ณด๊ธฐ

๐Ÿ‘‰ ์ŠคํŒŒ๋ฅดํƒ€ ํšŒ์› ๋ถ„๋“ค์˜ ์„ฑ(family name)์”จ๊ฐ€ ๋ช‡๊ฐœ์ธ์ง€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด? ์ด๋ฒˆ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค!

select distinct(name) from users;

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์„ฑ์”จ๊ฐ€ ์ญ‰ ๋‚˜์˜ค์ฃ ?

SELECT count(distinct(name)) from users;

๊ทธ๋ฆฌ๊ณ , ์—ฌ๊ธฐ์— count๋ฅผ ์ž…ํ˜€์ฃผ๋ฉด ๋ช‡ ๊ฐœ์˜ ์„ฑ์”จ๊ฐ€ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์ฐธ ์‰ฝ์ฃ ?)

โ€‹[์ฝ”๋“œ์Šค๋‹ˆํŽซ] ์„ฑ์”จ๋ณ„ ํšŒ์›์ˆ˜๋ฅผ Group by๋กœ ์‰ฝ๊ฒŒ ๊ตฌํ•ด๋ณด๊ธฐ

select name, count(*) from users

group by name;

  1. from users: users ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค

  2. group by name: name์ด๋ผ๋Š” ํ•„๋“œ์—์„œ ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ–๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ค๋‹ˆ๋‹ค

  3. select name, count(): ์ด๋ฆ„๊ณผ count()๋ฅผ ์ถœ๋ ฅํ•ด ์ฃผ๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ count(*)๋Š” group by๋กœ ํ•ฉ์ณ์ง„ ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ์–ด์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค!

โ€‹

Group by ์ œ๋Œ€๋กœ ์•Œ์•„๋ณด๊ธฐ: SQL ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ

select name, count(*) from users

group by name;

๐Ÿ‘‰ ์œ„ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ: from โ†’ group by โ†’ select

[์ฝ”๋“œ์Šค๋‹ˆํŽซ] users ํ…Œ์ด๋ธ” ์ „์ฒด ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

select * from users;

[์ฝ”๋“œ์Šค๋‹ˆํŽซ] users ํ…Œ์ด๋ธ”์—์„œ '์‹ ' ์”จ๋ฅผ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๋งŒ ๋ถˆ๋Ÿฌ์™€์„œ ๊ฐœ์ˆ˜ ์‚ดํŽด๋ณด๊ธฐ

select * from users

where name = "์‹ **";

์ง€๋‚œ์ฃผ ๋ฐฐ์› ๋˜ where๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฝ‘์•„๋ดค์–ด์š”. 14๊ฐœ๊ฐ€ ๋‚˜์˜ค๋„ค์š”.

[์ฝ”๋“œ์Šค๋‹ˆํŽซ] group by๋ฅผ ์‚ฌ์šฉํ•ด์„œ '์‹ '์”จ๋ฅผ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ช‡ ๊ฐœ์ธ์ง€ ์‚ดํŽด๋ณด๊ธฐ

select name, count(*) from users

group by name;

์ด๋ ‡๊ฒŒ ๋‚˜์˜ค๋ฉด ์„ฑ๊ณต! ์‹ ์”จ๋ฅผ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๊ฐ€ 14๊ฐœ๋กœ ๋™์ผํ•˜๊ฒŒ ๋‚˜์˜ค์ฃ ?

โ€‹

Group by ๊ธฐ๋Šฅ ์•Œ์•„๋ณด๊ธฐ

์‚ฌ์šฉํ•  ํ…Œ์ด๋ธ” ์•Œ์•„๋ณด๊ธฐ!

์ž, select * from checkins limit 10 ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ ค์„œ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋ฅผ ๋ณผ๊นŒ์š”?

checkins ํ…Œ์ด๋ธ” ๋ณด๋Ÿฌ๊ฐ€๊ธฐ

์ด๋ฒˆ ๊ฐ•์˜์—์„œ ์‚ฌ์šฉํ•  ํ•„๋“œ๋Š” ์š”๊ฑฐ! week: ์ˆ˜๊ฐ•์ƒ์ด '์˜ค๋Š˜์˜ ๋‹ค์ง'์„ ๋‚จ๊ธด ์‹œ์ ์˜ ๊ฐ•์˜ ์ฃผ์ฐจ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. likes: ๋‚จ๊ธด '์˜ค๋Š˜์˜ ๋‹ค์ง' ๊ฒŒ์‹œ๋ฌผ์— ๋‹ฌ๋ฆฐ ์ข‹์•„์š”์˜ ์ˆ˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋™์ผํ•œ ๋ฒ”์ฃผ์˜ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ

[์ฝ”๋“œ์Šค๋‹ˆํŽซ] ์ฃผ์ฐจ๋ณ„ '์˜ค๋Š˜์˜ ๋‹ค์ง' ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ

select ๋ฒ”์ฃผ๋ณ„๋กœ ์„ธ์–ด์ฃผ๊ณ  ์‹ถ์€ ํ•„๋“œ๋ช…, count(*) from ํ…Œ์ด๋ธ”๋ช…

group by ๋ฒ”์ฃผ๋ณ„๋กœ ์„ธ์–ด์ฃผ๊ณ  ์‹ถ์€ ํ•„๋“œ๋ช…;

์ด ๊ทœ์น™์œผ๋กœ ํ•˜๋ฉด ๋œ๋‹ต๋‹ˆ๋‹ค. ์ฐธ ์‰ฝ์ฃ ? (์—ฌ๊ธฐ์„ , week๊ฐ€ ๋ฒ”์ฃผ๋ณ„๋กœ ์„ธ์–ด์ฃผ๊ณ  ์‹ถ์€ ํ•„๋“œ๋ช…์ด์ฃ !)

๋™์ผํ•œ ๋ฒ”์ฃผ์—์„œ์˜ ์ตœ์†Ÿ๊ฐ’ ๊ตฌํ•˜๊ธฐ

[์ฝ”๋“œ์Šค๋‹ˆํŽซ] ์ฃผ์ฐจ๋ณ„ '์˜ค๋Š˜์˜ ๋‹ค์ง'์˜ ์ข‹์•„์š” ์ตœ์†Ÿ๊ฐ’ ๊ตฌํ•˜๊ธฐ

select ๋ฒ”์ฃผ๊ฐ€ ๋‹ด๊ธด ํ•„๋“œ๋ช…, min(์ตœ์†Ÿ๊ฐ’์„ ์•Œ๊ณ  ์‹ถ์€ ํ•„๋“œ๋ช…) from ํ…Œ์ด๋ธ”๋ช…

group by ๋ฒ”์ฃผ๊ฐ€ ๋‹ด๊ธด ํ•„๋“œ๋ช…;

์ด ๊ทœ์น™์œผ๋กœ ํ•˜๋ฉด ๋œ๋‹ต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ๋Š”, ๋ฒ”์ฃผ๊ฐ€ ๋‹ด๊ธด ํ•„๋“œ๋ช…์€ week, ์ตœ์†Ÿ๊ฐ’์„ ์•Œ๊ณ  ์‹ถ์€ ํ•„๋“œ๋ช…์€ likes ๊ฒ ์ฃ .

๋™์ผํ•œ ๋ฒ”์ฃผ์—์„œ์˜ ์ตœ๋Œ“๊ฐ’ ๊ตฌํ•˜๊ธฐ

[์ฝ”๋“œ์Šค๋‹ˆํŽซ] ์ฃผ์ฐจ๋ณ„ '์˜ค๋Š˜์˜ ๋‹ค์ง'์˜ ์ข‹์•„์š” ์ตœ๋Œ“๊ฐ’ ๊ตฌํ•˜๊ธฐ

select ๋ฒ”์ฃผ๊ฐ€ ๋‹ด๊ธด ํ•„๋“œ๋ช…, max(์ตœ๋Œ“๊ฐ’์„ ์•Œ๊ณ  ์‹ถ์€ ํ•„๋“œ๋ช…) from ํ…Œ์ด๋ธ”๋ช…

group by ๋ฒ”์ฃผ๊ฐ€ ๋‹ด๊ธด ํ•„๋“œ๋ช…;

์ด ๊ทœ์น™์œผ๋กœ ํ•˜๋ฉด ๋œ๋‹ต๋‹ˆ๋‹ค. ์ตœ์†Ÿ๊ฐ’ ๊ตฌํ• ๋•Œ์™€ ๋‹ฌ๋ผ์ง„๊ฑด ํ•˜๋‚˜๋ฐ–์— ์—†์–ด์š”.

์—ฌ๊ธฐ์„œ๋Š”, ๋ฒ”์ฃผ๊ฐ€ ๋‹ด๊ธด ํ•„๋“œ๋ช…์€ week, ์ตœ๋Œ€๊ฐ’์„ ์•Œ๊ณ  ์‹ถ์€ ํ•„๋“œ๋ช…์€ likes ๊ฒ ์ฃ .

๋™์ผํ•œ ๋ฒ”์ฃผ์˜ ํ‰๊ท  ๊ตฌํ•˜๊ธฐ

[์ฝ”๋“œ์Šค๋‹ˆํŽซ] ์ฃผ์ฐจ๋ณ„ '์˜ค๋Š˜์˜ ๋‹ค์ง'์˜ ์ข‹์•„์š” ํ‰๊ท ๊ฐ’ ๊ตฌํ•˜๊ธฐ

select ๋ฒ”์ฃผ๊ฐ€ ๋‹ด๊ธด ํ•„๋“œ๋ช…, avg(ํ‰๊ท ๊ฐ’์„ ์•Œ๊ณ  ์‹ถ์€ ํ•„๋“œ๋ช…) from ํ…Œ์ด๋ธ”๋ช…

group by ๋ฒ”์ฃผ๊ฐ€ ๋‹ด๊ธด ํ•„๋“œ๋ช…;

์ด ๊ทœ์น™์œผ๋กœ ํ•˜๋ฉด ๋œ๋‹ต๋‹ˆ๋‹ค. ์ตœ์†Ÿ๊ฐ’ ๊ตฌํ•  ๋•Œ์™€ ๋‹ฌ๋ผ์ง„๊ฑด ํ•˜๋‚˜๋ฐ–์— ์—†์–ด์š”.

์—ฌ๊ธฐ์„œ๋Š”, ๋ฒ”์ฃผ๊ฐ€ ๋‹ด๊ธด ํ•„๋“œ๋ช…์€ week, ํ‰๊ท ๊ฐ’์„ ์•Œ๊ณ  ์‹ถ์€ ํ•„๋“œ๋ช…์€ likes ๊ฒ ์ฃ .

๋™์ผํ•œ ๋ฒ”์ฃผ์˜ ํ•ฉ๊ณ„ ๊ตฌํ•˜๊ธฐ

[์ฝ”๋“œ์Šค๋‹ˆํŽซ] ์ฃผ์ฐจ๋ณ„ '์˜ค๋Š˜์˜ ๋‹ค์ง'์˜ ์ข‹์•„์š” ํ•ฉ๊ณ„ ๊ตฌํ•˜๊ธฐ

select ๋ฒ”์ฃผ๊ฐ€ ๋‹ด๊ธด ํ•„๋“œ๋ช…, sum(ํ•ฉ๊ณ„๋ฅผ ์•Œ๊ณ  ์‹ถ์€ ํ•„๋“œ๋ช…) from ํ…Œ์ด๋ธ”๋ช…

group by ๋ฒ”์ฃผ๊ฐ€ ๋‹ด๊ธด ํ•„๋“œ๋ช…;

์ด ๊ทœ์น™์œผ๋กœ ํ•˜๋ฉด ๋œ๋‹ต๋‹ˆ๋‹ค. ์ตœ์†Ÿ๊ฐ’ ๊ตฌํ•  ๋•Œ์™€ ๋‹ฌ๋ผ์ง„๊ฑด ํ•˜๋‚˜๋ฐ–์— ์—†์–ด์š”.

์—ฌ๊ธฐ์„œ๋Š”, ๋ฒ”์ฃผ๊ฐ€ ๋‹ด๊ธด ํ•„๋“œ๋ช…์€ week, ํ•ฉ๊ณ„๋ฅผ ์•Œ๊ณ  ์‹ถ์€ ํ•„๋“œ๋ช…์€ likes ๊ฒ ์ฃ .

โ€‹

Order by๋กœ ์•ž์˜ ๊ฒฐ๊ณผ๋ฅผ ์ •๋ ฌํ•ด๋ณด์ž

[์ฝ”๋“œ์Šค๋‹ˆํŽซ] ์›๋ณธ ์ฟผ๋ฆฌ ์‚ดํŽด๋ณด๊ธฐ

select name, count(*) from users

group by name;

[์ฝ”๋“œ์Šค๋‹ˆํŽซ] ๊ฒฐ๊ณผ์˜ ๊ฐœ์ˆ˜ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด๋ณด๊ธฐ

select name, count(*) from users

group by name

order by count(*);

์•„๊นŒ ์ฝ”๋“œ์— order by count() ๋งŒ ์ถ”๊ฐ€ํ•ด์คฌ์–ด์š”. ๊ฐฏ์ˆ˜ (count() ๊ฐ’)์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•ด๋‹ฌ๋ผ๋Š” ๋œป์ด์—์š”.

[์ฝ”๋“œ์Šค๋‹ˆํŽซ] ๊ฒฐ๊ณผ์˜ ๊ฐœ์ˆ˜ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด๋ณด๊ธฐ

select name, count(*) from users

group by name

order by count(*) desc;

๐Ÿ‘‰ [๊ฟ€ํŒ!] ์—ฌ๊ธฐ์„œ์˜ desc๋Š” ๋‚ด๋ฆผ์ฐจ์ˆœ์„ ์˜๋ฏธํ•˜๋Š” ์˜๋‹จ์–ด descending์˜ ์•ฝ์ž์ž…๋‹ˆ๋‹ค.

Order by ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

Order by๋Š” ๋ชจ๋“  SQL ์ฟผ๋ฆฌ์— ์ ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

๐Ÿ‘‰ like๋ฅผ ๋งŽ์ด ๋ฐ›์€ ์ˆœ์„œ๋Œ€๋กœ '์˜ค๋Š˜์˜ ๋‹ค์ง'์„ ์ถœ๋ ฅํ•ด ๋ณผ๊นŒ์š”?

select * from checkins

order by likes desc;

์ ๊ฒŒ ๋ฐ›์€ ์ˆœ์„œ๋Œ€๋กœ๋Š” ๋ณด๊ธฐ ์œ„ํ•ด์„œ๋Š”, ๋งจ ๋์˜ desc๋ฅผ ์ œ๊ฑฐํ•ด ์ฃผ๋ฉด ๋˜์–ด์š”!

๊ทœ์น™์„ ์‚ดํŽด๋ณผ๊นŒ์š”?

select * from ํ…Œ์ด๋ธ”๋ช…

order by ์ •๋ ฌ์˜ ๊ธฐ์ค€์ด ๋  ํ•„๋“œ๋ช…;

๋ฐ”๋กœ ์œ„ ์˜ˆ์‹œ์—์„œ๋Š”, like์˜ ๊ฐฏ์ˆ˜๊ฐ€ ์ •๋ ฌ์˜ ๊ธฐ์ค€์ด ๋˜๋Š” ํ•„๋“œ๋ช…์ด๊ฒ ์ฃ !

Order by ์ œ๋Œ€๋กœ ์•Œ์•„๋ณด๊ธฐ: SQL ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ

select name, count(*) from users

group by name

order by count(*);

์œ„ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ: from โ†’ group by โ†’ select โ†’ order by

1.from users: users ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ ์ „์ฒด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

2.group by name: users ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ์—์„œ ๊ฐ™์€ name์„ ๊ฐ–๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ•ฉ์ณ์ค๋‹ˆ๋‹ค.

3.select name, count(*): name์— ๋”ฐ๋ผ ํ•ฉ์ณ์ง„ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ๊ฐ ๋ช‡ ๊ฐœ๊ฐ€ ํ•ฉ์ณ์ง„ ๊ฒƒ์ธ์ง€ ์„ธ์–ด์ค๋‹ˆ๋‹ค.

์˜ˆ) ์ด, ์ด, ๊น€, ๊น€, ๋ฐ• ์ด๋ ‡๊ฒŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์—ˆ๋‹ค๋ฉด, ์ด๋Š” 2๊ฐœ, ๊น€์€ 2๊ฐœ, ๋ฐ•์€ 1๊ฐœ๊ฒ ์ฃ !

4.order by count(*): ํ•ฉ์ณ์ง„ ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜์— ๋”ฐ๋ผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด์ค๋‹ˆ๋‹ค.

โ€‹

Where์™€ Group by, Order by ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

๐Ÿ˜Ž ์›๋ฆฌ๋Š” ๊ฐ„๋‹จํ•ด์š”. Where์ ˆ๋กœ ์กฐ๊ฑด์ด ํ•˜๋‚˜ ์ถ”๊ฐ€๋˜๊ณ , ๊ทธ ์ดํ›„์— Group by, Order by๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ!

์›น๊ฐœ๋ฐœ ์ข…ํ•ฉ๋ฐ˜์˜ ๊ฒฐ์ œ์ˆ˜๋‹จ๋ณ„ ์ฃผ๋ฌธ๊ฑด์ˆ˜ ์„ธ์–ด๋ณด๊ธฐ

  1. orders ํ…Œ์ด๋ธ”์—์„œ ์ฃผ๋ฌธ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค๊ณ 

  2. ์›น๊ฐœ๋ฐœ ์ข…ํ•ฉ๋ฐ˜ ๋ฐ์ดํ„ฐ๋งŒ ๋‚จ๊ธฐ๊ณ 

  3. ๊ฒฐ์ œ์ˆ˜๋‹จ(๋ฒ”์ฃผ) ๋ณ„๋กœ ๊ทธ๋ฃนํ™”ํ•˜๊ณ 

  4. ๊ฒฐ์ œ์ˆ˜๋‹จ๋ณ„ ์ฃผ๋ฌธ๊ฑด์ˆ˜๋ฅผ ์„ธ์–ด์ค€๋‹ค!

select payment_method, count(*) from orders

where course_title = "์›น๊ฐœ๋ฐœ ์ข…ํ•ฉ๋ฐ˜"

group by payment_method;

์œ„์™€ ๊ฐ™์ด, group by์™€ select ์‚ฌ์ด์— where๋กœ ์กฐ๊ฑด์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋!

โ€‹

๋” ์•Œ์•„๋ณด๊ธฐ: SQL ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ

select payment_method, count(*) from orders

where course_title = "์›น๊ฐœ๋ฐœ ์ข…ํ•ฉ๋ฐ˜"

group by payment_method;

๐Ÿ‘‰ ์œ„ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ: from โ†’ where โ†’ group by โ†’ select

1.from orders: users ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ ์ „์ฒด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

2.where course_title = "์›น๊ฐœ๋ฐœ ์ข…ํ•ฉ๋ฐ˜": ์›น๊ฐœ๋ฐœ ์ข…ํ•ฉ๋ฐ˜ ๋ฐ์ดํ„ฐ๋งŒ ๋‚จ๊ฒจ์ค๋‹ˆ๋‹ค.

3.group by payment_method: ๊ฐ™์€ payment_method์„ ๊ฐ–๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ•ฉ์ณ์ค๋‹ˆ๋‹ค.

4.select payment_method, count(*): payment_method์— ๋”ฐ๋ผ ํ•ฉ์ณ์ง„ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ๊ฐ ๋ช‡ ๊ฐœ๊ฐ€ ํ•ฉ์ณ์ง„ ๊ฒƒ์ธ์ง€ ์„ธ์–ด์ค๋‹ˆ๋‹ค.

kakaopay๋Š” 1๊ฐœ๊ฒ ์ฃ !

์˜ˆ) CARD, CARD, kakaopay ์ด๋ ‡๊ฒŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์—ˆ๋‹ค๋ฉด, CARD๋Š” 2๊ฐœ, ๋งŒ์•ฝ order by๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค๋ฉด? order by๋Š” ๋งจ ๋‚˜์ค‘์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค! (๊ฒฐ๊ณผ๋ฌผ์„ ์ •๋ ฌํ•ด์ฃผ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ!)

โ€‹

ํ˜ผ์ž์„œ๋„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด

๐Ÿ‘‰ ๋‹ค์‹œ ๋Œ์•„์˜จ ๊ฐ™์ด ์‚ฝ์งˆํ•ด๋ณด๊ธฐ ์‹œ๊ฐ„!

SQL์„ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ–ˆ๋˜ ์—๋Ÿฌ๋‚˜ ๊ฒฐ๊ณผ๋ฅผ ์ž์ฃผ ๋งˆ์ฃผํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ๋ชจ๋‘ ์™ธ์šฐ๋Š” ๊ฒƒ์€ ํ˜„์‹ค์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒ ์ฃ ?

์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ, ์ €์™€ ๊ฐ™์ด ์‚ฝ์งˆํ•˜๋ฉด์„œ ํ•ด๊ฒฐํ•ด๋ด์š”!

์™œ ์ด๋Ÿฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”์„๊นŒ์š”?

๐Ÿ‘‰ ๋ฒ”์ฃผ์— ๋”ฐ๋ฅธ ํ†ต๊ณ„์น˜๋ฅผ ๊ตฌํ•˜๊ณ  ์‹ถ์–ด group by๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ํ†ต๊ณ„์น˜๋Š” ๋‚˜์˜ค์ง€ ์•Š๊ณ  4๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋งŒ ์ถœ๋ ฅ๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์ฃ .

์™œ ๊ทธ๋Ÿด๊นŒ์š”?

๐Ÿ‘‰ ๋ฒ”์ฃผ๋ณ„๋กœ ๋ฌถ์–ด๋‹ฌ๋ผ๋Š” ๋ช…๋ น์–ด (group by)๋Š” ์ž‘์„ฑํ•ด์คฌ์ง€๋งŒ, ๋ฌถ์€ ๋ฐ์ดํ„ฐ๋ฅผ '์–ด๋–ค ํ†ต๊ณ„์น˜'๋กœ ์ถœ๋ ฅํ•ด๋‹ฌ๋ผ๋Š” ๋ช…๋ น์–ด๊ฐ€ ์—†์–ด์„œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค!

๊ทธ๋Ÿฌ๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ข‹์„๊นŒ์š”?

๐Ÿ‘‰ '์–ด๋–ค ํ†ต๊ณ„์น˜๋กœ' ์ถœ๋ ฅํ•ด๋‹ฌ๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ฒ”์ฃผ๋ณ„ ๊ฐฏ์ˆ˜๋ฅผ ์„ธ์–ด๋ณผ๊นŒ์š”? ์•„๋ž˜์™€ ๊ฐ™์ด์š”!

์•—, ๋ญ”๊ฐ€ ์›ํ•˜๋Š” ํ†ต๊ณ„์น˜๊ฐ€ ๋‚˜์˜จ ๊ฒƒ ๊ฐ™์ง€๋งŒ ๊ฐ๊ฐ ์–ด๋–ค ๋ฒ”์ฃผ์— ๋Œ€ํ•œ ํ†ต๊ณ„์น˜์ธ์ง€๋Š” ๋‚˜์™€์žˆ์ง€ ์•Š์•„์š”.

๊ทธ๋„ ๋‹น์—ฐํ•œ ๊ฒƒ์ด, select ๋ฌธ ์•ˆ์— count(*)๋งŒ ์ ํ˜€์žˆ์–ด์„œ ๊ทธ๋ ‡๊ฒ ์ฃ ?

๐Ÿ‘‰ ๊ทธ๋ ‡๋‹ค๋ฉด group by์— ๋“ค์–ด๊ฐ„ ํ•„๋“œ๋ฅผ ๋˜‘๊ฐ™์ด ์ ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊น”๋”ํ•˜๊ฒŒ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜ ๋‚˜์˜ค๋Š”๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๐Ÿ‘‰ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋˜์ง€ ์•Š์„ ๋•, SQL ์ฟผ๋ฆฌ์˜ ์‹คํ–‰์ˆœ์„œ์— ๋”ฐ๋ผ ์ฐจ๊ทผ์ฐจ๊ทผ ์ƒ๊ฐํ•ด๋ด์š”. ์–ด๋””์„œ ์ฟผ๋ฆฌ๋ฅผ ์ž˜๋ชป ์งฐ๋Š”์ง€ ์ฐพ์•„๋‚ด๋Š” ๊ฐ€์žฅ ๋น ๋ฅด๊ณ  ์ •ํ™•ํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค!

โ€‹

โ€‹

๋ฌธ์ž์—ด์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•ด๋ณด๊ธฐ

select * from users order by email;

๋™์ผํ•˜๊ฒŒ ์•ŒํŒŒ๋ฒณ์œผ๋กœ๋„ ์ž˜ ์ •๋ ฌ์ด ๋ฉ๋‹ˆ๋‹ค.

select * from users order by name;

๊ทธ๋ฆฌ๊ณ , ํ•œ๊ธ€๋กœ๋„ ์ž˜ ์ •๋ ฌ์ด ๋ฉ๋‹ˆ๋‹ค. ์ฐธ ์‰ฝ์ฃ ?

์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•ด๋ณด๊ธฐ

select * from users order by created_at desc;

์ตœ๊ทผ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ๋ณด๊ณ ์‹ถ์„ ๋•Œ, ์œ ์šฉํ•ด์š”!

Group by ์—ฐ์Šตํ•˜๊ธฐ

๐Ÿ‘‰ ์ž, Group by๋Š” ํ€ด์ฆˆ๋ฅผ ํ’€์–ด๋ณผ๊นŒ์š”? (1) ์›ํ•˜๋Š” ํ…Œ์ด๋ธ”๊ณผ (2) ๋ฒ”์ฃผ๋กœ ์‚ฌ์šฉํ•  ํ•„๋“œ (3) ๋ฒ”์ฃผ์— ๋”ฐ๋ผ ํ†ต๊ณ„๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ์‹ถ์€ ํ•„๋“œ (๊ฐœ์ˆ˜์˜ ๊ฒฝ์šฐ ์ œ์™ธ)

์ด ์„ธ ๊ฐ€์ง€๋งŒ ๊ธฐ์–ตํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค!

โ€‹

[๊ฟ€ํŒ] ์ด๋ ‡๊ฒŒ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ํŽธํ•ด์š”!

๐Ÿ‘‰ 1) show tables๋กœ ์–ด๋–ค ํ…Œ์ด๋ธ”์ด ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด๊ธฐ 2) ์ œ์ผ ์›ํ•˜๋Š” ์ •๋ณด๊ฐ€ ์žˆ์„ ๊ฒƒ ๊ฐ™์€ ํ…Œ์ด๋ธ”์— select * from ํ…Œ์ด๋ธ”๋ช… limit 10 ์ฟผ๋ฆฌ ๋‚ ๋ ค๋ณด๊ธฐ 3) ์›ํ•˜๋Š” ์ •๋ณด๊ฐ€ ์—†์œผ๋ฉด ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์—๋„ 2)๋ฅผ ํ•ด๋ณด๊ธฐ 4) ํ…Œ์ด๋ธ”์„ ์ฐพ์•˜๋‹ค! ๋ฒ”์ฃผ๋ฅผ ๋‚˜๋ˆ ์„œ ๋ณด๊ณ ์‹ถ์€ ํ•„๋“œ๋ฅผ ์ฐพ๊ธฐ 5) ๋ฒ”์ฃผ๋ณ„๋กœ ํ†ต๊ณ„๋ฅผ ๋ณด๊ณ ์‹ถ์€ ํ•„๋“œ๋ฅผ ์ฐพ๊ธฐ 6) SQL ์ฟผ๋ฆฌ ์ž‘์„ฑํ•˜๊ธฐ!

โ€‹

๋ณ„์นญ ๊ธฐ๋Šฅ: Alias

๐Ÿ‘‰ ์ฟผ๋ฆฌ๊ฐ€ ์ ์  ๊ธธ์–ด์ง€๋ฉด์„œ ์ข…์ข… ํ—ท๊ฐˆ๋ฆฌ๋Š” ์ผ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ SQL์€ Alias๋ผ๋Š” ๋ณ„์นญ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

select * from orders o

where o.course_title = '์•ฑ๊ฐœ๋ฐœ ์ข…ํ•ฉ๋ฐ˜'

์š”๋ ‡๊ฒŒ ํ…Œ์ด๋ธ”๋ช… ๋’ค์— as๋ฅผ ๋ถ™์—ฌ์„œ ๋ณ„์นญ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๊ณ ,

select payment_method, count(*) as cnt from orders o

where o.course_title = '์•ฑ๊ฐœ๋ฐœ ์ข…ํ•ฉ๋ฐ˜'

group by payment_method

count(*)๊ฐ€ ์•„๋‹ˆ๋ผ cnt๋กœ ์ถœ๋ ฅ๋˜์—ˆ๋„ค์š”!

๐Ÿ‘‰ ์ด์ฒ˜๋Ÿผ, ํ˜ผ๋™์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ์›ํ•˜๋Š” ์ด๋ฆ„์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ผ์š”. ์ด ๊ธฐ๋Šฅ์€ ๋‹ค์Œ ์ฃผ์ฐจ๋ถ€ํ„ฐ ๊ต‰์žฅํžˆ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋‹ˆ, '์ด๋Ÿฐ๊ฒŒ ์žˆ๊ตฌ๋‚˜' ์ •๋„๋กœ๋งŒ ๊ธฐ์–ตํ•ด ์ฃผ์„ธ์š”!

โ€‹

โ€‹

โ€‹Join ์ด๋ž€?

๐Ÿ‘‰ Join์ด๋ž€? ๋‘ ํ…Œ์ด๋ธ”์˜ ๊ณตํ†ต๋œ ์ •๋ณด (key๊ฐ’)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•ด์„œ ํ•œ ํ…Œ์ด๋ธ”์ฒ˜๋Ÿผ ๋ณด๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ด์š”.

์˜ˆ) user_id ํ•„๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ users ํ…Œ์ด๋ธ”๊ณผ orders ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•ด์„œ ํ•œ ๋ˆˆ์— ๋ณด๊ณ  ์‹ถ์–ด์š”!

๐Ÿ‘‰ ์œ„์˜ ์˜ˆ์‹œ์™€ ๊ฐ™์ด, ๋‘ ํ…Œ์ด๋ธ”์˜ ์ •๋ณด๋ฅผ ์—ฐ๊ฒฐํ•ด์„œ ํ•จ๊ป˜ ๋ณด๊ณ ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ๊ฒ ์ฃ ?

๊ทธ๋Ÿด ๋•Œ๋ฅผ ๋Œ€๋น„ํ•ด์„œ ๋ฌด์–ธ๊ฐ€ ์—ฐ๊ฒฐ๋œ ์ •๋ณด๊ฐ€ ์žˆ์„ ๋•Œ, user_id ์ฒ˜๋Ÿผ ๋™์ผํ•œ ์ด๋ฆ„๊ณผ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ํ•„๋“œ๋ฅผ ๋‘ ํ…Œ์ด๋ธ”์— ๋˜‘๊ฐ™์ด ๋‹ด์•„๋†“๋Š”๋‹ต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ํ•„๋“œ๋ฅผ ๋‘ ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐ์‹œ์ผœ์ฃผ๋Š” ์—ด์‡ ๋ผ๋Š” ์˜๋ฏธ๋กœ 'key'๋ผ๊ณ  ๋ถˆ๋Ÿฌ์š”.

[์˜ค๋Š˜์˜ ๊ฟ€ํŒ!] ๋ณ‘์›์—์„œ ์˜์‚ฌ์„ ์ƒ๋‹˜์ด 'ํ™˜์ž๋ฒˆํ˜ธ 101๋ฒˆ๋‹˜ ์ง„๋ฃŒ๋ฐ›์œผ๋Ÿฌ ๋“ค์–ด์˜ค์„ธ์š”' ๋ผ๊ณ  ๋ถˆ๋ €๋Š”๋ฐ ๊ฐ™์€ ํ™˜์ž๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง„ ์‚ฌ๋žŒ์ด ์—ฌ๋Ÿฌ๋ช…์ด ์žˆ์œผ๋ฉด ๋ˆ„๊ฐ€ ๋“ค์–ด์™€์•ผ ํ• ์ง€ ํ™˜์ž๋ฒˆํ˜ธ๋งŒ์œผ๋กœ ์•Œ ์ˆ˜ ์—†๊ฒ ์ฃ ? SQL์—์„œ์˜ Join๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์—์š”. key๊ฐ’์„ ์‚ฌ์šฉํ•ด ์—ฐ๊ฒฐํ•˜๊ณ  ์‹ถ์€ ํ…Œ์ด๋ธ”์— ์ฐพ์•„๊ฐ€์„œ ๋˜‘๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง€๋Š” key๋ฅผ ์ฐพ๊ฒŒ ๋˜๋Š”๋ฐ, ๋˜‘๊ฐ™์€ key๋ฅผ ๊ฐ€์ง€๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ์žˆ์œผ๋ฉด ์–ด๋А ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์—ฐ๊ฒฐํ•ด์•ผ ํ• ์ง€ ์•Œ ์ˆ˜ ์—†์–ด์š”.

[์ฝ”๋“œ์Šค๋‹ˆํŽซ] Join์„ ์‚ฌ์šฉํ•ด์„œ Key๊ฐ’์œผ๋กœ ๋‘ ํ…Œ์ด๋ธ” ์—ฐ๊ฒฐํ•ด๋ณด๊ธฐ

select * from point_users

left join users

on point_users.user_id = users.user_id

๐Ÿ‘‰ [์˜ค๋Š˜์˜ ๊ฟ€ํŒ!] ํ˜น์‹œ ์—‘์…€์„ ์ž˜ ์“ฐ์‹ ๋‹ค๋ฉด?

SQL์˜ Join์€ ์—‘์…€์˜ vlookup๊ณผ ๋™์ผํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค :-)

[์ฝ”๋“œ์Šค๋‹ˆํŽซ] ์œ ์ € ๋ฐ์ดํ„ฐ๋กœ Left Join ์ดํ•ดํ•ด๋ณด๊ธฐ

select * from users u

left join point_users p

on u.user_id = p.user_id;

์–ด๋–ค ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋“  ํ•„๋“œ๊ฐ€ ์ฑ„์›Œ์ ธ์žˆ์ง€๋งŒ, ์–ด๋–ค ๋ฐ์ดํ„ฐ๋Š” ๋น„์–ด์žˆ๋Š” ํ•„๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฝ‰์ฐฌ ๋ฐ์ดํ„ฐ: ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ user_id ํ•„๋“œ๊ฐ’์ด point_users ํ…Œ์ด๋ธ”์— ์กด์žฌํ•ด์„œ ์—ฐ๊ฒฐํ•œ ๊ฒฝ์šฐ ๋น„์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ: ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ user_id ํ•„๋“œ๊ฐ’์ด point_users ํ…Œ์ด๋ธ”์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

๋น„์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ, ํšŒ์›์ด์ง€๋งŒ ์ˆ˜๊ฐ•์„ ๋“ฑ๋ก/์‹œ์ž‘ํ•˜์ง€ ์•Š์•„ ํฌ์ธํŠธ๋ฅผ ํš๋“ํ•˜์ง€ ์•Š์€ ํšŒ์›์ธ ๊ฒฝ์šฐ์—์š”!

โ€‹

Where๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ง์ ‘ ํ™•์ธํ•ด๋ณด๊ธฐ!

๐Ÿ‘‰ ๊ฝ‰์ฐฌ ๋ฐ์ดํ„ฐ, ๋น„์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ์—์„œ ํ•˜๋‚˜์”ฉ user_id๋ฅผ ๋ฝ‘์•„์„œ orders ํ…Œ์ด๋ธ”์—์„œ ์กฐํšŒํ•ด๋ณผ๊นŒ์š”?

๊ฝ‰์ฐฌ ๋ฐ์ดํ„ฐ์˜ user_id๊ฐ’ ์˜ˆ์‹œ: d90e7626 ๋น„์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ user_id๊ฐ’ ์˜ˆ์‹œ: 3b3eac9f

๐Ÿ˜Ž ์œ„์˜ user_id๊ฐ’์œผ๋กœ ์กฐํšŒํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ํ•œ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ถœ๋ ฅ๋˜์ง€๋งŒ, ์•„๋ž˜์˜ user_id๊ฐ’์œผ๋กœ ์กฐํšŒํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์ถœ๋ ฅ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

[์ฝ”๋“œ์Šค๋‹ˆํŽซ] ์œ ์ € ๋ฐ์ดํ„ฐ๋กœ Inner Join ์ดํ•ดํ•ด๋ณด๊ธฐ

select * from users u

inner join point_users p

on u.user_id = p.user_id;

์•—, ์—ฌ๊ธฐ์„œ๋Š” ๋น„์–ด์žˆ๋Š” ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์–ด์š”! ๊ทธ ์ด์œ ๋Š”, ๊ฐ™์€ user_id๋ฅผ ๋‘ ํ…Œ์ด๋ธ”์—์„œ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์ถœ๋ ฅํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด์—์š”.

โ€‹

Join ํ•จ๊ป˜ ์—ฐ์Šตํ•ด๋ณด๊ธฐ

[์‹ค์Šต] orders ํ…Œ์ด๋ธ”์— users ํ…Œ์ด๋ธ” ์—ฐ๊ฒฐํ•ด๋ณด๊ธฐ

select * from orders o

inner join users u

on o.user_id = u.user_id;

[์˜ค๋Š˜์˜ ํŒ!] ์ฃผ๋ฌธ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํšŒ์›์ •๋ณด๊ฐ€ ์žˆ์–ด์•ผ ํ• ํ…Œ๋‹ˆ, orders ํ…Œ์ด๋ธ”์— ๋‹ด๊ธด user_id๋Š” ๋ชจ๋‘ users ํ…Œ์ด๋ธ”์— ์กด์žฌํ•˜๊ฒ ์ฃ ?

[์‹ค์Šต] checkins ํ…Œ์ด๋ธ”์— users ํ…Œ์ด๋ธ” ์—ฐ๊ฒฐํ•ด๋ณด๊ธฐ

select * from checkins c

inner join users u

on c.user_id = u.user_id;

๐Ÿ‘‰ [์˜ค๋Š˜์˜ ํŒ!]

์—ฐ๊ฒฐ์˜ ๊ธฐ์ค€์ด ๋˜๊ณ ์‹ถ์€ ํ…Œ์ด๋ธ”์„ from ์ ˆ์—, ๊ธฐ์ค€์ด ๋˜๋Š” ํ…Œ์ด๋ธ”์— ๋ถ™์ด๊ณ  ์‹ถ์€ ํ…Œ์ด๋ธ”์„ Join ์ ˆ์— ์œ„์น˜ํ•ด ๋†“์Šต๋‹ˆ๋‹ค.

[์‹ค์Šต] enrolleds ํ…Œ์ด๋ธ”์— courses ํ…Œ์ด๋ธ” ์—ฐ๊ฒฐํ•ด๋ณด๊ธฐ

select * from enrolleds e

inner join courses c

on e.course_id = c.course_id;

SQL ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ

select * from enrolleds e

inner join courses c

on e.course_id = c.course_id;

๐Ÿ‘‰ ์œ„ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ: from โ†’ join โ†’ select

[์ฝ”๋“œ์Šค๋‹ˆํŽซ] ๊ณผ๋ชฉ๋ณ„ ์˜ค๋Š˜์˜ ๋‹ค์ง ๊ฐฏ์ˆ˜ ์„ธ์–ด๋ณด๊ธฐ

select co.title, count(co.title) as checkin_count from checkins ci

inner join courses co

on ci.course_id = co.course_id

group by co.title

[์˜ค๋Š˜์˜ ํŒ!] 2์ฃผ์ฐจ์— ๋ฐฐ์šด alias๋Š” ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ํŽธํ•ฉ๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ๋˜๋Š” ํ…Œ์ด๋ธ”์ด ๋งŽ์•„์ง€๋ฉด์„œ ํ•„๋“œ๋ช…๊ณผ ํ…Œ์ด๋ธ”๋ช…์ด ํ—ท๊ฐˆ๋ ค ์‹ค์ˆ˜ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ alias๋ฅผ ์ง€์ •ํ•ด ์ฃผ๋ฉด ํŽธํ•˜๊ณ  ๊น”๋”ํ•˜๊ฒŒ SQL ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด์š”.

point_users ํ…Œ์ด๋ธ”์— users ํ…Œ์ด๋ธ” ์—ฐ๊ฒฐํ•ด์„œ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌํ•ด๋ณด๊ธฐ

[์ฝ”๋“œ์Šค๋‹ˆํŽซ] ๋งŽ์€ ํฌ์ธํŠธ๋ฅผ ์–ป์€ ์ˆœ์„œ๋Œ€๋กœ ์œ ์ € ๋ฐ์ดํ„ฐ ์ •๋ ฌํ•ด์„œ ๋ณด๊ธฐ

select * from point_users p

inner join users u

on p.user_id = u.user_id

order by p.point desc

orders ํ…Œ์ด๋ธ”์— users ํ…Œ์ด๋ธ” ์—ฐ๊ฒฐํ•ด์„œ ํ†ต๊ณ„์น˜ ๋‚ด๋ณด๊ธฐ

[์ฝ”๋“œ์Šค๋‹ˆํŽซ] ๋„ค์ด๋ฒ„ ์ด๋ฉ”์ผ ์‚ฌ์šฉํ•˜๋Š” ์œ ์ €์˜ ์„ฑ์”จ๋ณ„ ์ฃผ๋ฌธ๊ฑด์ˆ˜ ์„ธ์–ด๋ณด๊ธฐ

select u.name, count(u.name) as count_name from orders o

inner join users u

on o.user_id = u.user_id

where u.email like '%naver.com'

group by u.name

SQL ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ

select u.name, count(u.name) as count_name from orders o

inner join users u

on o.user_id = u.user_id

where u.email like '%naver.com'

group by u.name

์œ„ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ: from โ†’ join โ†’ where โ†’ group by โ†’ select

1.from orders o: orders ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ ์ „์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  o๋ผ๋Š” ๋ณ„์นญ์„ ๋ถ™์ž…๋‹ˆ๋‹ค.

2.inner join users u on o.user_id = u.user_id : users ํ…Œ์ด๋ธ”์„ orders ํ…Œ์ด๋ธ”์— ๋ถ™์ด๋Š”๋ฐ, orders ํ…Œ์ด๋ธ”์˜ user_id์™€ ๋™์ผํ•œ user_id๋ฅผ ๊ฐ–๋Š” users ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ™์ž…๋‹ˆ๋‹ค. (*users ํ…Œ์ด๋ธ”์— u๋ผ๋Š” ๋ณ„์นญ์„ ๋ถ™์ž…๋‹ˆ๋‹ค)

3.where u.email like '%naver.com': users ํ…Œ์ด๋ธ” email ํ•„๋“œ๊ฐ’์ด naver.com์œผ๋กœ ๋๋‚˜๋Š” ๊ฐ’๋งŒ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

4.group by u.name: users ํ…Œ์ด๋ธ”์˜ name๊ฐ’์ด ๊ฐ™์€ ๊ฐ’๋“ค์„ ๋ญ‰์ณ์ค๋‹ˆ๋‹ค.

5.select u.name, count(u.name) as count_name : users ํ…Œ์ด๋ธ”์˜ nameํ•„๋“œ์™€ name ํ•„๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ญ‰์ณ์ง„ ๊ฐฏ์ˆ˜๋ฅผ ์„ธ์–ด์„œ ์ถœ๋ ฅํ•ด์ค๋‹ˆ๋‹ค.

โ€‹

Join์˜ ์‹คํ–‰ ์ˆœ์„œ๋Š” ํ•ญ์ƒ from ๊ณผ ๋ถ™์–ด๋‹ค๋‹Œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•ด์š”!Select๋ฅผ ๋‘ ๋ฒˆ ํ•  ๊ฒŒ ์•„๋‹ˆ๋ผ, ํ•œ๋ฒˆ์— ๋ชจ์•„์„œ ๋ณด๊ณ ์‹ถ์€ ๊ฒฝ์šฐ, ์žˆ์„๊ฑธ์š”!

์˜ˆ๋ฅผ ๋“ค๋ฉด ์ด๋ ‡๊ฒŒ!

๐Ÿ‘‰ ๊ทผ๋ฐ, ๊ทธ๋Ÿฌ๋ ค๋ฉด ํ•œ ๊ฐ€์ง€ ์กฐ๊ฑด์ด ์žˆ์–ด์š”! ๋…ธ๋ž€์ƒ‰๊ณผ ํŒŒ๋ž€์ƒ‰ ๋ฐ•์Šค์˜ ํ•„๋“œ๋ช…์ด ๊ฐ™์•„์•ผ ํ•œ๋‹ต๋‹ˆ๋‹ค. ๐Ÿ™‚ (๋‹น์—ฐํ•˜๊ฒ ์ฃ ?)

Union์„ ์ด์šฉํ•ด์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ชจ์Šต์„ ๋งŒ๋“ค์–ด๋ณผ๊นŒ์š”?

์šฐ์„ , 'month'๋ฅผ ๋ถ™์—ฌ์ค˜์•ผ๊ฒ ๋„ค์š”!

select '7์›”' as month, c.title, c2.week, count(*) as cnt from checkins c2 inner join courses c on c2.course_id = c.course_id inner join orders o on o.user_id = c2.user_id where o.created_at < '2020-08-01' group by c2.course_id, c2.week order by c2.course_id, c2.week

์—ฌ๊ธฐ์— ์•„๋ž˜ ์œ„๋กœ Union all์„ ์‚ฌ์šฉํ•ด ๋ถ™์—ฌ์ฃผ๋ฉด ๋!

( select '7์›”' as month, c.title, c2.week, count() as cnt from checkins c2 inner join courses c on c2.course_id = c.course_id inner join orders o on o.user_id = c2.user_id where o.created_at < '2020-08-01' group by c2.course_id, c2.week order by c2.course_id, c2.week ) union all ( select '8์›”' as month, c.title, c2.week, count() as cnt from checkins c2 inner join courses c on c2.course_id = c.course_id inner join orders o on o.user_id = c2.user_id where o.created_at > '2020-08-01' group by c2.course_id, c2.week order by c2.course_id, c2.week )

์•—, ๊ทธ๋Ÿฐ๋ฐ, ํ•œ ๊ฐ€์ง€! ์ •๋ ฌ์ด ๊นจ์กŒ๋„ค์š”!? ๐Ÿ˜‚

๐Ÿ‘‰ ๋„ค ๋งž์Šต๋‹ˆ๋‹ค! union์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‚ด๋ถ€ ์ •๋ ฌ์ด ๋จน์ง€ ์•Š์•„์š”. ์ด ๋•Œ ์œ ์šฉํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์ง€์š”. ๋ฐ”๋กœ, SubQuery(์„œ๋ธŒ์ฟผ๋ฆฌ) !

โ€‹Subquery: ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋” ์‰ฝ๊ฒŒ ์–ป์–ด๋ณด๊ธฐ

Subquery๋ž€? ์ฟผ๋ฆฌ ์•ˆ์˜ ์ฟผ๋ฆฌ๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ํ•˜์œ„ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์œ„ ์ฟผ๋ฆฌ์—์„œ ์‚ฌ์šฉํ•˜๋ฉด, SQL ์ฟผ๋ฆฌ๊ฐ€ ํ›จ์”ฌ ๊ฐ„๋‹จํ•ด์ ธ์š”!

์ฆ‰, Subquery๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์–ป์–ด๋‚ผ ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ๋” ํŽธํ•˜๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํŒŒ์›Œํ’€ํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

Subquery์— ๋Œ€ํ•œ ์ดํ•ด๋„๊ฐ€ ์ƒ๊ธฐ๋ฉด, With๊ตฌ๋ฌธ์„ ์ด์šฉํ•ด์„œ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋ณผ๊ฒŒ์š”!

โ€‹

Subquery ์‚ฌ์šฉ๋ฐฉ๋ฒ• ์ตํ˜€๋ณด๊ธฐ

kakaopay๋กœ ๊ฒฐ์ œํ•œ ์œ ์ €๋“ค์˜ ์ •๋ณด ๋ณด๊ธฐ

โ†’ ์šฐ์„ , ์ด๋ ‡๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ๊ฒ ์ฃ ? users ์™€ orders ์˜ inner join์œผ๋กœ!

select u.user_id, u.name, u.email from users u

inner join orders o on u.user_id = o.user_id

where o.payment_method = 'kakaopay'

๊ทธ๋Ÿฐ๋ฐ, ์ด๊ฒƒ์„ ์ด๋ ‡๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐ๊ธˆ ๋” ์ง๊ด€์ ์ด์ง€ ์•Š๋‚˜์š”?

์šฐ์„  kakaopay๋กœ ๊ฒฐ์ œํ•œ user_id๋ฅผ ๋ชจ๋‘ ๊ตฌํ•ด๋ณด๊ธฐ โ†’ K ๋ผ๊ณ  ํ•ฉ์‹œ๋‹ค.

select user_id from orders

where payment_method = 'kakaopay'

๊ทธ ํ›„์—, user_id๊ฐ€ K ์— ์žˆ๋Š” ์œ ์ €๋“ค๋งŒ ๊ณจ๋ผ๋ณด๊ธฐ

โ†’ ์ด๊ฒŒ ๋ฐ”๋กœ ์„œ๋ธŒ์ฟผ๋ฆฌ!

select u.user_id, u.name, u.email from users u

where u.user_id in (

select user_id from orders

where payment_method = 'kakaopay'

)

์ž์ฃผ ์“ฐ์ด๋Š” Subquery ์œ ํ˜• ์•Œ์•„๋ณด๊ธฐ

๐Ÿ‘‰ ์ž์ฃผ ์“ฐ๋Š” Subquery๋ฅผ ๋จผ์ € ์•Œ์•„๋ณผ๊นŒ์š”? Subquery๋Š” where, select, from ์ ˆ์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์–ด์š”!

Where ์— ๋“ค์–ด๊ฐ€๋Š” Subquery

๐Ÿ‘‰ Where์€ ์กฐ๊ฑด๋ฌธ์ด์ฃ ? Subquery์˜ ๊ฒฐ๊ณผ๋ฅผ ์กฐ๊ฑด์— ํ™œ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

where ํ•„๋“œ๋ช… in (subquery) ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ์š”!

์˜ˆ๋ฅผ ๋“ค๋ฉด, ์นด์นด์˜คํŽ˜์ด๋กœ ๊ฒฐ์ œํ•œ ์ฃผ๋ฌธ๊ฑด ์œ ์ €๋“ค๋งŒ, ์œ ์ € ํ…Œ์ด๋ธ”์—์„œ ์ถœ๋ ฅํ•ด์ฃผ๊ณ  ์‹ถ์„ ๋•Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ .

select * from users u where u.user_id in (select o.user_id from orders o where o.payment_method = 'kakaopay');

์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ๋ฅผ ์ด๋ ‡๊ฒŒ ์ƒ์ƒํ•˜๋ฉด ํŽธํ•ด์š”!

๐Ÿ‘‰ (1) from ์‹คํ–‰: users ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์คŒ (2) Subquery ์‹คํ–‰: ํ•ด๋‹น๋˜๋Š” user_id์˜ ๋ช…๋‹จ์„ ๋ฝ‘์•„์คŒ (3) where .. in ์ ˆ์—์„œ subquery์˜ ๊ฒฐ๊ณผ์— ํ•ด๋‹น๋˜๋Š” 'user_id์˜ ๋ช…๋‹จ' ์กฐ๊ฑด์œผ๋กœ ํ•„ํ„ฐ๋ง ํ•ด์คŒ (4) ์กฐ๊ฑด์— ๋งž๋Š” ๊ฒฐ๊ณผ ์ถœ๋ ฅ

Select ์— ๋“ค์–ด๊ฐ€๋Š” Subquery

๐Ÿ‘‰ Select๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ๋Š” ๋ถ€๋ถ„์ด์ฃ ? ๊ธฐ์กด ํ…Œ์ด๋ธ”์— ํ•จ๊ป˜ ๋ณด๊ณ ์‹ถ์€ ํ†ต๊ณ„ ๋ฐ์ดํ„ฐ๋ฅผ ์†์‰ฝ๊ฒŒ ๋ถ™์ด๋Š” ๊ฒƒ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

select ํ•„๋“œ๋ช…, ํ•„๋“œ๋ช…, (subquery) from .. ์ด๋ ‡๊ฒŒ์š”!

์•ž์„œ ๋ณด์•˜๋˜๊ฒƒ์ฒ˜๋Ÿผ, '์˜ค๋Š˜์˜ ๋‹ค์ง' ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ณ  ์‹ถ์€๋ฐ '์˜ค๋Š˜์˜ ๋‹ค์ง' ์ข‹์•„์š”์˜ ์ˆ˜๊ฐ€, ๋ณธ์ธ์ด ํ‰์†Œ์— ๋ฐ›์•˜๋˜ ์ข‹์•„์š” ์ˆ˜์— ๋น„ํ•ด ์–ผ๋งˆ๋‚˜ ๋†’๊ณ  ๋‚ฎ์€์ง€๊ฐ€ ๊ถ๊ธˆํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ ?

๊ทธ๋Ÿผ, ํ‰๊ท ์„ ๋จผ์ € ๊ตฌํ•ด๋ด…์‹œ๋‹ค! user_id='4b8a10e6' ๋ฅผ ์˜ˆ์‹œ๋กœ!

select avg(likes) from checkins c2 where c2.user_id = '4b8a10e6'

๊ทธ๋Ÿฌ๋ฉด, ์ด๋ ‡๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์š”!

select c.checkin_id, c.user_id, c.likes, (select avg(likes) from checkins c2 where c2.user_id = c.user_id) as avg_like_user from checkins c;

์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ๋ฅผ ์ด๋ ‡๊ฒŒ ์ƒ์ƒํ•˜๋ฉด ํŽธํ•ด์š”!

๐Ÿ‘‰ (1) ๋ฐ–์˜ select * from ๋ฌธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ์ค„ํ•œ์ค„ ์ถœ๋ ฅํ•˜๋Š” ๊ณผ์ •์—์„œ (2) select ์•ˆ์˜ subquery๊ฐ€ ๋งค ๋ฐ์ดํ„ฐ ํ•œ์ค„๋งˆ๋‹ค ์‹คํ–‰๋˜๋Š”๋ฐ (3) ๊ทธ ๋ฐ์ดํ„ฐ ํ•œ ์ค„์˜ user_id๋ฅผ ๊ฐ–๋Š” ๋ฐ์ดํ„ฐ์˜ ํ‰๊ท  ์ข‹์•„์š” ๊ฐ’์„ subquery์—์„œ ๊ณ„์‚ฐํ•ด์„œ (4) ํ•จ๊ป˜ ์ถœ๋ ฅํ•ด์ค€๋‹ค!

From ์— ๋“ค์–ด๊ฐ€๋Š” Subquery (๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์œ ํ˜•!)

๐Ÿ‘‰ From์€ ์–ธ์ œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„๊นŒ์š”? ๋‚ด๊ฐ€ ๋งŒ๋“  Select์™€ ์ด๋ฏธ ์žˆ๋Š” ํ…Œ์ด๋ธ”์„ Joinํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ๋”ฑ์ด๊ฒ ์ฃ !

โ€‹

์ž, ์šฐ์„  ์œ ์ € ๋ณ„ ์ข‹์•„์š” ํ‰๊ท ์„ ๋จผ์ € ๊ตฌํ•ด๋ณผ๊นŒ์š”?

โ†’ checkins ํ…Œ์ด๋ธ”์„ user_id๋กœ group by ํ•˜๋ฉด ๋˜๊ฒ ์ฃ ?

select user_id, round(avg(likes),1) as avg_like from checkins group by user_id

์ž, ์ด์ œ ์—ฌ๊ธฐ์„œ ํ•ด๋‹น ์œ ์ € ๋ณ„ ํฌ์ธํŠธ๋ฅผ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด?

โ†’ ๊ทธ๋Ÿฌ๋ฉด, ํฌ์ธํŠธ์™€ like์˜ ์ƒ๊ด€์ •๋„๋ฅผ ์•Œ ์ˆ˜ ์žˆ๊ฒ ์ฃ ?

select pu.user_id, a.avg_like, pu.point from point_users pu inner join ( select user_id, round(avg(likes),1) as avg_like from checkins group by user_id ) a on pu.user_id = a.user_id

์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ๋ฅผ ์ด๋ ‡๊ฒŒ ์ƒ์ƒํ•˜๋ฉด ํŽธํ•ด์š”!

๐Ÿ‘‰ (1) ๋จผ์ € ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ select๊ฐ€ ์‹คํ–‰๋˜๊ณ , (2) ์ด๊ฒƒ์„ ํ…Œ์ด๋ธ”์ฒ˜๋Ÿผ ์—ฌ๊ธฐ๊ณ  ๋ฐ–์˜ select๊ฐ€ ์‹คํ–‰!

โ€‹

with ์ ˆ๋กœ ๋” ๊น”๋”ํ•˜๊ฒŒ ์ฟผ๋ฆฌ๋ฌธ์„ ์ •๋ฆฌํ•˜๊ธฐ

[์ฝ”๋“œ์Šค๋‹ˆํŽซ] ์ฝ”์Šค์ œ๋ชฉ๋ณ„ like ๊ฐœ์ˆ˜, ์ „์ฒด, ๋น„์œจ

select c.title, a.cnt_checkins, b.cnt_total, (a.cnt_checkins/b.cnt_total) as ratio from ( select course_id, count(distinct(user_id)) as cnt_checkins from checkins group by course_id ) a inner join ( select course_id, count(*) as cnt_total from orders group by course_id ) b on a.course_id = b.course_id inner join courses c on a.course_id = c.course_id

๋‹ค์‹œ ์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณผ๊นŒ์š”?

select c.title, a.cnt_checkins, b.cnt_total, (a.cnt_checkins/b.cnt_total) as ratio from ( select course_id, count(distinct(user_id)) as cnt_checkins from checkins group by course_id ) a inner join ( select course_id, count(*) as cnt_total from orders group by course_id ) b on a.course_id = b.course_id inner join courses c on a.course_id = c.course_id

์ด๋ ‡๊ฒŒ ๊ณ„์† ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ๋ถ™์œผ๋ฉด, inner join ์•ˆ์ชฝ์ด ๋„ˆ๋ฌด ํ—ท๊ฐˆ๋ฆฌ๊ฒ ์ฃ !

โ†’ ๊ทธ ๋•Œ ์“ฐ๋Š” ๊ฒƒ์ด with ์ ˆ! ๊ฒฐ๊ณผ๋Š” ๊ฐ™์€๋ฐ ํ›จ์”ฌ ๋ณด๊ธฐ๊ฐ€ ์ข‹์ฃ ?

๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ ๋‹ค๋ค„๋ณด๊ธฐ

๐Ÿ‘‰ ์‹ค์ œ ์—…๋ฌด์—์„œ๋Š”, ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•˜๋Š” ํ˜•ํƒœ๋กœ ํ•œ๋ฒˆ ์ •๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด ์ชผ๊ฐœ๋ณด๊ธฐ

๐Ÿ‘‰ ์ด๋ฉ”์ผ ์ฃผ์†Œ์—์„œ @์•ž์˜ ์•„์ด๋””๋งŒ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜, @๋’ค์˜ ์ด๋ฉ”์ผ ๋„๋ฉ”์ธ์„ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์–ด์š”!

SUBSTRING_INDEX ๋ผ๋Š” ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ฟผ๋ฆฌ๋ฅผ ๋ณผ๊นŒ์š”?

[์ฝ”๋“œ์Šค๋‹ˆํŽซ] ์ด๋ฉ”์ผ์—์„œ ์•„์ด๋””๋งŒ ๊ฐ€์ ธ์™€๋ณด๊ธฐ

select user_id, email, SUBSTRING_INDEX(email, '@', 1) from users

๐Ÿ‘‰ @๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ…์ŠคํŠธ๋ฅผ ์ชผ๊ฐœ๊ณ , ๊ทธ ์ค‘ ์ฒซ ๋ฒˆ์งธ ์กฐ๊ฐ์„ ๊ฐ€์ ธ์˜ค๋ผ๋Š” ๋œป!

[์ฝ”๋“œ์Šค๋‹ˆํŽซ] ์ด๋ฉ”์ผ์—์„œ ์ด๋ฉ”์ผ ๋„๋ฉ”์ธ๋งŒ ๊ฐ€์ ธ์™€๋ณด๊ธฐ

select user_id, email, SUBSTRING_INDEX(email, '@', -1) from users

๐Ÿ‘‰ @๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ…์ŠคํŠธ๋ฅผ ์ชผ๊ฐœ๊ณ , ๊ทธ ์ค‘ ๋งˆ์ง€๋ง‰ ์กฐ๊ฐ์„ ๊ฐ€์ ธ์˜ค๋ผ๋Š” ๋œป!

๋ฌธ์ž์—ด ์ผ๋ถ€๋งŒ ์ถœ๋ ฅํ•˜๊ธฐ

๐Ÿ‘‰ orders ํ…Œ์ด๋ธ”์—์„œ created_at์„ ๋‚ ์งœ๊นŒ์ง€๋งŒ ์ถœ๋ ฅํ•˜๊ฒŒ ํ•ด๋ด…์‹œ๋‹ค!

SUBSTRING ์ด๋ผ๋Š” ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋Ÿฌ ๊ฐ€์‹œ์ฃ !

[์ฝ”๋“œ์Šค๋‹ˆํŽซ] orders ํ…Œ์ด๋ธ”์—์„œ ๋‚ ์งœ๊นŒ์ง€ ์ถœ๋ ฅํ•˜๊ฒŒ ํ•ด๋ณด๊ธฐ

select order_no, created_at, substring(created_at,1,10) as date from orders

SUBSTRING(๋ฌธ์ž์—ด, ์ถœ๋ ฅ์„ ํ•˜๊ณ ์‹ถ์€ ์ฒซ ๊ธ€์ž์˜ ์œ„์น˜, ๋ช‡๊ฐœ์˜ ๊ธ€์ž๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ์€์ง€)

[์ฝ”๋“œ์Šค๋‹ˆํŽซ] ์ผ๋ณ„๋กœ ๋ช‡ ๊ฐœ์”ฉ ์ฃผ๋ฌธ์ด ์ผ์–ด๋‚ฌ๋Š”์ง€ ์‚ดํŽด๋ณด๊ธฐ

select substring(created_at,1,10) as date, count(*) as cnt_date from orders group by date

CASE: ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์›ํ•˜๋Š” ๊ฐ’์„ ์ƒˆ ํ•„๋“œ์— ์ถœ๋ ฅํ•ด๋ณด๊ธฐ

๐Ÿ‘‰ 10000์ ๋ณด๋‹ค ๋†’์€ ํฌ์ธํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด '์ž˜ ํ•˜๊ณ  ์žˆ์–ด์š”!', ํ‰๊ท ๋ณด๋‹ค ๋‚ฎ์œผ๋ฉด '์กฐ๊ธˆ ๋” ๋‹ฌ๋ ค์ฃผ์„ธ์š”!' ๋ผ๊ณ  ํ‘œ์‹œํ•ด ์ฃผ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ์š”?

[์ฝ”๋“œ์Šค๋‹ˆํŽซ] ํฌ์ธํŠธ ๋ณด์œ ์•ก์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ํ‘œ์‹œํ•ด์ฃผ๊ธฐ

select pu.point_user_id, pu.point, case when pu.point > 10000 then '์ž˜ ํ•˜๊ณ  ์žˆ์–ด์š”!' else '์กฐ๊ธˆ ๋” ๋‹ฌ๋ ค์ฃผ์„ธ์š”!' END as '๊ตฌ๋ถ„' from point_users pu;

CASE: ์‹ค์ „์„ ์œ„ํ•œ ํŠธ๋ฆญ!

๐Ÿ‘‰ Subquery๋ฅผ ์ด์šฉํ•˜๋ฉด ์ด๋Ÿฐ ํ†ต๊ณ„๋„ ๋‚ผ ์ˆ˜ ์žˆ์–ด์š”!

์šฐ์„  ๋ช‡ ๊ฐ€์ง€๋กœ ๊ตฌ๋ถ„์„ ๋‚˜๋ˆ„๊ณ ,

select pu.point_user_id, pu.point, case when pu.point > 10000 then '1๋งŒ ์ด์ƒ' when pu.point > 5000 then '5์ฒœ ์ด์ƒ' else '5์ฒœ ๋ฏธ๋งŒ' END as lv from point_users pu

์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์ด์šฉํ•ด์„œ group by๋กœ ํ†ต๊ณ„๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

select level, count(*) as cnt from ( select pu.point_user_id, pu.point, case when pu.point > 10000 then '1๋งŒ ์ด์ƒ' when pu.point > 5000 then '5์ฒœ ์ด์ƒ' else '5์ฒœ ๋ฏธ๋งŒ' END as lv from point_users pu ) a group by lv

with ์ ˆ๊ณผ ํ•จ๊ป˜ํ•˜๋ฉด ๊ธˆ์ƒ์ฒจํ™”์ฃ !

profile
์•ˆ๋…•ํ•˜์„ธ์š”

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