header-img
Info :
๋ฐ€๋„
denseยน
์žฅ๋ž˜ํฌ๋ง : ๋‹จ์œ„ ๋ถ€ํ”ผ ๋‹น ์งˆ๋Ÿ‰์ด ๋ณด๋‹ค ๋นฝ๋นฝํ•œ ์‚ฌ๋žŒ ๋˜๊ธฐ
TOOLS/SQL 14
list_img
Bigquery: GROUP BY ALL, ์ฟผ๋ฆฌ ์ž๋™ ๊ทธ๋ฃนํ™” ์‹œํ‚ค๊ธฐ
2024.03.24
02์›” 26์ผ์ž๋กœ ๋น…์ฟผ๋ฆฌ์— GROUP BY ALL ๋ฌธ๋ฒ•์ด ์ถ”๊ฐ€๋๋‹ค. ๊ธฐ์กด์—๋Š” ์ฟผ๋ฆฌ๋ฅผ ๋ฌถ๊ณ  ์‹ถ์œผ๋ฉด GROUP BY์— ์ปฌ๋Ÿผ์„ ์ง€์ •ํ•ด์ค˜์•ผ ํ–ˆ๋Š”๋ฐ, GROUP BY ALL ๋ฌธ๋ฒ•์˜ ์ถ”๊ฐ€๋กœ ์ด์ œ ๋น…์ฟผ๋ฆฌ๊ฐ€ SELECT ์ ˆ์—์„œ ๊ทธ๋ฃนํ™”ํ•  ํ‚ค๋ฅผ ์•Œ์•„์„œ ๋ฌถ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋๋‹ค. ๋ฌถ๋Š” ์กฐ๊ฑด์€ ๋‹จ์ˆœํ•œ๋ฐ, ์ง‘๊ณ„ ํ•จ์ˆ˜๋‚˜ ์œˆ๋„์šฐ ํ•จ์ˆ˜ ์™ธ ๋ช‡ ๊ฐ€์ง€ ๊ณต์‹ ๋ฌธ์„œ์—์„œ ์ง€์ •ํ•œ ๋ถˆ๊ฐ€ ํ˜•ํƒœ ์ œ์™ธํ•˜๊ณ  ๋‚˜๋จธ์ง€ ์ปฌ๋Ÿผ์€ ๋‹ค ๊ทธGROUP BY์— ํฌํ•จ์‹œํ‚ค๋Š” ์‹์ด๋‹ค. ์ด ๋•Œ ์ƒ๊ธฐ ์กฐ๊ฑด๋“ค์„ ์ œ์™ธํ•˜๊ณ  ๋‚œ ํ›„, ๋‚จ์€ SELECT ํ•ญ๋ชฉ ์ค‘ ๊ทธ๋ฃนํ™” ๋ถˆ๊ฐ€ํ•œ ์œ ํ˜•์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋‹ค์Œ ์˜ˆ์ œ์—์„œ ์ฟผ๋ฆฌ๋Š” first_name๊ณผ last_name ๊ธฐ์ค€์œผ๋กœ ๊ทธ๋ฃนํ™”๋œ๋‹ค. total_points๋Š” ์ง‘๊ณ„ ํ•จ์ˆ˜ ๊ฐ’์ด๋ฏ€๋กœ ์ œ์™ธ๋๋‹ค. WITH PlayerStats AS ( ..
list_img
SQL: SELECT/ FROM/ WHERE ์ ˆ ์„œ๋ธŒ ์ฟผ๋ฆฌ Subquery
2024.03.07
์„œ๋ธŒ ์ฟผ๋ฆฌSubquery๋ž€ ๋ฉ”์ธ ์ฟผ๋ฆฌMain query๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€๋กœ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ถ€๊ฐ€์ ์ธ SELECT๋ฌธ์„ ๋งํ•œ๋‹ค. ์–ด๋–ค ๋ฉ”์ธ ์ฟผ๋ฆฌ์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋Š” ์˜๋ฏธ์—์„œ ๋‚ด๋ถ€ ์ฟผ๋ฆฌInner query๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•œ๋‹ค. ์ด๋•Œ, ๋ฉ”์ธ ์ฟผ๋ฆฌ๋Š” ์™ธ๋ถ€ ์ฟผ๋ฆฌOuter query๋กœ ์ง€์นญ๋  ์ˆ˜ ์žˆ๋‹ค. ์„œ๋ธŒ ์ฟผ๋ฆฌ์˜ ํ˜•ํƒœ / ์‹คํ–‰ ์กฐ๊ฑด SELECT ์—ด FROM ํ…Œ์ด๋ธ” WHERE ์กฐ๊ฑด์‹ ( SELECT ์—ด FROM ํ…Œ์ด๋ธ” WHERE ์กฐ๊ฑด์‹ ) (1) ๋ฐ˜๋“œ์‹œ ๊ด„ํ˜ธ์— ๊ฐ์‹ธ์ง„ ํ˜•ํƒœ๋กœ ์“ฐ์ธ๋‹ค. (2) SELECT๋ฌธ์˜ ํ˜•ํƒœ๋กœ๋งŒ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. (3) ์ฟผ๋ฆฌ์˜ ๋์—์„œ ;์„ธ๋ฏธ ์ฝœ๋ก ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. (4) ORDER BY์ ˆ์„ ์‚ฝ์ž…ํ•  ์ˆ˜ ์—†๋‹ค. ์„œ๋ธŒ ์ฟผ๋ฆฌ์˜ ํŠน์ง• (1) ๋น„๊ต ํ˜น์€ ์กฐํšŒ์˜ ๋Œ€์ƒ์ด ๋  ๋•Œ ์กฐํšŒ ๋Œ€์ƒ..
list_img
SQL ๋ฌธ์ œํ’€์ด: ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์—†์ด ์กฐํšŒํ•˜๋Š” ์กฐ๊ฑด ์„ค์ •ํ•˜๊ธฐ, LOWER
2024.02.28
๋ณดํ˜ธ์†Œ์— ๋Œ์•„๊ฐ€์‹  ํ• ๋จธ๋‹ˆ๊ฐ€ ๊ธฐ๋ฅด๋˜ ๊ฐœ๋ฅผ ์ฐพ๋Š” ์‚ฌ๋žŒ์ด ์ฐพ์•„์™”๋‹ค. ์ด ์‚ฌ๋žŒ์ด ๋งํ•˜๊ธธ ํ• ๋จธ๋‹ˆ๊ฐ€ ๊ธฐ๋ฅด๋˜ ๊ฐœ๋Š” ์ด๋ฆ„์— 'el'์ด ๋“ค์–ด๊ฐ„๋‹ค๊ณ . ๋™๋ฌผ ๋ณดํ˜ธ์†Œ์— ๋“ค์–ด์˜จ ๋™๋ฌผ ์ค‘ ์ด๋ฆ„์ด 'el'์ด ๋“ค์–ด๊ฐ€๋Š” ๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฝ‘์œผ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ• ๊นŒ. ๋ฌธ์ œ๋Š”, ๊ฐœ์˜ ์ด๋ฆ„์„ ํŠน์ •ํ•  ์ˆ˜ ์—†์œผ๋‹ˆ ๋Œ€์†Œ๋ฌธ์ž ์—ญ์‹œ ํ™•๋‹ตํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฑฐ๋‹ค. ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ WHERE์ ˆ์— ๋„ฃ์–ด ์ฃผ๋Š” ๋ฐฉํ–ฅ๋„ ์žˆ๊ฒ ์ง€๋งŒ, ๋ฌธ์ž์—ด์„ ์ „๋ถ€ ๋Œ€๋ฌธ์ž๋‚˜ ์†Œ๋ฌธ์ž๋กœ ๋ฐ”๊ฟ” ๋ฒ„๋ฆฌ๋Š” UPPER๋‚˜ LOWER๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฌผ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. WHERE name LIKE LOWER('%EL%') ๋‚˜๋จธ์ง€๋Š” ์‰ฝ๋‹ค. ์กฐ๊ฑด์„ ์ฑ„์›Œ์„œ ์ฟผ๋ฆฌ๋ฅผ ๋งˆ์ € ์งœ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค. SELECT animal_id , name FROM animal_ins WHERE name L..
list_img
SQL ๋ฌธ์ œํ’€์ด: ๋ฐ์ดํ„ฐ์˜ ๊ทธ๋ฃน๋ณ„ ํ‰๊ท  ๊ธฐ๊ฐ„ ๋ฝ‘๊ธฐ, DATEDIFF/ AVG
2024.02.28
> ์—ฌ๊ธฐ ์–ด๋–ค ์ž๋™์ฐจ ๋Œ€์—ฌ์ ์ด ์žˆ๋‹ค. ์ด ์ž๋™์ฐจ ๋Œ€์—ฌ์ ์—์„œ๋Š” ๊ธฐ์กด ๊ณ ๊ฐ๋“ค์„ ํ™•์‹คํžˆ ์žก์•„๋‘๊ธฐ ์œ„ํ•ด ์ฃผ ๊ณ ๊ฐ์ธต์— ์ตœ๋Œ€ํ•œ์˜ ๊ฐ€๊ฒฉ ๋ฉ”๋ฆฌํŠธ๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๊ฒฉ ์ •์ฑ…์„ ๊ฐœํŽธํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์ด๋ฒˆ EDAํƒ์ƒ‰์  ๋ฐ์ดํ„ฐ ๋ถ„์„๋Š” ์ด๋ฅผ ์œ„ํ•œ ๊ณ ๊ฐ ์„ธ๋ถ„ํ™” ๊ณผ์ •์ด๋‹ค. ํ‰๊ท  ๋Œ€์—ฌ ๊ธฐ๊ฐ„์ด 7์ผ ์ด์ƒ์ธ ์ž๋™์ฐจ๋“ค์˜ ํ‰๊ท  ๋Œ€์—ฌ ๊ธฐ๊ฐ„(์ปฌ๋Ÿผ๋ช…: average_duration) ๋ฆฌ์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ? ๋จผ์ € ๋ฌธ์ œ๋ฅผ ํ•ด์†Œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ „์ฒด ๋ฆฌ์ŠคํŠธ์˜ ํ‰๊ท  ๋Œ€์—ฌ ๊ธฐ๊ฐ„์„ ๋ฆฌ์ŠคํŠธํ™”ํ•ด์•ผ ํ•œ๋‹ค. ํŒŒํŽธํ™”๋˜์–ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์–ด ์ฃผ๊ณ , GROUP BY car_id ์ด ๋ฐ์ดํ„ฐ์˜ ๊ธฐ์ค€์œผ๋กœ ํ‰๊ท  ๋Œ€์—ฌ ๊ธฐ๊ฐ„์„ ๋ฝ‘๋Š”๋‹ค. ๋Œ€์—ฌ ๊ธฐ๊ฐ„์€ ๋Œ€์—ฌ์ข…๋ฃŒ์ผ๊ณผ ๋Œ€์—ฌ์‹œ์ž‘์ผ์˜ ์ฐจ๋กœ ๊ณ„์‚ฐ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ๋•Œ ๋Œ€์—ฌ์‹œ์ž‘์ผ ์—ญ์‹œ ํ•˜๋ฃจ๋กœ ๊ณ„์‚ฐ๋˜๊ธฐ ..
list_img
SQL: mysql์—์„œ์˜ FULL OUTER JOIN
2024.02.21
์‹ค๋ฌด์—์„œ๋Š” ์ข…์ข… ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐใ…ก๊ธฐ์ค€ํ‚ค๊ฐ€ ๊ณต๋ฐฑ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•œ, ๋‹ค์‹œ ๋งํ•ด ํ•ฉ์ง‘ํ•ฉใ…ก๋ฅผ ๋ถˆ๋Ÿฌ์™€์•ผ ํ•  ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธด๋‹ค. ํƒ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋Š” ์ด๋ฅผ FULL OUTER JOIN์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ง€์›ํ•˜์ง€๋งŒ, mysql์—์„œ๋Š” ์•„์‰ฝ๊ฒŒ๋„ ์ด๋ฅผ ๊ณต์‹์ ์œผ๋กœ ์ง€์›ํ•˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค. ๊ทธ๋Ÿฌ๋ฉด mysql์—์„œ๋Š” ํ•ฉ์ง‘ํ•ฉ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋ƒ๊ณ ? ๊ทธ๊ฑด ์•„๋‹ˆ๋‹ค. LEFT JOIN๊ณผ RIGHT JOIN์„ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ mysql์—์„œ๋„ ์ด๋ฅผ ๊ฐ„์ ‘์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์™ธ๊ตญ ๋ธ”๋กœ๊ทธ์— ํ•ด๋‹น ๋‚ด์šฉ์— ๋Œ€ํ•ด ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ํ‘œ์‹œํ•œ ํฌ์ŠคํŠธ๊ฐ€ ์žˆ์–ด ๋ฒˆ์—ญํ•ด ๊ฐ€์ ธ์™€ ๋ณธ๋‹ค. sales์™€ orders๋ผ๋Š” ๋‘ ํ…Œ์ด๋ธ”์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด์ž. sales์™€ orders์—๋Š” ๋™์ผํ•˜๊ฒŒ id์ฃผ๋ฌธ ์•„์ด๋””์™€ order_date(ํ˜•์‹์ด ์‚ด์ง ๋‹ค๋ฅธ)์ฃผ๋ฌธ ์ผ์ž, a..
list_img
SQL ๋ฌธ์ œํ’€์ด: ์กฐ๊ฑด์— ๋งž๋Š” ๋‹ค์ค‘ํ–‰ ์ถœ๋ ฅ, ๋‹ค์ค‘ํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ+ ์œˆ๋„์šฐ ํ•จ์ˆ˜
2024.02.21
๋‹น์‹ ์€ A์‹ํ’ˆ ์˜์—…ํŒ€ ๋‹ด๋‹น์ž๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ์ •๋Ÿ‰์ ์œผ๋กœ ์ œํ’ˆ๋ณ„ ํŒ๋งค ์„ฑ๊ณผ๋ฅผ ํ™•์ธํ•˜๊ณ ์ž ๋งˆํŠธ ์ „์‚ฐ ๊ธฐ์žฌ๋œ ์ž์‚ฌ ์ƒํ’ˆ ๊ธฐ๋ฐ˜์œผ๋กœ EDAํƒ์ƒ‰์  ๋ฐ์ดํ„ฐ ๋ถ„์„๋ฅผ ์ง„ํ–‰ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. food_product ํ…Œ์ด๋ธ”์—์„œ ์‹ํ’ˆ๋ถ„๋ฅ˜๋ณ„๋กœ ๊ฐ€๊ฒฉ์ด ๊ฐ€์žฅ ๋น„์‹ธ๊ฑฐ๋‚˜ ์‹ผ '๊ณผ์ž', '๊ตญ', '๊น€์น˜', '์‹์šฉ์œ '์˜ category, price, product_name์„ ์กฐํšŒํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ์ฟผ๋ฆฌ๋ฅผ ์งœ์•ผ ํ• ๊นŒ? '์‹ํ’ˆ๋ถ„๋ฅ˜๋ณ„' ์ด๋ผ ํ–ˆ์œผ๋‹ˆ ์ƒํ’ˆ์„ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์–ด์•ผ ํ•œ๋‹ค. ๋˜, GROUP BY์™€ ์œˆ๋„์šฐ ํ•จ์ˆ˜ ์ค‘์—๋Š” ์œˆ๋„์šฐ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์™œ๋ƒ๋ฉด ์—ฐ์‚ฐ๋œ ๊ฒฐ๊ณผ๊ฐ’์ด ์•„๋‹ˆ๋ผ ์—ฐ์‚ฐ์— ๋งž๋Š” ๊ฐ’์„ ๊ฐ€์ง„ ๋กœ์šฐ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•˜๋‹ˆ๊นŒ. ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์ข€ ๋” ๊นŠ์ด ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ์œˆ๋„์šฐ ํ•จ์ˆ˜Window Function VS GROUP BY ํฌ์ŠคํŠธ๋ฅผ..
list_img
SQL: ์œˆ๋„์šฐ ํ•จ์ˆ˜Window Function VS GROUP BY
2024.02.20
์œˆ๋„์šฐ ํ•จ์ˆ˜Window Function๋Š” 'ํ–‰์„ ์กฐ๊ฑด์— ๋งž๊ฒŒ ๊ตฌ๋ถ„ํ•ด ์ฃผ๋Š”' ํ•จ์ˆ˜๋‹ค. ์ด์ฏค ๋งํ•˜๋ฉด ๋‹น์‹  ๋จธ๋ฆฟ์†์— ๋– ์˜ค๋ฅธ ๋ฌธ๋ฒ•์ด ํ•˜๋‚˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๋งž๋‹ค. GROUP BY. ์ด๊ฒƒ ์—ญ์‹œ ํ–‰์„ ์กฐ๊ฑด์— ๋งž๊ฒŒ ๊ตฌ๋ถ„ํ•ด ์ค€๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์˜๋ฌธ์ด ๋“ ๋‹ค. GROUP BY ์ ˆ๊ณผ ๋Œ€๋น„ํ•ด ์œˆ๋„์šฐ ํ•จ์ˆ˜๋Š” ์–ด๋–ค ์ฐจ์ด์ ์ด ์žˆ๊ณ  ๊ทธ๋ž˜์„œ ๊ฒฐ๊ตญ ์–ด๋–ค ์ƒํ™ฉ์— ์‚ฌ์šฉ๋˜๋Š” ๊ฑธ๊นŒ. ์ด๋ฒˆ ํฌ์ŠคํŠธ๋Š” ์ด์ฒ˜๋Ÿผ ์œ ์‚ฌํ•œ ๋ฌธ๋งฅ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋‘ ๋ฌธ๋ฒ•, GROUP BY ์ ˆ๊ณผ ์œˆ๋„์šฐ ํ•จ์ˆ˜์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ํƒ๊ตฌํ•ด๋ณผ ๊ฒƒ์ด๋‹ค. ๋ฌธ๋ฒ•์— ๋Œ€ํ•ด ๋‹ค๋ฃจ๊ธฐ ์•ž์„œ์„œ ์ฆ‰ 'ํ–‰์„ ๋ฌถ๋Š”๋‹ค'๋Š” ํ–‰๋™์— ๋Œ€ํ•ด ๋จผ์ € ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ํ–‰์„ ๋ฌถ๋Š”๋‹ค๋Š” ๊ฒƒ์€ ์ผ์ฐจ์ ์œผ๋กœ ํ–‰ ์‚ฌ์ด์˜ ๊ณตํ†ต์ ์„ ์ฐพ๋Š”๋‹ค๋Š” ๋œป์ด๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์€ ์—‘์…€ ํŒŒ์ผ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด์ž. ์ด๋ฆ„ ์„ฑ๋ณ„ ๋‚˜์ด ๊น€์—์ด ๋‚จ 15 ์ด๋น„ ์—ฌ 17 ๊น€..
list_img
SQL ๋ฌธ์ œํ’€์ด: ๋‹ค๋ฅธ ํ…Œ์ด๋ธ” ๊ฐ’ ๊ธฐ์ค€์œผ๋กœ ๋ฉ”์ธ ํ…Œ์ด๋ธ”์— ๊ฐ’ ๋ถ€์—ฌํ•˜๊ธฐ
2024.02.19
์‹œํ—˜์ด ๋๋‚ฌ๋‹ค. ํ•˜์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ ๋‹น์‹ ์€ ํ•™๊ต ์„ ์ƒ๋‹˜์ด๋‹ค. ์•„์ด๋“ค์ด ๊ฐ€๋ฒผ์šด ๋งˆ์Œ์œผ๋กœ ํ•˜๊ตํ•˜๋Š” ๊ฒƒ๊ณผ ๋ณ„๊ฐœ๋กœ ๋‹น์‹ ์€ ์ฑ„์ ๋œ ์ ์ˆ˜ ๊ธฐ์ค€์œผ๋กœ ์•„์ด๋“ค์˜ ๋“ฑ๊ธ‰์„ ๋งค๊ฒจ์•ผ ํ•  ์ค‘์š”ํ•œ ์ฑ…๋ฌด๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค. ๋‹น์‹  ์•ž์—๋Š” Students ํ…Œ์ด๋ธ”๊ณผ Grades ํ…Œ์ด๋ธ”์ด ๋†“์—ฌ ์žˆ๋‹ค. ํ•˜๋‚˜๋Š” ํ•™์ƒ์˜ ์ด๋ฆ„๊ณผ ์ ์ˆ˜๊ฐ€ ๋“ค์–ด ์žˆ๋Š” ํ…Œ์ด๋ธ”์ด๊ณ  ๋‚˜๋จธ์ง€ ํ•˜๋‚˜๋Š” ์ ์ˆ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•™์ƒ์„ ๊ทธ๋ฃน ๋‚˜๋ˆ„๋Š” ๋“ฑ๊ธ‰ ํ…Œ์ด๋ธ”์ด๋‹ค. ๋‘ ํ…Œ์ด๋ธ”์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค. ๋น„๊ต์  ๋œ ์‚ฝ์งˆํ•˜๊ณ  ์•„์ด๋“ค์˜ ๋“ฑ๊ธ‰์„ ๋งค๊ธธ ์ฟผ๋ฆฌ๋ฅผ ์งค ๋ฐฉ๋ฒ•์€ ์—†์„๊นŒ. ๋ฌผ๋ก  ์ €๋ฒˆ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ CASE WHEN์œผ๋กœ ์ผ์ผ์ด ์ง€์ •ํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ฒ ์ง€๋งŒ, MIN ๊ฐ’๊ณผ MAX ๊ฐ’์ด ์žˆ๋Š” ํ…Œ์ด๋ธ”์ด ์ด๋ ‡๊ฒŒ ์˜ˆ์˜๊ฒŒ ์žˆ๋‹ค๋ฉด LEFT JOIN์œผ๋กœ ๋ฌถ๊ณ  BETWEEN๋งŒ ๊ฑธ์–ด ์ค˜๋„ ์ „์ฒด ๋“ฑ๊ธ‰์„ ๋ฝ‘์„ ์ˆ˜ ์žˆ๋‹ค. L..
list_img
SQL ๋ฌธ์ œํ’€์ด: ๊ฐ€๊ฒฉ๋Œ€๋ณ„ ๊ทธ๋ฃน ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ธฐ, FLOOR/ TRUNCATE
2024.02.17
์–ด๋–ค ์˜จ๋ผ์ธ ์‡ผํ•‘๋ชฐ์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž. ์ด ์‡ผํ•‘๋ชฐ์€ ๋งŒ ์› ๋Œ€๋ถ€ํ„ฐ ํŒ”๋งŒ ์› ๋Œ€๊นŒ์ง€ ๋‹ค์–‘ํ•œ ๊ฐ€๊ฒฉ๋Œ€์˜ ์ƒํ’ˆ์„ ์ทจ๊ธ‰ํ•˜๊ณ  ์žˆ๋‹ค. ์–ด๋А ๋‚  ํ”„๋กœ๋•ํŠธ ํŒ€์—์„œ ๋ฐ์ดํ„ฐ ์ถ”์ถœ ์š”์ฒญ์ด ๋“ค์–ด์™”๋‹ค. ์ œํ’ˆ์„ ๊ฐ€๊ฒฉ๋Œ€๋ณ„๋กœ ํ”„๋กœ๋ชจ์…˜ ์ง„ํ–‰ํ•˜๋ ค ํ•˜๋‹ˆ ๋งŒ ์› ๋‹จ์œ„๋กœ ๊ทธ๋ฃน์„ ๋‚˜๋ˆ  ๋‹ฌ๋ผ๊ณ . ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ๋Š” ์ฟผ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ์งœ์•ผ ํ• ๊นŒ? ์ œํ’ˆ ์ •๋ณด๊ฐ€ ๋“ค์–ด ์žˆ๋Š” product ํ…Œ์ด๋ธ”์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. Column name Type Nullable product_id INTEGER FALSE product_code VARCHAR(8) FALSE price INTEGER FALSE product_id product_code price 1 A1000011 10000 2 A1000045 9000 3 C3000002 22000 4 C3000006 15000 5 ..
list_img
SQL: ์™œ NULL์€ =์ด ์•„๋‹ˆ๋ผ is๋ฅผ ์“ธ๊นŒ 1
2024.02.11
์™œ NULL์€ =์ด ์•„๋‹ˆ๋ผ is๋ฅผ ์“ธ๊นŒ SQL ๋ฌธ๋ฒ•์„ ์ฒ˜์Œ ๋ฐฐ์šธ ๋•Œ, ๊ผญ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ด ์žˆ๋‹ค. 'NULL์„ ์ฐพ์„ ๋•Œ๋Š” = NULL์ด ์•„๋‹ˆ๋ผ IS NULL์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค'. ์˜์•„ํ•˜๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ๋Š” (๋…ผ๋ฆฌ ์—ฐ์‚ฐ์—์„œ) NULL์„ 0๊ณผ ๊ฐ™์ด ์ทจ๊ธ‰ํ•˜์ง€ ์•Š๋Š”๊ฐ€. SQL์—๋Š” ์–ด๋–ค ์ฐจ์ด์ ์ด ์žˆ๊ธธ๋ž˜ ์ด์ฒ˜๋Ÿผ ํŠน๋ณ„ํ•˜๊ฒŒ NULL์„ ๋‹ค๋ฃฐ๊นŒ. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—๋Š” SQL์‹ NULL์˜ ์ •์˜์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋ฉด์„œ ์œ„ ์˜๋ฌธ์— ๋Œ€ํ•ด ํŒŒํ—ค์ณ ๋ณธ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ '์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฐ’' ๊ทธ๋ž˜์„œ '์•„์ง ๋ชจ๋ฅด๋Š” ๊ฐ’' SQL์—์„œ์˜ NULL์€ ์œ„ํ‚ค๋ฐฑ๊ณผ ๊ธฐ์ค€์œผ๋กœ ์ด๋ ‡๊ฒŒ ์ •์˜๋œ๋‹ค. 'Null ๋˜๋Š” NULL์€ ๊ตฌ์กฐ์  ์งˆ์˜์–ธ์–ด(SQL)์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด์˜ ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์ง€์‹œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํŠน๋ณ„ํ•œ ํ‘œ์‹œ์–ด(Special marker)'...
list_img
SQL: ์กฐ๊ฑด ์ ์šฉํ•ด ์œ ์˜๋ฏธํ•œ ๊ธฐ์ค€์  ๋ฝ‘๊ธฐ, CASE WHEN 2
2024.02.08
CASE WHEN(CASE ๋ฌธ์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค.)์€ SQL์˜ ์กฐ๊ฑด๋ฌธ์ด๋‹ค. ๊ธฐ์ค€ ์ปฌ๋Ÿผ A๊ฐ€ B๋ผ๋Š” ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด C๋ผ๋Š” ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ํ˜•ํƒœ๋กœ 'CASE WHEN A = B THEN C'์™€ ๊ฐ™์ด ํ‘œํ˜„๋œ๋‹ค. "์กฐ๊ฑด์— ๋งž๋Š” ๋‹ต์„ ์ถœ๋ ฅ"ํ•˜๋Š” ์‹์ด์–ด์„œ ์ฃผ๋กœ SELECT ์ ˆ์ด๋‚˜ ์ง‘๊ณ„ํ•จ์ˆ˜์—์„œ ์“ฐ์ธ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ๋ฐ˜์œผ๋กœ ์•„์ง ์ง‘๊ณ„๋˜์ง€ ์•Š์€ ์œ ์˜๋ฏธํ•œ ์ง€ํ‘œ๋ฅผ ์ฐพ์•„ ๋ฐ˜ํ™˜ํ•ด ๋ณด๊ณ  ์ด๋ฅผ ํ†ตํ•ด CASE WHEN์˜ SELECT์ ˆ ์šฉ๋ก€๋ฅผ ์‚ดํŽด๋ณด๋ ค ํ•œ๋‹ค. ์‚ฌ์šฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•„๋ž˜๋กœ ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์žˆ๋‹ค. (mySQL์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ์ƒ˜ํ”Œ์ด๋‹ค.) ์šฐ๋ฆฌ๋Š” ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”๋“ค์„ ์‚ดํŽด๋ณด๊ณ  CASE WHEN์„ ํ†ตํ•ด ํšŒ์‚ฌ ์šด์˜ ์ „๋ฐ˜์— ์œ ์˜๋ฏธํ•œ ์ •๋ณด๋ฅผ ๋งŒ๋“ค์–ด ๋ณผ ๊ฒƒ์ด๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” ์—ฌ๋Ÿ ๊ฐœ์˜ ํ…Œ์ด๋ธ”์ด..
list_img
SQL: ์ค‘๋ณต ๊ฐ’๋งŒ ๋ฆฌ์ŠคํŒ…ํ•˜๋Š” ๋ฐฉ๋ฒ•, HAVING COUNT()
2024.02.06
๋ถ„์„ ํˆด์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฝ‘๋‹ค ๋ณด๋ฉด ๊ฐ€๋” ๋‹นํ™ฉ์Šค๋Ÿฌ์šธ ๋•Œ๊ฐ€ ์žˆ๋‹ค. ๊ณ ์œ  ๋ฒˆํ˜ธ๊นŒ์ง€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ๋‚˜์˜ค๋Š” ๊ฑฐ๋‹ค. ์ด์œ ๊ฐ€ ์–ด๋–ป๋“ (์šฐ๋ฆฌ๊ฐ€ ๋ณ€๋ณ„๋ ฅ ์—†๋Š” ์กฐ๊ฑด์„ ์„ค์ •ํ–ˆ๋“ , ๋ง ๊ทธ๋Œ€๋กœ ์ปดํ“จํ„ฐ๊ฐ€ ์‹ค์ˆ˜๋ฅผ ํ–ˆ๋“ ) ๊ฐ„์— ์ด ๊ฐ’๋“ค์€ ๊ฑธ๋Ÿฌ์ ธ์•ผ ํ•˜๊ณ  ๋ฐ˜๋Œ€๋กœ ์ˆ˜์ง‘ ํ”„๋กœ์„ธ์Šค ์ž์ฒด์˜ ๋ณด์ˆ˜๋ฅผ ์œ„ํ•ด ์ง‘๊ณ„๋˜๊ธฐ๋„ ํ•ด์•ผ ํ•œ๋‹ค. ์•„๋ž˜ order_list๋Š” ๊ฐ€์ƒ์˜ ๋ธŒ๋žœ๋“œ์˜ ์ฃผ๋ฌธ ์ •๋ณด ์ˆ˜์ง‘ ๋‚ด์—ญ์ด๋‹ค. ์ด ์ค‘ ์ฃผ๋ฌธ๋ฒˆํ˜ธ 10251์€ ๋‘ ๋ฒˆ ๋‚˜์˜ค๋Š”๋ฐ ๋ณด๋‹ค์‹œํ”ผ ๊ณ ๊ฐID๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ์ •๋ณด๊ฐ’์ด ๋™์ผํ•˜๋‹ค. ๊ธฐ์žฌํ•˜์ง„ ์•Š์•˜์ง€๋งŒ ์ˆ˜์ง‘๋œ ์‹œ๊ฐ„๊นŒ์ง€. ์˜ค๋Š˜์€ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ค‘๋ณต ๊ฐ’ ์ œ๊ฑฐ/ ์ง‘๊ณ„ ๊ด€๋ จํ•œ ์ฟผ๋ฆฌ ์ž‘์—…์„ ์ง„ํ–‰ํ•ด๋ณด๊ฒ ๋‹ค. order_list ์ฃผ๋ฌธ๋ฒˆํ˜ธ ๊ณ ๊ฐID ์ฃผ๋ฌธ์ผ์ž ๋ฐฐ์†กID 10248 90 2024-01-03 3 10249 81 2024-01-..

 

 

 

02์›” 26์ผ์ž๋กœ ๋น…์ฟผ๋ฆฌ์— GROUP BY ALL ๋ฌธ๋ฒ•์ด ์ถ”๊ฐ€๋๋‹ค. ๊ธฐ์กด์—๋Š” ์ฟผ๋ฆฌ๋ฅผ ๋ฌถ๊ณ  ์‹ถ์œผ๋ฉด GROUP BY์— ์ปฌ๋Ÿผ์„ ์ง€์ •ํ•ด์ค˜์•ผ ํ–ˆ๋Š”๋ฐ, GROUP BY ALL ๋ฌธ๋ฒ•์˜ ์ถ”๊ฐ€๋กœ ์ด์ œ ๋น…์ฟผ๋ฆฌ๊ฐ€ SELECT ์ ˆ์—์„œ ๊ทธ๋ฃนํ™”ํ•  ํ‚ค๋ฅผ ์•Œ์•„์„œ ๋ฌถ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋๋‹ค.

 

 

๋ฌถ๋Š” ์กฐ๊ฑด์€ ๋‹จ์ˆœํ•œ๋ฐ, ์ง‘๊ณ„ ํ•จ์ˆ˜๋‚˜ ์œˆ๋„์šฐ ํ•จ์ˆ˜ ์™ธ ๋ช‡ ๊ฐ€์ง€ ๊ณต์‹ ๋ฌธ์„œ์—์„œ ์ง€์ •ํ•œ ๋ถˆ๊ฐ€ ํ˜•ํƒœ ์ œ์™ธํ•˜๊ณ  ๋‚˜๋จธ์ง€ ์ปฌ๋Ÿผ์€ ๋‹ค ๊ทธGROUP BY์— ํฌํ•จ์‹œํ‚ค๋Š” ์‹์ด๋‹ค. ์ด ๋•Œ ์ƒ๊ธฐ ์กฐ๊ฑด๋“ค์„ ์ œ์™ธํ•˜๊ณ  ๋‚œ ํ›„, ๋‚จ์€ SELECT ํ•ญ๋ชฉ ์ค‘ ๊ทธ๋ฃนํ™” ๋ถˆ๊ฐ€ํ•œ ์œ ํ˜•์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. 

 

 

๋‹ค์Œ ์˜ˆ์ œ์—์„œ ์ฟผ๋ฆฌ๋Š” first_name๊ณผ last_name ๊ธฐ์ค€์œผ๋กœ ๊ทธ๋ฃนํ™”๋œ๋‹ค. total_points๋Š” ์ง‘๊ณ„ ํ•จ์ˆ˜ ๊ฐ’์ด๋ฏ€๋กœ ์ œ์™ธ๋๋‹ค.

 

WITH PlayerStats AS (
  SELECT 'Adams' as LastName, 'Noam' as FirstName, 3 as PointsScored UNION ALL
  SELECT 'Buchanan', 'Jie', 0 UNION ALL
  SELECT 'Coolidge', 'Kiran', 1 UNION ALL
  SELECT 'Adams', 'Noam', 4 UNION ALL
  SELECT 'Buchanan', 'Jie', 13)
  
SELECT SUM(PointsScored) AS total_points
  		, FirstName AS first_name
  		, LastName AS last_name
FROM PlayerStats
GROUP BY ALL;

 

/*--------------+------------+-----------+
 | total_points | first_name | last_name |
 +--------------+------------+-----------+
 | 7            | Noam       | Adams     |
 | 13           | Jie        | Buchanan  |
 | 1            | Kiran      | Coolidge  |
 +--------------+------------+-----------*/

 

 

๋‹ค์Œ ์˜ˆ์ œ ์—ญ์‹œ ์ฟผ๋ฆฌ๋Š” first_name๊ณผ last_name ๊ธฐ์ค€์œผ๋กœ ๊ทธ๋ฃนํ™”๋œ๋‹ค. total_points๋Š” ์œˆ๋„์šฐ ํ•จ์ˆ˜ ๊ฐ’์ด๋ฏ€๋กœ ์ œ์™ธ๋๋‹ค.

 

WITH PlayerStats AS (
  SELECT 'Adams' as LastName, 'Noam' as FirstName, 3 as PointsScored UNION ALL
  SELECT 'Buchanan', 'Jie', 0 UNION ALL
  SELECT 'Coolidge', 'Kiran', 1 UNION ALL
  SELECT 'Adams', 'Noam', 4 UNION ALL
  SELECT 'Buchanan', 'Jie', 13)
  
SELECT COUNT(*) OVER () AS total_people
  		, FirstName AS first_name
  		, LastName AS last_name
FROM PlayerStats
GROUP BY ALL;

 

/*--------------+------------+-----------+
 | total_people | first_name | last_name |
 +--------------+------------+-----------+
 | 3            | Noam       | Adams     |
 | 3            | Jie        | Buchanan  |
 | 3            | Kiran      | Coolidge  |
 +--------------+------------+-----------*/

 

 

์—ฌ๋Ÿฌ SELECT ํ•ญ๋ชฉ์ด FROM ์ ˆ์˜ ๋™์ผํ•œ ๋ถ€๋ถ„์„ ์ฐธ๊ณ ํ•œ๋‹ค๋ฉด ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์žฅ ์ง์ ‘์ ์œผ๋กœ ์ง€์ •ํ•œ ํ•˜๋‚˜๋งŒ GROUP BY์˜ ๋Œ€์ƒ์ด ๋œ๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ์—์„œ coordinates์˜ ๋‘ ๊ตฌ์„ฑ ์š”์†Œ์ธ Values.x์™€ Values.y๊ฐ€ ์ด๋ฏธ ์ง์ ‘ ๊ฒฝ๋กœ๋กœ ์ง€์ •๋ผ ์žˆ๋Š” ์ƒํƒœ์ด๋ฏ€๋กœ coordinates ์ปฌ๋Ÿผ์€ GROUP BY์—์„œ ์ œ์™ธ๋๋‹ค.

 

WITH Values AS (
  SELECT 1 AS x, 2 AS y
  UNION ALL SELECT 1 AS x, 4 AS y
  UNION ALL SELECT 2 AS x, 5 AS y
)

SELECT Values.x AS x_coordinate
  	, Values.y AS y_coordinate
  	, [Values.x, Values.y] AS coordinates
FROM Values
GROUP BY ALL

 

/*--------------+--------------+-------------+
 | x_coordinate | y_coordinate | coordinates |
 +--------------+--------------+-------------+
 | 1            | 4            | [1, 4]      |
 | 1            | 2            | [1, 2]      |
 | 2            | 5            | [2, 5]      |
 +--------------+--------------+-------------*/

 

 

 

 

 

๋”๋ณด๊ธฐ
TOOLS/SQL

 

 

 

์„œ๋ธŒ ์ฟผ๋ฆฌSubquery๋ž€ ๋ฉ”์ธ ์ฟผ๋ฆฌMain query๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€๋กœ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ถ€๊ฐ€์ ์ธ SELECT๋ฌธ์„ ๋งํ•œ๋‹ค. ์–ด๋–ค ๋ฉ”์ธ ์ฟผ๋ฆฌ์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋Š” ์˜๋ฏธ์—์„œ ๋‚ด๋ถ€ ์ฟผ๋ฆฌInner query๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•œ๋‹ค. ์ด๋•Œ, ๋ฉ”์ธ ์ฟผ๋ฆฌ๋Š” ์™ธ๋ถ€ ์ฟผ๋ฆฌOuter query๋กœ ์ง€์นญ๋  ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

 

์„œ๋ธŒ ์ฟผ๋ฆฌ์˜ ํ˜•ํƒœ / ์‹คํ–‰ ์กฐ๊ฑด

 

SELECT ์—ด
FROM ํ…Œ์ด๋ธ”
WHERE ์กฐ๊ฑด์‹ ( SELECT ์—ด
                             FROM ํ…Œ์ด๋ธ”
                             WHERE ์กฐ๊ฑด์‹ )

 

(1) ๋ฐ˜๋“œ์‹œ ๊ด„ํ˜ธ์— ๊ฐ์‹ธ์ง„ ํ˜•ํƒœ๋กœ ์“ฐ์ธ๋‹ค.

(2) SELECT๋ฌธ์˜ ํ˜•ํƒœ๋กœ๋งŒ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

(3) ์ฟผ๋ฆฌ์˜ ๋์—์„œ ;์„ธ๋ฏธ ์ฝœ๋ก ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

(4) ORDER BY์ ˆ์„ ์‚ฝ์ž…ํ•  ์ˆ˜ ์—†๋‹ค.

 

 

 

 

 

์„œ๋ธŒ ์ฟผ๋ฆฌ์˜ ํŠน์ง•

 

 

(1) ๋น„๊ต ํ˜น์€ ์กฐํšŒ์˜ ๋Œ€์ƒ์ด ๋  ๋•Œ ์กฐํšŒ ๋Œ€์ƒ์˜ ์˜ค๋ฅธ์ชฝ์— ๋†“์ธ๋‹ค.

(2) ๋ฉ”์ธ ์ฟผ๋ฆฌ์™€์˜ ๋น„๊ต๋ฅผ ์œ„ํ•ด ์กด์žฌํ•˜๋Š” ์ฟผ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ธŒ ์ฟผ๋ฆฌ์˜ SELECT ์ ˆ์€ ๋ฉ”์ธ ์ฟผ๋ฆฌ์˜ ๋น„๊ต ๋Œ€์ƒ๊ณผ ๊ฐ™์€ ์ž๋ฃŒํ˜•๊ณผ ๊ฐ™์€ ๊ฐœ์ˆ˜๋กœ ์ง€์ •๋ผ์•ผ ํ•œ๋‹ค.

(3) ๊ฒฐ๊ณผ๊ฐ’ ์—ญ์‹œ ๋ฉ”์ธ ์ฟผ๋ฆฌ์˜ ์—ฐ์‚ฐ์ž ์ข…๋ฅ˜์™€ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค.

(4) ๋ฉ”์ธ ์ฟผ๋ฆฌ์™€์˜ ๊ด€๊ณ„๋Š” ๋‹จ๋ฐฉํ–ฅ์ด๋‹ค. ์ด๋Š” Java ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์ƒ์†๊ณผ๋„ ์œ ์‚ฌํ•œ ํ˜•ํƒœ์ธ๋ฐ, ์ƒ์†๋‹นํ•œ ์ž์‹ ๊ฐ์ฒด๋Š” ๋ถ€๋ชจ ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ถ€๋ชจ๋Š” ์ž์‹ ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.

 

(5) ๊ตฌ์กฐํ™”๋ฅผ ํ†ตํ•ด ์ฟผ๋ฆฌ์˜ ๊ฐ ๋ถ€๋ถ„์„ ๊ฐ€๋…์„ฑ ์žˆ๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค€๋‹ค.

(6) ์œ„์˜ ํŠน์ง• ๋•Œ๋ฌธ์—, ๋ณต์žกํ•œ JOIN๊ณผ UNION์„ ๋ช…๋ฃŒํ•˜๊ฒŒ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€์ฒด์žฌ๋กœ ๊ธฐ๋Šฅํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

 

์„œ๋ธŒ ์ฟผ๋ฆฌ์˜ ์‚ฌ์šฉ์ฒ˜

 

(1) SELECT ์ ˆ์—์„œ ์‚ฌ์šฉ / ์Šค์นผ๋ผ ์„œ๋ธŒ ์ฟผ๋ฆฌScalar Subquery

(2) FROM ์ ˆ์—์„œ ์‚ฌ์šฉ / ์ธ๋ผ์ธ ๋ทฐInline View

(3) WHERE ์ ˆ์—์„œ ์‚ฌ์šฉ / ์ค‘์ฒฉ ์„œ๋ธŒ ์ฟผ๋ฆฌNested Subquery

(4) HAVING ์ ˆ์—์„œ ์‚ฌ์šฉ

(5) ORDER BY ์ ˆ์—์„œ ์‚ฌ์šฉ

(6) INSERT๋ฌธ์˜ VALUES ๊ฐ’ ๋Œ€์ฒด์žฌ๋กœ์จ ์‚ฌ์šฉ

(7) UPDATE๋ฌธ์˜ SET ๊ฐ’ ๋Œ€์ฒด์žฌ๋กœ์จ ์‚ฌ์šฉ

 

 

 

 

 

์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ์‚ฌ์šฉ

 

์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” ์„œ๋ธŒ ์ฟผ๋ฆฌ์˜ ์‚ฌ์šฉ์ฒ˜ ์ค‘ SELECT, FROM, WHERE์ ˆ์—์„œ ์“ฐ์ด๋Š” ๊ฒฝ์šฐ, ์ฆ‰ ์Šค์นผ๋ผ ์„œ๋ธŒ ์ฟผ๋ฆฌ, ์ธ๋ผ์ธ ๋ทฐ, ์ค‘์ฒฉ ์„œ๋ธŒ ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด ์•Œ์•„๋ณธ๋‹ค.

 

 

 

SELECT์ ˆ, ์Šค์นผ๋ผ ์„œ๋ธŒ ์ฟผ๋ฆฌScalar Subquery

 

ใ…ก์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ(Scalar Subquery)
  ์ •๋Œ€๋ฆฌ ๊ธ‰์—ฌ์™€ ํ…Œ์ด๋ธ” ์ „์ฒด ํ‰๊ท  ๊ธ‰์—ฌ๋ฅผ ๊ตฌํ•˜์‹œ์˜ค.

SELECT name
	, salary
   	, (SELECT ROUND(AVG(salary), -1) FROM employee) AS ํ‰๊ท ๊ธ‰์—ฌ
FROM employee
WHERE name = '์ •๋Œ€๋ฆฌ';

 

์Šค์นผ๋ผ ์„œ๋ธŒ ์ฟผ๋ฆฌ๋Š” SELECT์ ˆ์—์„œ ๋‚˜ํƒ€๋‚˜๋Š” ์„œ๋ธŒ ์ฟผ๋ฆฌ๋‹ค. ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์—์„œ ์–ด๋– ํ•œ ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ์ฃผ๋กœ ์“ฐ์ด๋ฉฐ, '์Šค์นผ๋ผ'๋ผ๋Š” ์ด๋ฆ„์—์„œ ๋ณด์—ฌ์ง€๋“ฏ ๋‹จ์ผ ๊ฐ’๋งŒ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ํ•ด๋‹น ์„œ๋ธŒ ์ฟผ๋ฆฌ๋Š” ์ผ์น˜ํ•˜๋Š” ๊ฐ’์ด ์—†๋‹ค๋ฉด NULL์„ ๋ฆฌํ„ดํ•œ๋‹ค(ํ•ด๋‹น ๋ถ€๋ถ„์€ ๊ทธ๋ฃน ํ•จ์ˆ˜์˜ ํŠน์ง•์ด๊ธฐ๋„ ํ•˜๋‹ค.).

 

 

 

FROM์ ˆ, ์ธ๋ผ์ธ ๋ทฐInline View

 

ใ…ก์ธ๋ผ์ธ ๋ทฐ(Inline View)
  ์ง๊ธ‰์ด ์‚ฌ์›์ธ ์‚ฌ๋žŒ๋“ค์˜ ์ด๋ฆ„๊ณผ ๊ธ‰์—ฌ๋ฅผ ๊ตฌํ•˜์‹œ์˜ค.

SELECT ex1.name
	, ex1.salary
FROM (SELECT * FROM employee li
WHERE li.office_worker= '์‚ฌ์›') ex1;

 

์ธ๋ผ์ธ ๋ทฐ๋Š” FROM ์ ˆ์—์„œ ๋‚˜ํƒ€๋‚˜๋Š” ์„œ๋ธŒ ์ฟผ๋ฆฌ๋‹ค. ํŠน์ • ํ…Œ์ด๋ธ”์—์„œ ์ „์ฒด ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋งŒ ์ถ”์ถœํ•ด ์—ฐ๊ฒฐํ•˜๊ณ ์ž ํ•  ๋•Œ ์“ด๋‹ค. ํƒ€ ์„œ๋ธŒ ์ฟผ๋ฆฌ์™€ ๋‹ฌ๋ฆฌ ๊ผญ ๋ณ„์นญalias์„ ์ง€์ •ํ•ด ์ค˜์•ผ์ง€๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฐธ๊ณ ๋กœ, WITH ๋ฌธ์„ ์‚ฌ์šฉํ•ด๋„ ๊ฒฐ๊ณผ๋ฌผ์€ ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†์— ๋งž๋Š” ๊ฒƒ์„ ์ทจ์‚ฌ์„ ํƒํ•ด ์“ฐ๋ฉด ๋œ๋‹ค.

 

WITH
[๋ณ„์นญ1] AS (SELECT๋ฌธ 1),
[๋ณ„์นญ2] AS (SELECT๋ฌธ 2),
...,
[๋ณ„์นญN] AS (SELECT๋ฌธ N)
SELECT 
FROM ๋ณ„์นญ1, ๋ณ„์นญ2, ..., ๋ณ„์นญN

 

 

 

WHERE์ ˆ, ์ค‘์ฒฉ ์„œ๋ธŒ ์ฟผ๋ฆฌNested Subquery

 

ใ…กNested Subquery - ๋‹จ์ผ ํ–‰ 
  ์ •๋Œ€๋ฆฌ๋ผ๋Š” ์‚ฌ๋žŒ์˜ ์ง๊ธ‰์„ ๊ตฌํ•˜์‹œ์˜ค.

SELECT office_worker
FROM employee
WHERE office_worker = (SELECT office_worker FROM employee WHERE name = '์ •๋Œ€๋ฆฌ')

 

ใ…กNested Subquery - ๋ณต์ˆ˜(๋‹ค์ค‘) ํ–‰ 
  ์ •๋Œ€๋ฆฌ๋ณด๋‹ค ๊ธ‰์—ฌ๊ฐ€ ๋†’์€ ์‚ฌ๋žŒ๋“ค์„ ๊ตฌํ•˜์‹œ์˜ค.

SELECT *
FROM employee
WHERE salary > (SELECT salary FROM employee WHERE name = '์ •๋Œ€๋ฆฌ')

  ์ง๊ธ‰์ด ์‚ฌ์›์ธ ์‚ฌ๋žŒ๋“ค์„ ๊ตฌํ•˜์‹œ์˜ค.

SELECT *
FROM employee
WHERE office_worker IN (SELECT office_worker FROM employee WHERE office_worker = '์‚ฌ์›')

 

WHERE์ ˆ์—์„œ ๋‚˜ํƒ€๋‚˜๋Š” ์„œ๋ธŒ ์ฟผ๋ฆฌ๋Š” ์ค‘์ฒฉ ์„œ๋ธŒ ์ฟผ๋ฆฌ๋ผ ๋ถ€๋ฅธ๋‹ค. ์‹คํ–‰ ๊ฒฐ๊ณผ์˜ ํ–‰ ์ˆ˜, ์—ด ์ˆ˜์— ๋”ฐ๋ผ ๋‹จ์ผ ํ–‰ ์„œ๋ธŒ ์ฟผ๋ฆฌ, ๋‹ค์ค‘ ํ–‰ ์„œ๋ธŒ ์ฟผ๋ฆฌ, ๋‹ค์ค‘ ์—ด ์„œ๋ธŒ ์ฟผ๋ฆฌ๋กœ ๋‚˜๋ˆ„๋ฉฐ ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” ์‹ค๋ฌด์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋‹จ์ผ ํ–‰/ ๋‹ค์ค‘ ํ–‰ ์„œ๋ธŒ ์ฟผ๋ฆฌ๋งŒ ๋‹ค๋ฃฌ๋‹ค. 

 

๋‹จ์ผ ํ–‰ ์„œ๋ธŒ ์ฟผ๋ฆฌ๋Š” >, >=, =, <=, <, <>, ^=, != ๋“ฑ์˜ ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์“ฐ์ด๋ฉฐ, ๋‹ค์ค‘ ํ–‰ ์„œ๋ธŒ ์ฟผ๋ฆฌ๋Š” IN, ANY, SOME, ALL, EXISTS ๋“ฑ์˜ ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์“ฐ์ธ๋‹ค. ์ถœ๋ ฅํ•˜๋Š” ํ–‰ ์ˆ˜์™€ ์—ฐ๊ฒฐ์ง€์–ด์„œ, ์ „์ž๋ฅผ ๋‹จ์ผ ํ–‰ ์—ฐ์‚ฐ์ž, ํ›„์ž๋ฅผ ๋‹ค์ค‘ ํ–‰ ์—ฐ์‚ฐ์ž๋ผ ๋ถ€๋ฅด๊ธฐ๋„ ํ•œ๋‹ค. 

 

IN : ํ•˜๋‚˜๋ผ๋„ ์ผ์น˜ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด TRUE
ANY, SOME : ๋งŒ์กฑํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ์ด๋ฉด TRUE
ALL : ๊ฒฐ๊ณผ๊ฐ€ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋ฉด TRUE
EXISTS : ๊ฒฐ๊ณผ๊ฐ€ ์กด์žฌํ•˜๋ฉด TRUE (ํ–‰์ด 1๊ฐœ ์ด์ƒ์ด๋ฉด TRUE)

 <IN> ๋ถ€์„œ๋ณ„ ์ตœ๊ณ  ๊ธ‰์—ฌ์™€ ๋™์ผํ•œ ๊ธ‰์—ฌ๋ฅผ ๋ฐ›๋Š” ์‚ฌ์› ์ •๋ณด

SELECT *
FROM emp
WHERE sal IN (SELECT MAX(sal) FROM emp GROUP BY deptno);

 

 <SOME> ๋“ฑ๊ฐ€ ๋น„๊ต ์—ฐ์‚ฐ์ž(=)์™€ ANY, SOME์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด IN ์—ฐ์‚ฐ์ž์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ ์ˆ˜ํ–‰

SELECT *
FROM emp
WHERE sal = SOME (SELECT MAX(sal) FROM emp GROUP BY deptno);

 

 <ANY> ๋“ฑ๊ฐ€ ๋น„๊ต ์—ฐ์‚ฐ์ž๊ฐ€ ์•„๋‹Œ ๋Œ€์†Œ ๋น„๊ต ์—ฐ์‚ฐ์ž์™€ ANY๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด?
 < ANY : ๋ถ€์„œ 30 ์ค‘ ์ตœ๋Œ€๊ฐ’๋ณด๋‹ค ์ ์€ ๊ธ‰์—ฌ๋ฅผ ๊ฐ€์ง„ ์‚ฌ์›์„ ์ฐพ๊ฒŒ ๋จ
 > ANY : ๋ถ€์„œ 30 ์ค‘ ์ตœ์†Œ๊ฐ’๋ณด๋‹ค ๋†’์€ ๊ธ‰์—ฌ๋ฅผ ๊ฐ€์ง„ ์‚ฌ์›์„ ์ฐพ๊ฒŒ ๋จ

SELECT *
FROM emp
WHERE sal < ANY (SELECT sal FROM emp WHERE deptno = 30);

 

 <ALL> ๋ถ€์„œ 30 ์ค‘ ์ตœ๋Œ€ ๊ธ‰์—ฌ๋ณด๋‹ค ๋” ๋งŽ์€ ๊ธ‰์—ฌ๋ฅผ ๋ฐ›๋Š” ์‚ฌ์› ์ถœ๋ ฅ

SELECT *
FROM emp
WHERE sal > ALL (SELECT sal FROM emp WHERE deptno = 30);

 

 <EXISTS> ๋ถ€์„œ50์ด ์žˆ์œผ๋ฉด EMP ์ „์ฒด ์ถœ๋ ฅ

SELECT *
FROM emp
WHERE EXISTS (SELECT dname FROM dept WHERE deptno = 50);

 

 

 

 

 

 

์ถœ์ฒ˜

์–‘๋””๋กœ๊ทธ ๋ธ”๋กœ๊ทธ

Inpa Dev ๋ธ”๋กœ๊ทธ

java์˜ ๊ฐœ๋ฐœ์ผ๊ธฐ ๋ธ”๋กœ๊ทธ

 
๋”๋ณด๊ธฐ
TOOLS/SQL

 

<๋ฐ์ดํ„ฐ ์ฒดํฌ>

<

๋ฌธ์ œ ์ถœ์ฒ˜: ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค, ์ด๋ฆ„์— el์ด ๋“ค์–ด๊ฐ€๋Š” ๋™๋ฌผ ์ฐพ๊ธฐ

ํ…Œ์ด๋ธ”๋ช…: animal_ins๋™๋ฌผ ๋ณดํ˜ธ์†Œ์— ๋“ค์–ด์˜จ ๋™๋ฌผ์˜ ์ •๋ณด๋ฅผ ๋‹ด์€ ํ…Œ์ด๋ธ”

์ปฌ๋Ÿผ๋ช…: animal_id๋™๋ฌผ ์•„์ด๋””, animal_type๋™๋ฌผ ์ข…, datetime๋ณดํ˜ธ์‹œ์ž‘์ผ, intake_condition๋ณดํ˜ธ ์‹œ์ž‘ ์‹œ ์ƒํƒœ, name์ด๋ฆ„, sex_upon_intake์„ฑ๋ณ„ ๋ฐ ์ค‘์„ฑํ™” ์—ฌ๋ถ€

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์„ฑ: 1๊ฐœ ํ…Œ์ด๋ธ”, 6๊ฐœ ์ปฌ๋Ÿผ, 100๊ฐœ ๋กœ์šฐ

>

 

 

 

 

<์‹œ๋‚˜๋ฆฌ์˜ค>

 

๋ณดํ˜ธ์†Œ์— ๋Œ์•„๊ฐ€์‹  ํ• ๋จธ๋‹ˆ๊ฐ€ ๊ธฐ๋ฅด๋˜ ๊ฐœ๋ฅผ ์ฐพ๋Š” ์‚ฌ๋žŒ์ด ์ฐพ์•„์™”๋‹ค. ์ด ์‚ฌ๋žŒ์ด ๋งํ•˜๊ธธ ํ• ๋จธ๋‹ˆ๊ฐ€ ๊ธฐ๋ฅด๋˜ ๊ฐœ๋Š” ์ด๋ฆ„์— 'el'์ด ๋“ค์–ด๊ฐ„๋‹ค๊ณ . ๋™๋ฌผ ๋ณดํ˜ธ์†Œ์— ๋“ค์–ด์˜จ ๋™๋ฌผ ์ค‘ ์ด๋ฆ„์ด 'el'์ด ๋“ค์–ด๊ฐ€๋Š” ๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฝ‘์œผ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ• ๊นŒ.

 

 

 

 

 

<ํ’€์ด> 

 

๋ฌธ์ œ๋Š”, ๊ฐœ์˜ ์ด๋ฆ„์„ ํŠน์ •ํ•  ์ˆ˜ ์—†์œผ๋‹ˆ ๋Œ€์†Œ๋ฌธ์ž ์—ญ์‹œ ํ™•๋‹ตํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฑฐ๋‹ค. ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ WHERE์ ˆ์— ๋„ฃ์–ด ์ฃผ๋Š” ๋ฐฉํ–ฅ๋„ ์žˆ๊ฒ ์ง€๋งŒ, ๋ฌธ์ž์—ด์„ ์ „๋ถ€ ๋Œ€๋ฌธ์ž๋‚˜ ์†Œ๋ฌธ์ž๋กœ ๋ฐ”๊ฟ” ๋ฒ„๋ฆฌ๋Š” UPPER๋‚˜ LOWER๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฌผ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

WHERE name LIKE LOWER('%EL%')

 

 

 

๋‚˜๋จธ์ง€๋Š” ์‰ฝ๋‹ค. ์กฐ๊ฑด์„ ์ฑ„์›Œ์„œ ์ฟผ๋ฆฌ๋ฅผ ๋งˆ์ € ์งœ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค.

 

 

SELECT animal_id
        , name
FROM animal_ins
WHERE name LIKE LOWER('%EL%')
    AND animal_type = 'Dog'
ORDER BY name

 

 

๋”๋ณด๊ธฐ
TOOLS/SQL

 

 

<๋ฐ์ดํ„ฐ ์ฒดํฌ>

<

๋ฌธ์ œ ์ถœ์ฒ˜: ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค, ์ž๋™์ฐจ ํ‰๊ท  ๋Œ€์—ฌ ๊ธฐ๊ฐ„ ๊ตฌํ•˜๊ธฐ

ํ…Œ์ด๋ธ”๋ช…: car_rental_company_rental_history์–ด๋А ์ž๋™์ฐจ ๋Œ€์—ฌ์ ์˜ ๋Œ€์—ฌ ๊ธฐ๋ก ํ…Œ์ด๋ธ” ๊ฒฌ๋ณธ 

์ปฌ๋Ÿผ๋ช…: history_id๋Œ€์—ฌ ๊ธฐ๋ก ์•„์ด๋””, car_id์ž๋™์ฐจ ์•„์ด๋””, start_date๋Œ€์—ฌ์‹œ์ž‘์ผ, end_date๋Œ€์—ฌ์ข…๋ฃŒ์ผ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์„ฑ: 1๊ฐœ ํ…Œ์ด๋ธ”, 4๊ฐœ ์ปฌ๋Ÿผ, 160๊ฐœ ๋กœ์šฐ

>

>

 

 

 

 

<์‹œ๋‚˜๋ฆฌ์˜ค>

 

์—ฌ๊ธฐ ์–ด๋–ค ์ž๋™์ฐจ ๋Œ€์—ฌ์ ์ด ์žˆ๋‹ค. ์ด ์ž๋™์ฐจ ๋Œ€์—ฌ์ ์—์„œ๋Š” ๊ธฐ์กด ๊ณ ๊ฐ๋“ค์„ ํ™•์‹คํžˆ ์žก์•„๋‘๊ธฐ ์œ„ํ•ด ์ฃผ ๊ณ ๊ฐ์ธต์— ์ตœ๋Œ€ํ•œ์˜ ๊ฐ€๊ฒฉ ๋ฉ”๋ฆฌํŠธ๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๊ฒฉ ์ •์ฑ…์„ ๊ฐœํŽธํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์ด๋ฒˆ EDAํƒ์ƒ‰์  ๋ฐ์ดํ„ฐ ๋ถ„์„๋Š” ์ด๋ฅผ ์œ„ํ•œ ๊ณ ๊ฐ ์„ธ๋ถ„ํ™” ๊ณผ์ •์ด๋‹ค. ํ‰๊ท  ๋Œ€์—ฌ ๊ธฐ๊ฐ„์ด 7์ผ ์ด์ƒ์ธ ์ž๋™์ฐจ๋“ค์˜ ํ‰๊ท  ๋Œ€์—ฌ ๊ธฐ๊ฐ„(์ปฌ๋Ÿผ๋ช…: average_duration) ๋ฆฌ์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?

 

 

 

 

 

 

<ํ’€์ด>

 

๋จผ์ € ๋ฌธ์ œ๋ฅผ ํ•ด์†Œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ „์ฒด ๋ฆฌ์ŠคํŠธ์˜ ํ‰๊ท  ๋Œ€์—ฌ ๊ธฐ๊ฐ„์„ ๋ฆฌ์ŠคํŠธํ™”ํ•ด์•ผ ํ•œ๋‹ค. ํŒŒํŽธํ™”๋˜์–ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์–ด ์ฃผ๊ณ ,

 

 

GROUP BY car_id

 

 

์ด ๋ฐ์ดํ„ฐ์˜ ๊ธฐ์ค€์œผ๋กœ ํ‰๊ท  ๋Œ€์—ฌ ๊ธฐ๊ฐ„์„ ๋ฝ‘๋Š”๋‹ค. ๋Œ€์—ฌ ๊ธฐ๊ฐ„์€ ๋Œ€์—ฌ์ข…๋ฃŒ์ผ๊ณผ ๋Œ€์—ฌ์‹œ์ž‘์ผ์˜ ์ฐจ๋กœ ๊ณ„์‚ฐ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ๋•Œ ๋Œ€์—ฌ์‹œ์ž‘์ผ ์—ญ์‹œ ํ•˜๋ฃจ๋กœ ๊ณ„์‚ฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ผญ 1์„ ๋”ํ•ด ์ค˜์•ผ ํ•œ๋‹ค. ์ด ๊ฐ’์— ํ‰๊ท ์„ ์ ์šฉํ•ด ์ฃผ๊ณ  ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ์†Œ์ˆ˜์  ์ฒซ์งธ ์ž๋ฆฌ๊นŒ์ง€ ๋ฐ˜์˜ฌ๋ฆผํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์งค ์ˆ˜ ์žˆ๋‹ค.

 

 

SELECT car_id
	, ROUND(AVG(DATEDIFF(end_date, start_date) + 1), 1) average_duration

 

 

์ด ์ค‘์—์„œ ํ‰๊ท  ๋Œ€์—ฌ ๊ธฐ๊ฐ„์ด 7์ผ ์ด์ƒ์ธ ๊ฐ’์„ ๋ฝ‘์œผ๋ ค๋ฉด HAVING์— ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. WHERE๊ฐ€ ์•„๋‹Œ HAVING์— ๋„ฃ๋Š” ์ด์œ ๋Š” ๊ทธ๋ฃน์˜ ์ง‘๊ณ„๊ฐ’(AVG) ๊ธฐ์ค€์œผ๋กœ ์—ฐ์‚ฐํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

HAVING average_duration >= 7

 

 

๋งˆ๋ฌด๋ฆฌํ•˜๋ฉด, ์™„์„ฑ๋œ ์‹์€ ์•„๋ž˜์™€ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค.

 

 

SELECT car_id
        , ROUND(AVG(DATEDIFF(end_date, start_date) + 1), 1) average_duration
FROM car_rental_company_rental_history
GROUP BY car_id
HAVING average_duration >= 7
ORDER BY average_duration DESC, car_id DESC

 

 

 

 

 

 

๋”๋ณด๊ธฐ
TOOLS/SQL

 

 

 

 

<์„œ๋ก >

์‹ค๋ฌด์—์„œ๋Š” ์ข…์ข… ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐใ…ก๊ธฐ์ค€ํ‚ค๊ฐ€ ๊ณต๋ฐฑ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•œ, ๋‹ค์‹œ ๋งํ•ด ํ•ฉ์ง‘ํ•ฉใ…ก๋ฅผ ๋ถˆ๋Ÿฌ์™€์•ผ ํ•  ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธด๋‹ค. ํƒ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋Š” ์ด๋ฅผ FULL OUTER JOIN์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ง€์›ํ•˜์ง€๋งŒ, mysql์—์„œ๋Š” ์•„์‰ฝ๊ฒŒ๋„ ์ด๋ฅผ ๊ณต์‹์ ์œผ๋กœ ์ง€์›ํ•˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค. ๊ทธ๋Ÿฌ๋ฉด mysql์—์„œ๋Š” ํ•ฉ์ง‘ํ•ฉ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋ƒ๊ณ ? ๊ทธ๊ฑด ์•„๋‹ˆ๋‹ค. LEFT JOIN๊ณผ RIGHT JOIN์„ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ mysql์—์„œ๋„ ์ด๋ฅผ ๊ฐ„์ ‘์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์™ธ๊ตญ ๋ธ”๋กœ๊ทธ์— ํ•ด๋‹น ๋‚ด์šฉ์— ๋Œ€ํ•ด ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ํ‘œ์‹œํ•œ ํฌ์ŠคํŠธ๊ฐ€ ์žˆ์–ด ๋ฒˆ์—ญํ•ด ๊ฐ€์ ธ์™€ ๋ณธ๋‹ค.

 

 

FULL OUTER JOIN์˜ ํ˜•ํƒœ. ์ถœ์ฒ˜ //&nbsp;https://sql-joins.leopard.in.ua/

 

 

 

 

<๋ณธ๋ฌธ>

sales์™€ orders๋ผ๋Š” ๋‘ ํ…Œ์ด๋ธ”์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด์ž. sales์™€ orders์—๋Š” ๋™์ผํ•˜๊ฒŒ id์ฃผ๋ฌธ ์•„์ด๋””์™€ order_date(ํ˜•์‹์ด ์‚ด์ง ๋‹ค๋ฅธ)์ฃผ๋ฌธ ์ผ์ž, amount์ฃผ๋ฌธ ๊ธˆ์•ก ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด ์žˆ๋‹ค.

 

SELECT *
FROM sales;

 +------+---------------------+--------+
 | id   | order_date          | amount |
 +------+---------------------+--------+
 |    1 | 2021-02-02 08:15:00 |    250 |
 |    2 | 2021-02-02 08:30:00 |    200 |
 |    3 | 2021-02-02 08:55:00 |    150 |
 |    4 | 2021-02-02 09:15:00 |    125 |
 |    5 | 2021-02-02 09:30:00 |    250 |
 |    6 | 2021-02-02 09:45:00 |    200 |
 |    7 | 2021-02-02 10:15:00 |    180 |
 |    8 | 2021-02-02 10:30:00 |    125 |
 |    9 | 2021-02-02 10:45:00 |    200 |
 |   10 | 2021-02-02 11:15:00 |    250 |
 |   11 | 2021-02-02 11:30:00 |    150 |
 |   12 | 2021-02-02 11:45:00 |    200 |
 +------+---------------------+--------+


SELECT *
FROM orders;

 +------+------------+--------+
 | id   | order_date | amount |
 +------+------------+--------+
 |    5 | 2021-01-28 |    250 |
 |    6 | 2021-01-29 |    250 |
 |    7 | 2021-01-30 |    250 |
 |    8 | 2021-01-31 |    250 |
 |    9 | 2021-02-01 |    250 |
 +------+------------+--------+

 

 

๋งŒ์•ฝ ๋‹น์‹ ์ด ์ „์ฒด ๊ธฐ๊ฐ„ ๋™์•ˆ์˜ ๋งค์ถœ ํ•ฉ๊ณ„๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค๊ฑฐ๋‚˜ ํ•˜๋Š” ์ด์œ ๋กœ ๋‘ ํ…Œ์ด๋ธ”์„ ํ•ฉ์ณ์•ผ ํ•  ํ•„์š”์„ฑ์ด ์žˆ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด LEFT JOIN๊ณผ RIGHT JOIN์„ UNION ALL๋กœ ๊ฒฐํ•ฉํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์€ ์‹์œผ๋กœ.

mysql> SELECT * FROM sales
       LEFT JOIN orders ON sales.id = orders.id
       UNION ALL
       SELECT * FROM sales
       RIGHT JOIN orders ON sales.id = orders.id
       WHERE sales.id IS NULL ;
       
 +------+---------------------+--------+------+------------+--------+
 | id   | order_date          | amount | id   | order_date | amount |
 +------+---------------------+--------+------+------------+--------+
 |    5 | 2021-02-02 09:30:00 |    250 |    5 | 2021-01-28 |    250 |
 |    6 | 2021-02-02 09:45:00 |    200 |    6 | 2021-01-29 |    250 |
 |    7 | 2021-02-02 10:15:00 |    180 |    7 | 2021-01-30 |    250 |
 |    8 | 2021-02-02 10:30:00 |    125 |    8 | 2021-01-31 |    250 |
 |    9 | 2021-02-02 10:45:00 |    200 |    9 | 2021-02-01 |    250 |
 |    1 | 2021-02-02 08:15:00 |    250 | NULL | NULL       |   NULL |
 |    2 | 2021-02-02 08:30:00 |    200 | NULL | NULL       |   NULL |
 |    3 | 2021-02-02 08:55:00 |    150 | NULL | NULL       |   NULL |
 |    4 | 2021-02-02 09:15:00 |    125 | NULL | NULL       |   NULL |
 |   10 | 2021-02-02 11:15:00 |    250 | NULL | NULL       |   NULL |
 |   11 | 2021-02-02 11:30:00 |    150 | NULL | NULL       |   NULL |
 |   12 | 2021-02-02 11:45:00 |    200 | NULL | NULL       |   NULL |
 +------+---------------------+--------+------+------------+--------+

 

 

๋‹ค๋งŒ UNION ALL์˜ ๊ฒฝ์šฐ ํ•ฉ์ง‘ํ•ฉ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณต ํ–‰์ด ์„ž์—ฌ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿด ๊ฒฝ์šฐ์—๋Š” UNION์„ ์‚ฌ์šฉํ•ด ์ฃผ๋ฉด ๋˜๋Š”๋ฐ, UNION์˜ ๊ฒฝ์šฐ์—๋Š” t1๊ณผ t2 ์‚ฌ์ด์˜ ์ค‘๋ณต ๊ฐ’์„ ๊ฑธ๋Ÿฌ์„œ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ด์–ด์„œ ์œ ๋‹ˆํฌ ๊ฐ’์„ ๊ฑฐ๋ฅด๋Š” ์ธ๋ฑ์Šค๊ฐ€ ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€๋œ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ใ…ก์ค‘๋ณต์„ ๊ฑฐ๋ฅด์ง€ ์•Š๋Š” UNION ALL๊ณผ ๋Œ€๋น„ํ•ด์„œใ…ก ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ 1.5๋ฐฐ์—์„œ 4๋ฐฐ๊นŒ์ง€ ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ๋‚  ์ˆ˜๋„ ์žˆ๋‹ค๊ณ .

 

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ, ์›ฌ๋งŒํ•˜๋ฉด FULL OUTER JOIN์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” UNION ALL์„ ์“ฐ๋Š” ๊ฒŒ ํšจ์œจ์ ์ด๊ฒ ๋‹ค. (+ ์ตœ์†Œํ•œ์œผ๋กœ SELECTํ•ด์„œ.)๋ฌผ๋ก  ์• ์ดˆ์— ๋ชจ๋ธ๋ง ์ฐจ์›์—์„œ ๊ฒฐํ•ฉํ•  ์ผ์„ ๋ฐฐ์ œํ•˜๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ฒŒ ๊ฐ€์žฅ ์ข‹๊ฒ ์ง€๋งŒ.

 

 

 

<์ •๋ฆฌ>

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฌธ๋ฒ•์„ ์ •๋ฆฌํ•ด ๋‘๊ณ  ๊ธ€์„ ๋งˆ์นœ๋‹ค. ์ˆœ์„œ๋Œ€๋กœ UNION ALL์ค‘๋ณต ๋ฏธ์ œ๊ฑฐ, UNION์ค‘๋ณต ์ œ๊ฑฐ์œผ๋กœ FULL OUTER JOIN์„ ์ ์šฉํ•˜๋Š” ์ฟผ๋ฆฌ๋‹ค.

SELECT * FROM t1 
LEFT JOIN t2 ON t1.id = t2.id 
UNION ALL 
SELECT * FROM t1 
RIGHT JOIN t2 ON t1.id = t2.id 
WHERE t1.id IS NULL

 

 

SELECT * FROM t1 
LEFT JOIN t2 ON t1.id = t2.id 
UNION 
SELECT * FROM t1 
RIGHT JOIN t2 ON t1.id = t2.id

 

 

<์ฐธ๊ณ >

ubiq ๋ธ”๋กœ๊ทธ

sewonzzang๋‹˜ ๋ธ”๋กœ๊ทธ

 

 

 

๋”๋ณด๊ธฐ
TOOLS/SQL

 

 

 

<๋ฐ์ดํ„ฐ ์ฒดํฌ>

<

๋ฌธ์ œ ์ถœ์ฒ˜: ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค, ์‹ํ’ˆ๋ถ„๋ฅ˜๋ณ„ ๊ฐ€์žฅ ๋น„์‹ผ ์‹ํ’ˆ์˜ ์ •๋ณด ์กฐํšŒํ•˜๊ธฐ

ํ…Œ์ด๋ธ”๋ช…: food_product์–ด๋А ๋Œ€ํ˜•๋งˆํŠธ์˜ ์‹ํ’ˆ ์ •๋ณด ํ…Œ์ด๋ธ” ๊ฒฌ๋ณธ 

์ปฌ๋Ÿผ๋ช…: product_id์ œํ’ˆ์‹๋ณ„์ฝ”๋“œ, product_name์ œํ’ˆ๋ช…, product_cd์‹ํ’ˆ์ฝ”๋“œ, category์นดํ…Œ๊ณ ๋ฆฌ๋ช…, price๊ฐ€๊ฒฉ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์„ฑ: 1๊ฐœ ํ…Œ์ด๋ธ”, 5๊ฐœ ์ปฌ๋Ÿผ, 40๊ฐœ ๋กœ์šฐ

>

 

 

 

 

<์‹œ๋‚˜๋ฆฌ์˜ค>

 

๋‹น์‹ ์€ A์‹ํ’ˆ ์˜์—…ํŒ€ ๋‹ด๋‹น์ž๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ์ •๋Ÿ‰์ ์œผ๋กœ ์ œํ’ˆ๋ณ„ ํŒ๋งค ์„ฑ๊ณผ๋ฅผ ํ™•์ธํ•˜๊ณ ์ž ๋งˆํŠธ ์ „์‚ฐ ๊ธฐ์žฌ๋œ ์ž์‚ฌ ์ƒํ’ˆ ๊ธฐ๋ฐ˜์œผ๋กœ EDAํƒ์ƒ‰์  ๋ฐ์ดํ„ฐ ๋ถ„์„๋ฅผ ์ง„ํ–‰ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. food_product ํ…Œ์ด๋ธ”์—์„œ ์‹ํ’ˆ๋ถ„๋ฅ˜๋ณ„๋กœ ๊ฐ€๊ฒฉ์ด ๊ฐ€์žฅ ๋น„์‹ธ๊ฑฐ๋‚˜ ์‹ผ '๊ณผ์ž', '๊ตญ', '๊น€์น˜', '์‹์šฉ์œ '์˜ category, price, product_name์„ ์กฐํšŒํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ์ฟผ๋ฆฌ๋ฅผ ์งœ์•ผ ํ• ๊นŒ?

 

 

 

 

 

<ํ’€์ด>

 

'์‹ํ’ˆ๋ถ„๋ฅ˜๋ณ„' ์ด๋ผ ํ–ˆ์œผ๋‹ˆ ์ƒํ’ˆ์„ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์–ด์•ผ ํ•œ๋‹ค. ๋˜, GROUP BY์™€ ์œˆ๋„์šฐ ํ•จ์ˆ˜ ์ค‘์—๋Š” ์œˆ๋„์šฐ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์™œ๋ƒ๋ฉด ์—ฐ์‚ฐ๋œ ๊ฒฐ๊ณผ๊ฐ’์ด ์•„๋‹ˆ๋ผ ์—ฐ์‚ฐ์— ๋งž๋Š” ๊ฐ’์„ ๊ฐ€์ง„ ๋กœ์šฐ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•˜๋‹ˆ๊นŒ. ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์ข€ ๋” ๊นŠ์ด ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ์œˆ๋„์šฐ ํ•จ์ˆ˜Window Function VS GROUP BY ํฌ์ŠคํŠธ๋ฅผ ์ฝ์œผ๋ฉด ๋œ๋‹ค.

 

WHERE์ ˆ์ด ๊ธธ์–ด์ง€๊ฒ ๋‹ค. 1) '๊ณผ์ž', '๊ตญ', '๊น€์น˜', '์‹์šฉ์œ ' category์˜ ์ƒํ’ˆ ์ค‘์— 2) ์‹ํ’ˆ๋ถ„๋ฅ˜๋ณ„๋กœ ๊ฐ€๊ฒฉ์ด ๊ฐ€์žฅ ๋น„์‹ธ๊ฑฐ๋‚˜/ ์‹ผ ์ƒํ’ˆ๋งŒ ๊ณจ๋ผ ์ถœ๋ ฅํ•ด์•ผ ํ•˜๋‹ˆ๊นŒ. ์ด๋ฅผ ๋ฐ˜์˜ํ•ด WHERE์ ˆ์„ ์“ฐ๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ์ด๋ฅผ ๋ณด๋ฉด ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ IN ๋’ค์— ์กฐ๊ฑด์ ˆ๋กœ ๋„ฃ์–ด ์คฌ๋Š”๋ฐ, ์ด์— ๋Œ€ํ•ด ๊ถ๊ธˆํ•˜๋‹ค๋ฉด ๋‹ค์ค‘ํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ด€๋ จํ•ด ์ฐพ์•„๋ณด๋ฉด ๋œ๋‹ค.

 

WHERE category IN('๊ณผ์ž', '๊ตญ', '๊น€์น˜', '์‹์šฉ์œ ')
        AND price IN (SELECT MAX(price) OVER (PARTITION BY category) FROM food_product)
        -- ๊ฐ€์žฅ ๋น„์‹ผ ์ƒํ’ˆ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๊ฑฐ๋‚˜
WHERE category IN('๊ณผ์ž', '๊ตญ', '๊น€์น˜', '์‹์šฉ์œ ')
        AND price IN (SELECT MIN(price) OVER (PARTITION BY category) FROM food_product)
        -- ๊ฐ€์žฅ ์‹ผ ์ƒํ’ˆ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๊ฑฐ๋‚˜

 

๋˜ํ•œ ์ „๋ฌธ์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์“ธ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. 

 

SELECT category
        , price
        , product_name
FROM food_product
WHERE category IN('๊ณผ์ž', '๊ตญ', '๊น€์น˜', '์‹์šฉ์œ ')
        AND price IN (SELECT MAX(price) OVER (PARTITION BY category) FROM food_product)
        -- ๊ฐ€์žฅ ๋น„์‹ผ ์ƒํ’ˆ๋“ค๋งŒ ์ถœ๋ ฅ
ORDER BY price DESC

 

 

SELECT category
        , price
        , product_name
FROM food_product
WHERE category IN('๊ณผ์ž', '๊ตญ', '๊น€์น˜', '์‹์šฉ์œ ')
        AND price IN (SELECT MIN(price) OVER (PARTITION BY category) FROM food_product)
        -- ๊ฐ€์žฅ ์‹ผ ์ƒํ’ˆ๋“ค๋งŒ ์ถœ๋ ฅ
ORDER BY price DESC

 

 

 

 

 

๋”๋ณด๊ธฐ
TOOLS/SQL

 

 

 

 

<GROUP BY์™€ ์œˆ๋„์šฐ ํ•จ์ˆ˜Window Function๋Š” ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€>

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

 

 

 

 

 

<'ํ–‰์„ ๋ฌถ๋Š”๋‹ค' ๋Š” ํ–‰๋™์— ๋Œ€ํ•œ ์ดํ•ด>

๋ฌธ๋ฒ•์— ๋Œ€ํ•ด ๋‹ค๋ฃจ๊ธฐ ์•ž์„œ์„œ ์ฆ‰ 'ํ–‰์„ ๋ฌถ๋Š”๋‹ค'๋Š” ํ–‰๋™์— ๋Œ€ํ•ด ๋จผ์ € ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ํ–‰์„ ๋ฌถ๋Š”๋‹ค๋Š” ๊ฒƒ์€ ์ผ์ฐจ์ ์œผ๋กœ ํ–‰ ์‚ฌ์ด์˜ ๊ณตํ†ต์ ์„ ์ฐพ๋Š”๋‹ค๋Š” ๋œป์ด๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์€ ์—‘์…€ ํŒŒ์ผ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด์ž. 

 

์ด๋ฆ„ ์„ฑ๋ณ„ ๋‚˜์ด
๊น€์—์ด ๋‚จ 15
์ด๋น„ ์—ฌ 17
๊น€์”จ ์—ฌ 22
์ด์ด ๋‚จ 19

 

์ด ์—‘์…€ ํŒŒ์ผ์— 'ํ–‰์„ ๋ฌถ์œผ๋ฉด' ์–ด๋””์— ํฌ์ปค์Šค๋ฅผ ๋‘๋А๋ƒ์— ๋”ฐ๋ผ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‘ ๊ฐ€์ง€ ๊ฒฐ๊ณผ๋ฌผ์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

 

1) ํ–‰์— ํฌ์ปค์Šค๋ฅผ ๋‘๋Š” ๊ฒฝ์šฐ. ์•„๋ž˜๋Š” ์„ฑ๋ณ„ ๊ธฐ์ค€์œผ๋กœ ํ–‰์„ ๋ฌถ์–ด์„œ ์„ฑ๋ณ„ ๋ณ„ ์ตœ์—ฐ์žฅ์ž๋ฅผ ๊ฐ๊ฐ ์ถœ๋ ฅํ•œ ๊ฒฝ์šฐ๋‹ค.

์ด๋ฆ„ ์„ฑ๋ณ„ ๋‚˜์ด
์ด์ด ๋‚จ 19
๊น€์”จ ์—ฌ 22

 

 

2) ์—ฐ์‚ฐํ•œ ๊ฐ’์— ํฌ์ปค์Šค๋ฅผ ๋‘๋Š” ๊ฒฝ์šฐ. ์•„๋ž˜๋Š” ์ด๋ฆ„์˜ ์ฒซ ๊ธ€์ž, ์„ฑ ๊ธฐ์ค€์œผ๋กœ ํ–‰์„ ๋ฌถ์–ด์„œ ์„ฑ ๋ณ„ ๋‚˜์ด ์ตœ๋Œ€๊ฐ’์„ ๊ฐ๊ฐ ์ถœ๋ ฅํ•œ ๊ฒฝ์šฐ๋‹ค.

์„ฑ๋ณ„ ๋‚˜์ด ์ตœ๋Œ€๊ฐ’
๋‚จ 19
์—ฌ 22

 

 

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

 

 

 

 

<์œˆ๋„์šฐ ํ•จ์ˆ˜Window Fuction>

'ํ–‰๊ณผ ํ–‰ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•˜๊ฑฐ๋‚˜ ๋น„๊ต, ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜'๊ฐ€ ์œˆ๋„์šฐ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ •์˜๋‹ค. ์œ„์—์„œ ์•Œ์•„๋ดค๋“ฏ์ด GROUP BY๋Š” ๋™์ผํ•œ ๊ธฐ์ค€์„ ๊ฐ€์ง€๋Š” ๋กœ์šฐ๋“ค์„ ๋‹ค ํ•ฉ์ณ ๋ฒ„๋ฆฌ์ง€๋งŒ, ์œˆ๋„์šฐ ํ•จ์ˆ˜๋Š” ๋ณด์กดํ•ด ์ค€๋‹ค. ์ด ๋•Œ๋ฌธ์— GROUP BY๋กœ ํ•˜์ง€ ๋ชป ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅ ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ฃน ๋‚ด์—์„œ ์ˆœ์œ„/ ๋น„์œจ ๋ฝ‘๊ธฐ, ์—ฐ์‚ฐ์— ๋งž๋Š” ๊ฒฐ๊ณผ ๋กœ์šฐ ์ถœ๋ ฅํ•˜๊ธฐ(์ตœ๋Œ€๊ฐ’์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ์˜ ์ด๋ฆ„์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค๊ฑฐ๋‚˜) ๋“ฑ.

 

์œˆ๋„์šฐ ํ•จ์ˆ˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์“ฐ์ธ๋‹ค.

SELECT WINDOW_FUNCTION (ARGUMENTS) OVER 
( [PARTITION BY ์ปฌ๋Ÿผ] [ORDER BY ์ปฌ๋Ÿผ] [WINDOWING ์ ˆ] )
FROM ํ…Œ์ด๋ธ”๋ช… ; 

 

   1) WINDOW_FUNCTION : ์œˆ๋„์šฐ ํ•จ์ˆ˜ 

   2) ARGUMENTS(์ธ์ˆ˜) : ํ•จ์ˆ˜์— ๋”ฐ๋ผ 0 ~ N๊ฐœ ์ธ์ˆ˜๊ฐ€ ์ง€์ •๋  ์ˆ˜ ์žˆ๋‹ค. 

   3) PARTITION BY ์ ˆ : ์ „์ฒด ์ง‘ํ•ฉ์„ ๊ธฐ์ค€์— ์˜ํ•ด ์†Œ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.   

   4) ORDER BY ์ ˆ : ์–ด๋–ค ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•  ์ง€ order by ์ ˆ์„ ๊ธฐ์ˆ ํ•œ๋‹ค.

   5) WINDOWING ์ ˆ : WINDOWING ์ ˆ์€ ํ•จ์ˆ˜์˜ ๋Œ€์ƒ์ด ๋˜๋Š” ํ–‰ ๊ธฐ์ค€์˜ ๋ฒ”์œ„๋ฅผ ๊ฐ•๋ ฅํ•˜๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

์ด๋•Œ์˜ WINDOW_FUNCTION์—๋Š” ์ „์šฉ ์œˆ๋„์šฐ ํ•จ์ˆ˜ ์™ธ์—๋„ ๋‹ค์–‘ํ•œ ๊ธฐ์กด ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ๋‹ค ์“ธ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ๋ถ€๋ถ„์„ ์ด ํฌ์ŠคํŠธ์—์„œ ์ •๋ฆฌํ•˜์ง€๋Š” ์•Š๊ณ  ์ฐธ๊ณ  ํฌ์ŠคํŠธ ์ค‘ ํ•ด๋‹น ๋‚ด์šฉ์— ๋Œ€ํ•ด ์ž˜ ์ •๋ฆฌํ•œ ํฌ์ŠคํŠธ๊ฐ€ ์žˆ์–ด ์žฌ์ธ์šฉํ•œ๋‹ค*๋งํฌ๋Š” SQL ์ „๋ฌธ๊ฐ€ ๊ฐ€์ด๋“œ 2013 Edition๋ฅผ ์š”์•ฝํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค. ํ•ด๋‹น ํฌ์ŠคํŠธ๋ฅผ ์ฐธ์กฐํ•ด ์“ฐ๋ฉด, WINDOW_FUNCTION์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋“ค์ด ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

 

   1) ์ˆœ์œ„ ํ•จ์ˆ˜: RANK, DENSE_RANK, ROW_NUMBER

   2) ์ง‘๊ณ„ ํ•จ์ˆ˜: SUM, MAX, MIN, AVG, COUNT

   3) ๋น„์œจ ํ•จ์ˆ˜: CUME_DIST, PERCENT_RANK, NTILE, RATIO_TO_REPORT

 

์œˆ๋„์šฐ ํ•จ์ˆ˜๋Š” SQL์˜ ๋‹ค๋ฅธ ๋ฌธ๋ฒ•๋“ค๋ณด๋‹จ ๊ฝค ๋‚œ์ด๋„๊ฐ€ ์žˆ์–ด ์ง„์ž…์žฅ๋ฒฝ์ด ๋†’์ง€๋งŒ, ์ผ๋‹จ ์ตํ˜€๋‘๊ณ  ๋‚˜๋ฉด ์ฟผ๋ฆฌ ๋‹ค์ด์–ดํŠธ์— ๋„์›€์„ ์ฃผ๋Š” ํšจ์ž ํ•จ์ˆ˜๋‹ค. ์‹œ๊ฐ„ ๋‚ด์„œ ์ต์ˆ™ํ•ด์ ธ ๋ณด์ž.

 

 

 

 

 
๋”๋ณด๊ธฐ
TOOLS/SQL

 

 

 

<๋ฌธ์ œ>

<์›๋ณธ ๋ฌธ์ œ: HackerRank The Report>

 

์‹œํ—˜์ด ๋๋‚ฌ๋‹ค. ํ•˜์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ ๋‹น์‹ ์€ ํ•™๊ต ์„ ์ƒ๋‹˜์ด๋‹ค. ์•„์ด๋“ค์ด ๊ฐ€๋ฒผ์šด ๋งˆ์Œ์œผ๋กœ ํ•˜๊ตํ•˜๋Š” ๊ฒƒ๊ณผ ๋ณ„๊ฐœ๋กœ ๋‹น์‹ ์€ ์ฑ„์ ๋œ ์ ์ˆ˜ ๊ธฐ์ค€์œผ๋กœ ์•„์ด๋“ค์˜ ๋“ฑ๊ธ‰์„ ๋งค๊ฒจ์•ผ ํ•  ์ค‘์š”ํ•œ ์ฑ…๋ฌด๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค. ๋‹น์‹  ์•ž์—๋Š” Students ํ…Œ์ด๋ธ”๊ณผ Grades ํ…Œ์ด๋ธ”์ด ๋†“์—ฌ ์žˆ๋‹ค. ํ•˜๋‚˜๋Š” ํ•™์ƒ์˜ ์ด๋ฆ„๊ณผ ์ ์ˆ˜๊ฐ€ ๋“ค์–ด ์žˆ๋Š” ํ…Œ์ด๋ธ”์ด๊ณ  ๋‚˜๋จธ์ง€ ํ•˜๋‚˜๋Š” ์ ์ˆ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•™์ƒ์„ ๊ทธ๋ฃน ๋‚˜๋ˆ„๋Š” ๋“ฑ๊ธ‰ ํ…Œ์ด๋ธ”์ด๋‹ค. ๋‘ ํ…Œ์ด๋ธ”์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค. ๋น„๊ต์  ๋œ ์‚ฝ์งˆํ•˜๊ณ  ์•„์ด๋“ค์˜ ๋“ฑ๊ธ‰์„ ๋งค๊ธธ ์ฟผ๋ฆฌ๋ฅผ ์งค ๋ฐฉ๋ฒ•์€ ์—†์„๊นŒ.

 

 

Students ํ…Œ์ด๋ธ”.

 

Grades ํ…Œ์ด๋ธ”.

 

 

 

<ํ’€์ด>

 

๋ฌผ๋ก  ์ €๋ฒˆ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ CASE WHEN์œผ๋กœ ์ผ์ผ์ด ์ง€์ •ํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ฒ ์ง€๋งŒ, MIN ๊ฐ’๊ณผ MAX ๊ฐ’์ด ์žˆ๋Š” ํ…Œ์ด๋ธ”์ด ์ด๋ ‡๊ฒŒ ์˜ˆ์˜๊ฒŒ ์žˆ๋‹ค๋ฉด LEFT JOIN์œผ๋กœ ๋ฌถ๊ณ  BETWEEN๋งŒ ๊ฑธ์–ด ์ค˜๋„ ์ „์ฒด ๋“ฑ๊ธ‰์„ ๋ฝ‘์„ ์ˆ˜ ์žˆ๋‹ค. LEFT JOIN์€ INNER JOIN๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋‘ ํ…Œ์ด๋ธ”์— ๋™์ผํ•œ ๊ฐ’์ด ์—†์–ด๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ, ์ผ๋‹จ ์˜†์— ๋ถ™์—ฌ ๋†“๊ณ  ๊ฐ™์€ ํ…Œ์ด๋ธ”์— ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์—ฐ์‚ฐ์—๋งŒ ๋ฝ‘์•„ ์“ฐ๋Š” ๊ฒƒ์ด๋‹ค.

 

SELECT IF(Grade < 8, NULL, Name), g.Grade, s.Marks
FROM Students s
	LEFT JOIN Grades g ON s.Marks BETWEEN g.Min_Mark AND g.Max_Mark
ORDER BY Grade DESC, Name, Marks

 

 

Grades ํ…Œ์ด๋ธ”๋Œ€๋กœ ์ž˜ ๋ถ„๋ฆฌ๋ผ ๋‚˜์˜จ๋‹ค.

 

 

 

 

๋”๋ณด๊ธฐ
TOOLS/SQL

<๋ฌธ์ œ>

<์›๋ณธ ๋ฌธ์ œ: ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๊ฐ€๊ฒฉ๋Œ€๋ณ„ ์ƒํ’ˆ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ>

 

์–ด๋–ค ์˜จ๋ผ์ธ ์‡ผํ•‘๋ชฐ์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž. ์ด ์‡ผํ•‘๋ชฐ์€ ๋งŒ ์› ๋Œ€๋ถ€ํ„ฐ ํŒ”๋งŒ ์› ๋Œ€๊นŒ์ง€ ๋‹ค์–‘ํ•œ ๊ฐ€๊ฒฉ๋Œ€์˜ ์ƒํ’ˆ์„ ์ทจ๊ธ‰ํ•˜๊ณ  ์žˆ๋‹ค. ์–ด๋А ๋‚  ํ”„๋กœ๋•ํŠธ ํŒ€์—์„œ ๋ฐ์ดํ„ฐ ์ถ”์ถœ ์š”์ฒญ์ด ๋“ค์–ด์™”๋‹ค. ์ œํ’ˆ์„ ๊ฐ€๊ฒฉ๋Œ€๋ณ„๋กœ ํ”„๋กœ๋ชจ์…˜ ์ง„ํ–‰ํ•˜๋ ค ํ•˜๋‹ˆ ๋งŒ ์› ๋‹จ์œ„๋กœ ๊ทธ๋ฃน์„ ๋‚˜๋ˆ  ๋‹ฌ๋ผ๊ณ . ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ๋Š” ์ฟผ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ์งœ์•ผ ํ• ๊นŒ? ์ œํ’ˆ ์ •๋ณด๊ฐ€ ๋“ค์–ด ์žˆ๋Š” product ํ…Œ์ด๋ธ”์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

Column name Type Nullable
product_id INTEGER FALSE
product_code VARCHAR(8) FALSE
price INTEGER FALSE

 

product_id product_code price
1 A1000011 10000
2 A1000045 9000
3 C3000002 22000
4 C3000006 15000
5 C3000010 30000
6 K1000023 17000

 

 

 

 

 

<ํ’€์ด>

 

CASE WHEN์œผ๋กœ ์ผ์ผ์ด ์ง€์ •ํ•ด์ค˜๋„ ๋˜์ง€๋งŒ, ๊ฐ€๊ฒฉ์ด ๋“ค์–ด๊ฐ„ ์ปฌ๋Ÿผ์ด ์žˆ๋Š” ์ƒํ™ฉ์ด๋ฏ€๋กœ ์กฐ๊ฑด์— ๋ถ€ํ•ฉ๋˜๋Š” ๋Œ€๋กœ ๊ณ„์‚ฐํ•ด์„œ ๋‹ต์„ ๋ฝ‘์•„๋„ ๋œ๋‹ค. FLOOR์™€ TRUNCATE๋กœ ๊ฐ๊ฐ ์•„๋ž˜์™€ ๊ฐ™์ด ํ’€ ์ˆ˜ ์žˆ๋‹ค.

 

 

(1) FLOOR

์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ€๊ฒฉ์„ 10000์œผ๋กœ ๋‚˜๋ˆˆ ๋’ค FLOOR๋ฅผ ์ ์šฉํ•ด ์ฃผ๋ฉด ๊ฐ ๊ฐ€๊ฒฉ๋Œ€๋ณ„๋กœ ์œ ๋‹ˆํฌํ•œ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์ธ๋‹ค.   

 

SELECT FLOOR(price / 10000)*10000 AS price_group
             , COUNT(product_id) AS products
FROM product
GROUP BY price_group
ORDER BY price_group

 

 

 

 

 

(2)TRUNCATE

์•„๋ž˜์ฒ˜๋Ÿผ CASE WHEN์œผ๋กœ 10,000์› ๋ฏธ๋งŒ ์ƒํ’ˆ์„ NULL ๊ฐ’์œผ๋กœ ๋นผ ๋ฒ„๋ฆฐ ๋’ค ๋‚˜๋จธ์ง€๋ฅผ TRUNCATE ํ•ด ์ค˜๋„ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฌถ์ธ๋‹ค.

 

SELECT CASE
        WHEN price < 10000 THEN NULL
        ELSE TRUNCATE(price, -4) END AS price_group
        , COUNT(product_id) AS products
FROM product
GROUP BY price_group
ORDER BY price_group

 

 

 

๊ฒฐ๊ณผ๊ฐ’์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜์˜จ๋‹ค.

 

price_group products
10000 2
20000 2
30000 3
40000 4
50000 6
60000 7
70000 2
80000 4

 

GROUP BY์— product_code๋ฅผ ๋„ฃ์–ด ์ฃผ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๊ทธ๋ฃน๋ณ„ ์ƒํ’ˆ์ฝ”๋“œ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

 

price_group product_code
10000 A3000001
10000 C3000002
20000 A2000002
20000 C4000002
30000 D2000000
... ...

 

 

 

 

๋”๋ณด๊ธฐ
TOOLS/SQL

 

 

 

 

 

์™œ NULL์€ =์ด ์•„๋‹ˆ๋ผ is๋ฅผ ์“ธ๊นŒ

 

SQL ๋ฌธ๋ฒ•์„ ์ฒ˜์Œ ๋ฐฐ์šธ ๋•Œ, ๊ผญ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ด ์žˆ๋‹ค. 'NULL์„ ์ฐพ์„ ๋•Œ๋Š” = NULL์ด ์•„๋‹ˆ๋ผ IS NULL์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค'. ์˜์•„ํ•˜๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ๋Š” (๋…ผ๋ฆฌ ์—ฐ์‚ฐ์—์„œ) NULL์„ 0๊ณผ ๊ฐ™์ด ์ทจ๊ธ‰ํ•˜์ง€ ์•Š๋Š”๊ฐ€. SQL์—๋Š” ์–ด๋–ค ์ฐจ์ด์ ์ด ์žˆ๊ธธ๋ž˜ ์ด์ฒ˜๋Ÿผ ํŠน๋ณ„ํ•˜๊ฒŒ NULL์„ ๋‹ค๋ฃฐ๊นŒ. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—๋Š” SQL์‹ NULL์˜ ์ •์˜์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋ฉด์„œ ์œ„ ์˜๋ฌธ์— ๋Œ€ํ•ด ํŒŒํ—ค์ณ ๋ณธ๋‹ค.

 

 

0๊ณผ NULL์€ ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๋Š” ๊ฑธ๊นŒ.

 

 

 

๋ฐ์ดํ„ฐ๊ฐ€ '์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฐ’' ๊ทธ๋ž˜์„œ '์•„์ง ๋ชจ๋ฅด๋Š” ๊ฐ’'

 

SQL์—์„œ์˜ NULL์€ ์œ„ํ‚ค๋ฐฑ๊ณผ ๊ธฐ์ค€์œผ๋กœ ์ด๋ ‡๊ฒŒ ์ •์˜๋œ๋‹ค. 'Null ๋˜๋Š” NULL์€ ๊ตฌ์กฐ์  ์งˆ์˜์–ธ์–ด(SQL)์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด์˜ ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์ง€์‹œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํŠน๋ณ„ํ•œ ํ‘œ์‹œ์–ด(Special marker)'. 

 

์ด์ฒ˜๋Ÿผ NULL์€ '์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฐ’'์ด๋‹ค. 0๋„ ์•„๋‹ˆ๊ณ  STRING๋„ ์•„๋‹ˆ๊ณ  ๋‹ค๋ฅธ ์–ด๋А ํƒ€์ž…๋„ ์•„๋‹Œ ๊ทธ๋ƒฅ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐ’. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋”ฐ๋กœ ๋นผ ๋‘˜ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑด ๊ต‰์žฅํžˆ ์ค‘์š”ํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค.

 

NULL์€ '์กด์žฌํ•˜์ง€ ์•Š๋Š”' ๊ฐ’์ด๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, Primary Key๋ฅผ ์„ค์ •ํ•œ๋‹ค๊ณ  ํ•˜์ž. PK๋Š” NOTNULL, NULL ๊ฐ’์ด์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค. SQL์—์„œ๋Š” PK์— NULL์ด ๋“ค์–ด์˜ค๋ฉด ์˜ค๋ฅ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์ด๋กœ์จ ์˜๋ฏธ ์—†๋Š” ๋กœ์šฐ๋ฅผ ์‚ฌ์ „์— ๊ฑธ๋Ÿฌ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋ฅธ ์ปฌ๋Ÿผ์˜ ๊ฒฝ์šฐ์—๋„ NULL์˜ ํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 'NULL'์ด๋ผ๋Š” '์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฐ’'์ด ์ด๋ฏธ ์กด์žฌํ•˜๋‹ˆ '0'์ด๋‚˜ '9999' ์ฒ˜๋Ÿผ ์˜๋ฏธ ์—†๋Š” ์ˆ˜๋กœ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฐ’์„ ์žฌ์ •์˜ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ด์ฒ˜๋Ÿผ SQL์€ NULL์„ ์ฒดํฌํ•จ์œผ๋กœ์จ SQL๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž์ฒด์˜ ์ •ํ•ฉ์„ฑ์„ ํ™•๊ณ ํžˆ ํ•˜๊ณ  ์žˆ๋‹ค.

 

 

 

 

 

NULL์˜ ํŠน์„ฑ

 

์œ„์ฒ˜๋Ÿผ SQL์˜ NULL์€ ํƒ€ ์–ธ์–ด์™€ ๋‹ค๋ฅธ ํ˜•ํƒœ๋กœ ์ •์˜๋˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ์‚ฐ๋„ ์กฐ๊ธˆ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ด๋ค„์ง„๋‹ค. ์•„๋ž˜์—์„œ ์ง์ ‘ ์˜ˆ์‹œ์™€ ํ•จ๊ป˜ ๋ณด๋ฉด์„œ NULL์˜ ํŠน์„ฑ์„ ์•Œ์•„๋ณด์ž.

 

 

A
NULL
1

 

 

 

1) ์‚ฌ์น™์—ฐ์‚ฐ

 

์œ„์™€ ๊ฐ™์€ ํ…Œ์ด๋ธ”์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž. ์ฒซ ๋ฒˆ์งธ ๋กœ์šฐ๋Š” NULL์ด๊ณ  ๋‘ ๋ฒˆ์งธ ๋กœ์šฐ๋Š” ์ •์ˆ˜๋‹ค. ์ด ํ…Œ์ด๋ธ”์— ์‚ฌ์น™์—ฐ์‚ฐ์„ ์ ์šฉํ•˜๋ฉด: 

 

SELECT A + 5, A - 5, A * 5, A / 5 FROM nullcheck;

 

A + 5 A - 5 A * 5 A / 5
NULL NULL NULL NULL
6 -4 5 0.2

 

 

๋„ค ์—ฐ์‚ฐ ๋ชจ๋‘ ๋™์ผํ•˜๊ฒŒ NULL ๊ฐ’์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋ชจ๋ฅด๋Š” ๊ฐ’์— ์ˆซ์ž๋ฅผ ๋”ํ•˜๊ณ  ๋นผ ๋ด์•ผ ์—ฌ์ „ํžˆ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐ’์ธ ๊ฒƒ์ด๋‹ค. 

 

 

 

2) ๋น„๊ต์—ฐ์‚ฐ

 

์ด๋ฒˆ์—๋Š” ๋น„๊ต์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•ด ๋ณด์ž. ์•„๋ž˜์™€ ๊ฐ™์€ ํ…Œ์ด๋ธ”์— ๋น„๊ต์—ฐ์‚ฐ์„ ์ ์šฉํ•˜๋ฉด:

 

A B
1 2
1 NULL
NULL NULL

 

A = B, A > B, A < B๋ฅผ ๊ฐ๊ฐ ์ ์šฉํ–ˆ์„ ๋•Œ A < B์—์„œ ๋‘˜ ๋‹ค ์ •์ˆ˜์ธ ๋กœ์šฐ๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ ์™ธ์— ๋‚˜์˜ค๋Š” ๊ฒŒ ์—†๋‹ค. ๋ˆˆ์—ฌ๊ฒจ๋ณผ ์ ์€ 1๊ณผ NULL๋ฟ ์•„๋‹ˆ๋ผ  NULL๊ณผ NULL๋ผ๋ฆฌ๋„ ์•ˆ ๋๋‹ค๋Š” ์ ์ด๋‹ค. SQL์—์„œ NULL ๊ฐ’์€ '์•Œ ์ˆ˜ ์—†๋Š” ๊ฐ’' ์ด๋ฏ€๋กœ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐ’ ์‚ฌ์ด์˜ ๋น„๊ต๋Š” ๋ถˆ๊ฐ€ํ•˜๋‹ค.

 

 

 

3) ์ง‘๊ณ„ํ•จ์ˆ˜

 

์ด๋ฒˆ์—” ์ง‘๊ณ„ํ•จ์ˆ˜๋‹ค. ์•„๋ž˜ ํ…Œ์ด๋ธ”์— ์ง‘๊ณ„ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•ด ๋ณด๋ฉด:

 

์ฃผ๋ฌธ๋ฒˆํ˜ธ ๊ตฌ๋งค๊ธˆ์•ก
10001 10000
10002 7000
10003 NULL
10004 2000

 

SELECT COUNT(*), COUNT(๊ตฌ๋งค๊ธˆ์•ก), SUM(๊ตฌ๋งค๊ธˆ์•ก), AVG(๊ตฌ๋งค๊ธˆ์•ก), MAX(๊ตฌ๋งค๊ธˆ์•ก), MIN(๊ตฌ๋งค๊ธˆ์•ก)
FROM zipge;

 

COUNT(*) COUNT(๊ตฌ๋งค๊ธˆ์•ก) SUM(๊ตฌ๋งค๊ธˆ์•ก) AVG(๊ตฌ๋งค๊ธˆ์•ก) MAX(๊ตฌ๋งค๊ธˆ์•ก) MIN(๊ตฌ๋งค๊ธˆ์•ก)
4 3 19000 6333.3333 10000 2000

 

์‚ฌ์น™์—ฐ์‚ฐ์—์„œ์ฒ˜๋Ÿผ ์ถœ๋ ฅ์ด ์•„์˜ˆ ์•ˆ ๋˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ NULL๊ฐ’์„ ์ž๋™์œผ๋กœ ๋นผ๊ณ  ์ด์™ธ์˜ ๊ฐ’์„ ์—ฐ์‚ฐํ•ด ์ค€๋‹ค. ๋‹ค๋งŒ, COUNT์™€ AVG๋Š” ์ฃผ์˜ํ•  ํ•„์š”๊ฐ€ ์žˆ์–ด ๋ณด์ธ๋‹ค. ์ƒ๊ธฐ ์ฟผ๋ฆฌ์—์„œ COUNT(*)์™€ COUNT(๊ตฌ๋งค๊ธˆ์•ก)์€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์„ ๋ฆฌํ„ดํ–ˆ๋‹ค. ์ฃผ๋ฌธ๋ฒˆํ˜ธ 10003์€ ์ฃผ๋ฌธ๊ธˆ์•ก์ด NULL์ด์ง€๋งŒ ์ฃผ๋ฌธ๋ฒˆํ˜ธ๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ COUNT(*)์—์„œ๋Š” ๊ฐ’์œผ๋กœ ์ง‘๊ณ„๋œ ๊ฒƒ์ด๋‹ค. AVG์˜ ๊ฒฝ์šฐ์—๋Š” ์ „์ฒด ๊ตฌ๋งค์•ก์ธ 19000์„ ํ•ด๋‹น ์ปฌ๋Ÿผ์—์„œ NULL์ด ์•„๋‹Œ ๋กœ์šฐ์ธ 3์œผ๋กœ ๋‚˜๋ˆˆ ๊ฐ’์œผ๋กœ ์ถœ๋ ฅ๋๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ SUM(๊ตฌ๋งค๊ธˆ์•ก) / COUNT(*)์™€๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋‹ต์„ ์ถœ๋ ฅํ•˜๊ฒŒ ๋๋‹ค.

 

 

 

 

NULL์„ TRUE ์•„๋‹ˆ๋ฉด FALSE๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•

 

์ด์ฒ˜๋Ÿผ SQL์€ NULL์„ ๊ฑธ๋Ÿฌ๋‚ด๊ธฐ ์œ„ํ•ด ๊ธฐ์กด ์–ธ์–ด์—์„œ ์‚ฌ์šฉ๋˜๋˜ TRUE, FALSE๋กœ ์ด๋ฃจ์–ด์ง„ 2๊ฐ’ ๋…ผ๋ฆฌ์— NULL์„ ์ถ”๊ฐ€ํ•œ 3๊ฐ€ ๋…ผ๋ฆฌ(Three-valued logic)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

 

์ด์ œ ์šฐ๋ฆฌ๋Š” ์ฒ˜์Œ์˜ ์งˆ๋ฌธ์— ๋‹ตํ•  ์ˆ˜ ์žˆ๋‹ค. "์™œ NULL์€ =์ด ์•„๋‹ˆ๋ผ is๋ฅผ ์จ์•ผ ํ• ๊นŒ."

 

๋‹ต๋ณ€์€ ์ด์ฏค ๋˜๊ฒ ๋‹ค. NULL์€ TRUE๋‚˜ FALSE๋กœ ์„ค๋ช…๋  ์ˆ˜ ์—†๋Š” ์ œ 3์˜ ๊ฐ’์ด๋‹ค. ๊ทธ๋ž˜์„œ NULL์€ ๋น„๊ต์—ฐ์‚ฐ๋  ์ˆ˜ ์—†๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ ๋ชจ๋ฅด๋Š” ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ SQL์€ 'NULL์„ TRUE๋‚˜ FALSE ๋‘ ๊ฐ€์ง€๋กœ ๋น„๊ต์—ฐ์‚ฐํ•  ์ˆ˜ ์žˆ๋Š”' ๋ฌธ๋ฒ•์„ ๋งŒ๋“ค์—ˆ๊ณ  ์ด๊ฒŒ IS NULL๊ณผ IS NOT NULL์ด์—ˆ์„ ๊ฒƒ์ด๋‹ค.

 

NULL๋„ ๋น„๊ต์—ฐ์‚ฐ ํ•  ์ˆ˜ ์žˆ๋‹ค. SQL์—์„œ๋Š”.

 

 

 

 

์ฐธ๊ณ 

 

1) https://khdscor.tistory.com/53

2) https://yoongaemii.github.io/null_in_sql/

3) https://velog.io/@minnim1010/SQL-NULL-%EC%9D%B4-%EC%95%84%EB%8B%8C-IS-NULL%EC%9D%B8-%EC%9D%B4%EC%9C%A0-9irf8u7o

 

 

 

 

 

๋”๋ณด๊ธฐ
TOOLS/SQL

 

 

 

 

CASE WHEN(CASE ๋ฌธ์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค.)์€ SQL์˜ ์กฐ๊ฑด๋ฌธ์ด๋‹ค. ๊ธฐ์ค€ ์ปฌ๋Ÿผ A๊ฐ€ B๋ผ๋Š” ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด C๋ผ๋Š” ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ํ˜•ํƒœ๋กœ 'CASE WHEN A = B THEN C'์™€ ๊ฐ™์ด ํ‘œํ˜„๋œ๋‹ค. "์กฐ๊ฑด์— ๋งž๋Š” ๋‹ต์„ ์ถœ๋ ฅ"ํ•˜๋Š” ์‹์ด์–ด์„œ ์ฃผ๋กœ SELECT ์ ˆ์ด๋‚˜ ์ง‘๊ณ„ํ•จ์ˆ˜์—์„œ ์“ฐ์ธ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ๋ฐ˜์œผ๋กœ ์•„์ง ์ง‘๊ณ„๋˜์ง€ ์•Š์€ ์œ ์˜๋ฏธํ•œ ์ง€ํ‘œ๋ฅผ ์ฐพ์•„ ๋ฐ˜ํ™˜ํ•ด ๋ณด๊ณ  ์ด๋ฅผ ํ†ตํ•ด CASE WHEN์˜ SELECT์ ˆ ์šฉ๋ก€๋ฅผ ์‚ดํŽด๋ณด๋ ค ํ•œ๋‹ค.

 

 

 

์‚ฌ์šฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

 

์•„๋ž˜๋กœ ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์žˆ๋‹ค. (mySQL์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ์ƒ˜ํ”Œ์ด๋‹ค.) ์šฐ๋ฆฌ๋Š” ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”๋“ค์„ ์‚ดํŽด๋ณด๊ณ  CASE WHEN์„ ํ†ตํ•ด ํšŒ์‚ฌ ์šด์˜ ์ „๋ฐ˜์— ์œ ์˜๋ฏธํ•œ ์ •๋ณด๋ฅผ ๋งŒ๋“ค์–ด ๋ณผ ๊ฒƒ์ด๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” ์—ฌ๋Ÿ ๊ฐœ์˜ ํ…Œ์ด๋ธ”์ด ์žˆ๋‹ค. customers, employees, offices, orderdetails, orders, payments, productline, products...... ์ด ํšŒ์‚ฌ์—์„œ ๋ฌด์Šจ ์ผ์„ ํ•˜๋Š”์ง€๋Š” ์•„์ง ์•Œ ์ˆ˜ ์—†์ง€๋งŒ ํ”„๋กœ๋•ํŠธ ์ •๋ณด, ์ฃผ๋ฌธ ์ •๋ณด๋ฅผ ๊ฐ€์ง„ ๊ฒƒ์œผ๋กœ ๋ณด์•„ ์–ด๋–ค ํ”„๋กœ๋•ํŠธ๋ฅผ ํŒ๋งคํ•˜๋Š” ์ปค๋จธ์Šค์ž„์„ ์šฐ์„  ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๊ฒŒ ์œ ํ˜•์˜ ์ œํ’ˆ์ด๋“ , ๋ฌดํ˜•์˜ ์ œํ’ˆ์ด๋“ ๊ฐ„์—. ์šฐ์„  products๋ฅผ ํ•œ ๋ฒˆ ๋ณผ๊นŒ.

 

 

 

 

 

 

 

์œ„ ์‚ฌ์ง„์€ products์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ผ๋ถ€ ์ถœ๋ ฅํ•œ ๊ฒƒ์ด๋‹ค. ์ต์ˆ™ํ•œ ์ž๋™์ฐจ/ ์˜คํ† ๋ฐ”์ด ๋ธŒ๋žœ๋“œ๊ฐ€ ๋ณด์ด๋Š”๋ฐ, ์ „๋ฐ˜์ ์œผ๋กœ ์—„์ฒญ ์˜›๋‚  ๊ฒƒ์ด๊ณ (productName) ์žฌ๊ณ  ์ˆ˜๋Ÿ‰๋„ ๋„ˆ๋ฌด ๋งŽ๋‹ค. ์ข€ ๋” ์‚ดํŽด ๋ณด๋‹ˆ productScale์ด๋ผ๋Š” ์ปฌ๋Ÿผ์ด ์žˆ๋‹ค. 1:10, 1:12...... ์ž๋™์ฐจ ๋ฏธ๋‹ˆ์–ด์ฒ˜๋ฅผ ํŒŒ๋Š” ํšŒ์‚ฌ์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ œ์กฐ ๋ฒค๋”์‚ฌ(productVender)๊ฐ€ ์—ฌ๋Ÿฟ์ธ ๊ฒƒ์œผ๋กœ ๋ด์„  ์ œ์กฐ์‚ฌ๋ณด๋‹ค๋Š” ์œ ํ†ต์‚ฌ์— ๊ฐ€๊นŒ์šด ํšŒ์‚ฌ๊ฒ ๋‹ค.

 

์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ ์ฃผ๋กœ ๋’ค์— ์žˆ๋‹ค. ์žฌ๊ณ  ์ˆ˜๋Ÿ‰(quantityInstock), ๊ตฌ๋งค์›๊ฐ€(buyPrice), ํŒ๋งค๊ฐ€(MSRP). ํŒ๋งค ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ๋ณด๋ฉด ๋œฏ์–ด๋ณผ ๋ถ€๋ถ„์ด ๋งŽ์•„ ๋ณด์ธ๋‹ค. ํ•˜์ง€๋งŒ ์ด ํšŒ์‚ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—” ํŒ๋งค ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ๋ฌธ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ์ถ”์ถœํ•ด๋‚ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

 

 

 

 

๋‹ค์Œ์œผ๋กœ ์‚ดํŽด ๋ณผ ํ…Œ์ด๋ธ”์€ orderdetails ํ…Œ์ด๋ธ”์ด๋‹ค. ์ œํ’ˆ์˜ ๊ฐœ๋‹น ๋‹จ๊ฐ€์™€ ์ฃผ๋ฌธ ์ˆ˜๋Ÿ‰์ด ์žˆ๊ณ  productCode๋กœ products ํ…Œ์ด๋ธ”๊ณผ ์—ฐ๊ฒฐ๋ผ ์žˆ๋‹ค. ์ฃผ๋ฌธ ์ˆ˜๋Ÿ‰์ด ์ญ‰ ๋‚˜์—ด๋ผ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— products์™€ orders๋ฅผ ํ•จ๊ป˜ ๋ณด๋ฉด ์ œํ’ˆ์˜ ํ‰๊ท  ์ฃผ๋ฌธ ์ˆ˜๋Ÿ‰์ด๋‚˜ ์ด ๋งค์ถœ์•ก, ์ž”์—ฌ ์žฌ๊ณ ์ˆ˜๋Ÿ‰, ์•ˆ์ „ ์žฌ๊ณ  ๋“ฑ์˜ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๊ฒ ๋‹ค. ์•„์‰ฌ์šด ๊ฒƒ์€, ์ฃผ๋ฌธ ์ผ์ž๊ฐ€ ์—†๋‹ค. ๊ธฐ๊ฐ„๋ณ„๋กœ ๊ทธ๋ฃนํ•ด ๋ณผ ์ˆ˜ ์—†์œผ๋‹ˆ ์œ ์˜๋ฏธํ•œ ์ •๋ณด๋ฅผ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜๋Š” ์—†๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ…Œ์ด๋ธ” ํ•˜๋‚˜๊ฐ€ ๋” ํ•„์š”ํ•˜๊ฒ ๋‹ค. 

 

 

 

 

๋ฐ”๋กœ orders ํ…Œ์ด๋ธ”์ด๋‹ค. ์ด ํ…Œ์ด๋ธ”์—๋Š” ์ฃผ๋ฌธ ์ผ์ž(orderDate)์™€ ์ฃผ๋ฌธํ•œ ์‚ฌ๋žŒ์˜ ๊ณ ๊ฐ ๋ฒˆํ˜ธ(customerNumber), ๊ทธ๋ฆฌ๊ณ  ์ฃผ๋ฌธ ๋ฒˆํ˜ธ๊ฐ€ ์ ํ˜€ ์žˆ๋‹ค. ํ…Œ์ด๋ธ”์„ ์‚ดํŽด ๋ณด๋‹ˆ 2003๋…„ 01์›”๋ถ€ํ„ฐ 2005๋…„ 05์›”๊นŒ์ง€์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋ผ ์žˆ๋‹ค. ์ด๊ฑธ๋กœ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋‘ ๋ชจ์•„์กŒ๋‹ค. ์ด์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ˆ์˜๊ฒŒ ๋‹ค๋“ฌ์–ด๋ณด์ž.

 

 

 

 

INNER JOIN: ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ” ๋ชจ์•„์„œ ๋ณด๊ธฐ

 

CASE WHEN์€ ์กฐ๊ฑด์„ ๋‹ค๋Š” ๋ฐ ์ˆ˜๋Ÿ‰ ์ œํ•œ์ด ์—†๋‹ค. ์›ํ•˜๋Š” ์ˆ˜๋Ÿ‰๋งŒํผ ์ถฉ๋ถ„ํžˆ ๋ง๋ถ™์ผ ์ˆ˜ ์žˆ๋‹จ ์†Œ๋ฆฌ๋‹ค. SELECT ์ ˆ์—์„œ CASE WHEN์„ ์‚ฌ์šฉํ•˜๋ฉด ์ƒˆ๋กœ์šด ์ปฌ๋Ÿผ์—์„œ ๊ตฌ๊ฐ„์— ๋งž์ถฐ ๊ฐ’์„ ๋‹ค์‹œ ๋ถ€์—ฌํ•จ์œผ๋กœ์จ ๋กœ์šฐ๋“ค์„ ์„ธ๋ถ„ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•œ ํ…Œ์ด๋ธ”์—์„œ๋งŒ ์ง„ํ–‰ํ•˜๊ธฐ๋Š” ์กฐ๊ธˆ ์–ด๋ ต๋‹ค. ๊ฐ ์ •๋ณด๊ฐ’์ด ๋‘ ํ…Œ์ด๋ธ”์—์„œ ๊ณต์œ ํ•˜๋Š” ๊ฐ’(๊ธฐ๋ณธํ‚ค)์„ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆ ์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋ฅผ ํ…Œ๋ฉด, orderdetails์—์„œ๋Š” ์ œํ’ˆ์˜ ๊ฐ’๊ณผ ์ฃผ๋ฌธ ์ˆ˜๋Ÿ‰์ด ์žˆ์ง€๋งŒ ์ฃผ๋ฌธ ์ผ์ž์™€ ์ฃผ๋ฌธ์ž๋ช…์ด ์—†๋‹ค. ์ด ๋‘ ์ •๋ณด๊ฐ’์€ orders ํ…Œ์ด๋ธ”์—์„œ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค.

 

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ด์ „ ํฌ์ŠคํŠธ์—์„œ JOIN์— ๊ด€ํ•ด ๋ฐฐ์› ๋‹ค. INNER JOIN์„ ํ™œ์šฉํ•˜๋ฉด ๊ฐ๊ธฐ ๋‘ ํ…Œ์ด๋ธ”์—์„œ ์›ํ•˜๋Š” ์ปฌ๋Ÿผ์„ ๊ฐ๊ฐ ๊ฐ€์ ธ์™€ ์žฌ์กฐ๋ฆฝํ•ด SELECT ํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ๋ง์ด๋‹ค.

 

SELECT ods.orderDate
, ods.customerNumber
, odd.orderNumber
, odd.productCode
        , odd.quantityOrdered
        , odd.priceEach
FROM orderdetails odd, orders ods
WHERE odd.orderNumber = ods.orderNumber

 

 

 

 

์ด๋ ‡๊ฒŒ INNER JOIN์œผ๋กœ ์ •๋ณด๋ฅผ ๊ฐ๊ฐ ๊ฐ€์ ธ์™€ ์ฃผ๋ฉด, ์ผ์ž๋ณ„๋กœ ์–ด๋–ค ์ƒํ’ˆ์ด ๋ˆ„๊ตฌ์—๊ฒŒ ์–ผ๋งˆ๋‚˜ ํŒ”๋ ธ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด ํ…Œ์ด๋ธ”์„ ๊ธฐ์ค€์œผ๋กœ 2003๋…„ ๊ธฐ์ค€์œผ๋กœ ์ œํ’ˆ๋ณ„ ๋งค์ถœ ์ˆœ์œ„๋ฅผ ๋ฝ‘์•„ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

 

WHERE, GROUP BY: 1๋…„์น˜ ์ œํ’ˆ๋ณ„ ๋งค์ถœ ์ˆœ์œ„ ๋ฝ‘๊ธฐ

 

SELECT ods.orderDate
, ods.customerNumber
, odd.orderNumber
, odd.productCode
        , odd.quantityOrdered
        , odd.priceEach
FROM orderdetails odd, orders ods
WHERE odd.orderNumber = ods.orderNumber
AND orderDate LIKE '2003%'
ORDER BY productCode;

 

 

 

 

WHERE ์ ˆ์— ์กฐ๊ฑด์„ ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€ํ•ด ์คฌ๋‹ค. 2003๋…„์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฌธ์ž์—ด ์ „์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์กฐ๊ฑด์ด๋‹ค. ORDER BY๋Š” productCode๋กœ ์คฌ๋‹ค. ์ œํ’ˆ ์ฝ”๋“œ ๋ณ„๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ •๋ ฌ๋œ ๊ฒŒ ๋ณด์ธ๋‹ค. (์‹œ๊ธฐ๋‚˜ ๊ณ ๊ฐ ์ง‘๋‹จ์˜ ์ฐจ์ด์— ๋”ฐ๋ผ ์ตœ์ข… ํŒ๋งค๊ฐ€๋Š” ์˜ค๋ฅด๋‚ด๋ฆฌ๋Š” ๊ฒŒ ๋ณด์ธ๋‹ค.) ์—ฌ๊ธฐ๋‹ค ์ƒํ’ˆ๋ณ„ ์—ฐ๋งค์ถœ์•ก์„ ๋ฝ‘๊ณ  ์ •๋ ฌํ•ด ์ฃผ๋ฉด ์˜ˆ์˜๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

 

SELECT productCode
, ROUND(AVG(priceEach), 2) AS avg_priceEach
    , SUM(quantityOrdered) AS sum_quantity
    , (ROUND(AVG(priceEach), 2) * SUM(quantityOrdered)) AS year_sales
FROM orderdetails odd, orders ods
WHERE odd.orderNumber = ods.orderNumber
AND orderDate LIKE '2003%'
GROUP BY productCode
ORDER BY year_sales DESC;

 

 

 

 

ํ›จ์”ฌ ๋ณด๊ธฐ ํŽธํ•ด์กŒ๋‹ค. ์—ฌ๊ธฐ์„œ ๋“ค ์ˆ˜ ์žˆ๋Š” ์˜๋ฌธ์„ ํ•ด์†Œํ•˜๊ณ  ๊ฐˆ๊นŒ. ์™œ priceEach๋Š” ํ‰๊ท ์„ ๊ตฌํ•˜๊ณ  quantity๋Š” ํ•ฉ๊ณ„ ๊ฐ’์„ ๊ตฌํ•˜๋Š”๊ฐ€๊ฐ€ ๊ถ๊ธˆํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๊ฑด priceEach๊ฐ€ ๊ตฌ๋งค์•ก(๊ฐœ๋‹น ๋‹จ๊ฐ€*์ˆ˜๋Ÿ‰)์ด ์•„๋‹ˆ๋ผ ๊ฐœ๋‹น ๋‹จ๊ฐ€์—ฌ์„œ ๊ทธ๋ ‡๋‹ค. ํ•ด๋‹น ํšŒ์‚ฌ์˜ ๊ฒฝ์šฐ ๋„๋งค๋กœ๋งŒ ๊ฑฐ๋ž˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ œํ’ˆ ๊ฐ€๊ฒฉ์ด ๊ณ ์ •๋˜์–ด ์žˆ์ง€ ์•Š๊ณ  ํ˜‘์˜ ์—ฌ๋ถ€์™€ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์œ ๋™์ ์œผ๋กœ ๋‹จ๊ฐ€๊ฐ€ ์กฐ์ •๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์—ฐ๋งค์ถœ, year_sales๋ฅผ ๋ฝ‘๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด ๊ฐœ๋‹น ์‹คํŒ๋งค๊ฐ€์˜ ํ‰๊ท ๊ณผ ํŒ๋งค ๊ฐœ์ˆ˜๋ฅผ ๊ณฑํ•ด์•ผ๋งŒ ํ–ˆ๋‹ค.

 

 

CASE WHEN: ์ƒํ’ˆ ์„ธ๋ถ„ํ™”ํ•ด์„œ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ํ”„๋กœ๋ชจ์…˜ ์ „๋žต ์งœ๊ธฐ

 

๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ, ๋งค์ถœ 1์œ„ ์ƒํ’ˆ๊ณผ 2์œ„ ์ƒํ’ˆ์˜ ํŽธ์ฐจ๊ฐ€ ํฌ๋‹ค. ์ญ‰ ๋‚ด๋ ค๋ณด๋ฉด ๋ง‰์ˆœ์œ„ ์ƒํ’ˆ์€ 1๋งŒ ๋‹ฌ๋Ÿฌ ์ •๋„๋กœ 1์œ„์™€ ๊ฑฐ์˜ 10๋ฐฐ ๊ฐ€๋Ÿ‰ ๋งค์ถœ ์ฐจ์ด๊ฐ€ ๋‚˜๋Š”๋ฐ ์ƒ์œ„๊ถŒ ์ƒํ’ˆ ๋Œ€๋น„ํ•ด์„œ ์ œํ’ˆ ๋‹จ๊ฐ€๋„ ๋‚ฎ๊ณ  ํŒ๋งค ์ˆ˜๋Ÿ‰ ์ข€ ๋ถ€์ง„ํ•˜๋‹ค. ์ „๋ฐ˜์ ์œผ๋กœ ๋ณด๋ฉด ๊ทธ๋ฃน๋ณ„๋กœ ๋‚˜๋ˆ ์„œ ๊ด€๋ฆฌํ•ด์ค˜์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. 

 

SELECT productCode
, ROUND(AVG(priceEach), 2) AS avg_priceEach
    , SUM(quantityOrdered) AS sum_quantity
    , (ROUND(AVG(priceEach), 2) * SUM(quantityOrdered)) AS year_sales
    , ROW_NUMBER () 
OVER (
ORDER BY (ROUND(AVG(priceEach), 2) * SUM(quantityOrdered)) DESC
            ) AS sales_rank
FROM orderdetails odd, orders ods
WHERE odd.orderNumber = ods.orderNumber
AND orderDate LIKE '2003%'
GROUP BY productCode
ORDER BY year_sales DESC;

 

 

 

 

year_sales๋ฅผ ์กฐ๊ธˆ ๋” ์ง๊ด€์ ์œผ๋กœ ๋ณด๊ณ , ์ฐจํ›„์— ๋‹ค๋ฅธ ๋…„๋„๋ณ„ ์„ธ๋ถ„ํ™” ์ง„ํ–‰ ์‹œ์—๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋„๋ก ์ˆœ์œ„๋ฅผ ๋จผ์ € ๋ฝ‘์•˜๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒํ’ˆ์„ 'high', 'medium', 'low' ์„ธ ๊ฐ€์ง€ ์ง‘๋‹จ์œผ๋กœ ๋‚˜๋ˆ ๋ณผ ๊ฒƒ์ด๋‹ค. 'high'๋Š” ๋งค์ถœ ์ƒ์œ„๊ถŒ์œผ๋กœ ์žฌ๊ณ ๋ฅผ ์ง€์† ๊ด€๋ฆฌํ•ด์ค˜์•ผ ํ•˜๋ฉฐ ํŒ๋งค ๋™ํ–ฅ์„ ์ง€์†์ ์œผ๋กœ ์ฒดํฌํ•ด์•ผ ํ•  ์ƒ์œ„ ์‹ญ ํผ์„ผํŠธ, ๋ฐ˜๋Œ€๋กœ 'low'๋Š” ์žฌ๊ณ ๊ฐ€ ๊ณผ๋‹คํ•˜๋‹ค๋ฉด ์ตœ์šฐ์„ ์œผ๋กœ ์†Œ์ง„ํ•˜๊ณ  ์žฌ๊ณ ๋ฅผ ๊ฐ์ถ• ์šด์˜ํ•ด์•ผ ํ•  ํ•˜์œ„ ์‹ญ ํผ์„ผํŠธ๋‹ค.

 

ํผ์„ผํŠธ๋ฅผ ์ง์ ‘ ์ง‘๊ณ„ํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์งœ๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ ์„œ์นญ ์‹ค๋ ฅ์ด ๋ถ€์กฑํ–ˆ๋˜ ๊ฑด์ง€ ๊ฒฐ๊ตญ ๋ชป ์ฐพ์•„์„œ, ์ „์ฒด ๋ฆฌ์ŠคํŠธ๋ฅผ 10์œผ๋กœ ๋‚˜๋ˆ ์„œ ์œ„ ์•„๋ž˜๋กœ 11์œ„์”ฉ ๋นผ ์คฌ๋‹ค(...)

 

 

์ž‘ํ’ˆ๋ช… ๋ฏธ์Šคํ„ฐ ์•„๋‚ ๋กœ๊ทธ......

 

 

SELECT productCode
, ROUND(AVG(priceEach), 2) AS avg_priceEach
    , SUM(quantityOrdered) AS sum_quantity
    , (ROUND(AVG(priceEach), 2) * SUM(quantityOrdered)) AS year_sales
    , ROW_NUMBER () 
OVER (
ORDER BY (ROUND(AVG(priceEach), 2) * SUM(quantityOrdered)) DESC
            ) AS sales_rank
CASE 
WHEN ROW_NUMBER () 
OVER (
ORDER BY (ROUND(AVG(priceEach), 2) * SUM(quantityOrdered)) DESC
            ) BETWEEN 1 AND 11 THEN 'high'
WHEN ROW_NUMBER () 
OVER (
ORDER BY (ROUND(AVG(priceEach), 2) * SUM(quantityOrdered)) DESC
            ) BETWEEN 98 AND 109 THEN 'low'
ELSE 'medium'
END AS sales_seg
FROM orderdetails odd, orders ods
WHERE odd.orderNumber = ods.orderNumber
AND orderDate LIKE '2003%'
GROUP BY productCode;

 

 

 

 

 

๊ฒฐ๊ณผ์ ์œผ๋ก  ์ž˜ ๋‚˜์™”๋‹ค! ๊ฐ€๋…์„ฑ ์œ„ํ•ด BETWEEN์œผ๋กœ ๊ฐ’์„ ์ง€์ •ํ•ด ์คฌ๋Š”๋ฐ ์—ฐ์‚ฐ๋ถ€ํ˜ธ๋กœ ์žก์•„ ์ค˜๋„ ๋ฌด๋ฐฉํ•˜๊ฒ ๋‹ค. ๊ตณ์ด ์ˆœ์œ„๋ฅผ ์ง‘๊ณ„ํ•œ ๊นŒ๋‹ญ์€ ์ดํ›„์— ์ผ์ผ์ด ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†์–ด์„œ๋‹ค. year_sales๋ฅผ ์กฐ๊ฑด์œผ๋กœ ์žก๋‹ค ๋ณด๋‹ˆ ๋งŽ์ด ๊ธธ์–ด์กŒ๋Š”๋ฐ, ๋” ํšจ์œจ ์ข‹๊ฒŒ ์งค ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๋ถ„๋ช… ์žˆ์ง€ ์•Š๋‚˜ ์‹ถ๋‹ค. ์ฐจํ›„ ์•Œ๊ฒŒ ๋˜๋ฉด ์™€์„œ ๋ง๋ถ™์—ฌ ๋ณด๊ฒ ๋‹ค.

 

CASE WHEN์„ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•  ์ ์ด ๋ช‡ ๊ฐ€์ง€ ์žˆ๋‹ค. 1) ์ƒ์œ„ ์กฐ๊ฑด์ด ์šฐ์„ ์ˆœ์œ„๋กœ ์žกํ˜€ ์žˆ์–ด์„œ ์šฐ์„ ์ˆœ์œ„ ์„ค์ • ์‹œ ๊ฒน์น˜์ง€ ์•Š๊ฒŒ ๋„ฃ์–ด ์ค˜์•ผ ํ•œ๋‹ค๋Š” ๊ฑฐ. ๋งŒ์•ฝ์— ์œ„ ์ฟผ๋ฆฌ๋ฅผ ์—ฐ์‚ฐ๊ธฐํ˜ธ๋กœ ์กฐ๊ฑด์„ ๊ฒน์น  ์ˆ˜ ์žˆ๊ฒŒ ์žก์•„ ๋’€๋‹ค๋ฉด ๋จผ์ € ์„ ์–ธ๋œ ํ•œ ๊ฐ€์ง€ ์ง‘๋‹จ์— ๊ฐ’๋“ค์ด ๋‹ค ๋ชฐ๋ ค ๋ฒ„๋ฆฌ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ํ•ด๋‹น ๋ฌธ๋ฒ•์€ ํ•œ ๋ฒˆ ํฌํ•จ๋œ ์ดํ›„์˜ ๋งŒ์กฑ ์กฐ๊ฑด์„ ๋ฌด์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 2) ELSE๋ฅผ ๋„ฃ์ง€ ์•Š์•„๋„ ๋™์ž‘ํ•˜์ง€๋งŒ ์ง€์ •ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ์„ธ๋ถ„ํ™”๋˜์ง€ ์•Š๋Š” ๋กœ์šฐ๋Š” ์ „๋ถ€ ๋‹ค NULL ๊ฐ’์ด ๋“ค์–ด๊ฐ„๋‹ค๋Š” ๊ฑฐ๋‹ค. ํ•ด๋‹น ๋‘ ๊ฐ€์ง€๋ฅผ ์ฃผ์˜ํ•ด์„œ ์งœ ์ฃผ์ž.

 

 

 

 

 

 

 

 

์ฐธ๊ณ 

suy379๋‹˜ ํ‹ฐ์Šคํ† ๋ฆฌ

mySQL ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

๋”๋ณด๊ธฐ
TOOLS/SQL

 

 

 

๋ถ„์„ ํˆด์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฝ‘๋‹ค ๋ณด๋ฉด ๊ฐ€๋” ๋‹นํ™ฉ์Šค๋Ÿฌ์šธ ๋•Œ๊ฐ€ ์žˆ๋‹ค. ๊ณ ์œ  ๋ฒˆํ˜ธ๊นŒ์ง€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ๋‚˜์˜ค๋Š” ๊ฑฐ๋‹ค. ์ด์œ ๊ฐ€ ์–ด๋–ป๋“ (์šฐ๋ฆฌ๊ฐ€ ๋ณ€๋ณ„๋ ฅ ์—†๋Š” ์กฐ๊ฑด์„ ์„ค์ •ํ–ˆ๋“ , ๋ง ๊ทธ๋Œ€๋กœ ์ปดํ“จํ„ฐ๊ฐ€ ์‹ค์ˆ˜๋ฅผ ํ–ˆ๋“ ) ๊ฐ„์— ์ด ๊ฐ’๋“ค์€ ๊ฑธ๋Ÿฌ์ ธ์•ผ ํ•˜๊ณ  ๋ฐ˜๋Œ€๋กœ ์ˆ˜์ง‘ ํ”„๋กœ์„ธ์Šค ์ž์ฒด์˜ ๋ณด์ˆ˜๋ฅผ ์œ„ํ•ด ์ง‘๊ณ„๋˜๊ธฐ๋„ ํ•ด์•ผ ํ•œ๋‹ค.

 

 

์•„๋ž˜ order_list๋Š” ๊ฐ€์ƒ์˜ ๋ธŒ๋žœ๋“œ์˜ ์ฃผ๋ฌธ ์ •๋ณด ์ˆ˜์ง‘ ๋‚ด์—ญ์ด๋‹ค. ์ด ์ค‘ ์ฃผ๋ฌธ๋ฒˆํ˜ธ 10251์€ ๋‘ ๋ฒˆ ๋‚˜์˜ค๋Š”๋ฐ ๋ณด๋‹ค์‹œํ”ผ ๊ณ ๊ฐID๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ์ •๋ณด๊ฐ’์ด ๋™์ผํ•˜๋‹ค. ๊ธฐ์žฌํ•˜์ง„ ์•Š์•˜์ง€๋งŒ ์ˆ˜์ง‘๋œ ์‹œ๊ฐ„๊นŒ์ง€. ์˜ค๋Š˜์€ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ค‘๋ณต ๊ฐ’ ์ œ๊ฑฐ/ ์ง‘๊ณ„ ๊ด€๋ จํ•œ ์ฟผ๋ฆฌ ์ž‘์—…์„ ์ง„ํ–‰ํ•ด๋ณด๊ฒ ๋‹ค.

 

 

order_list

์ฃผ๋ฌธ๋ฒˆํ˜ธ ๊ณ ๊ฐID ์ฃผ๋ฌธ์ผ์ž ๋ฐฐ์†กID
10248 90 2024-01-03 3
10249 81 2024-01-04 1
10250 34 2024-01-08 2
10251 84 2024-01-08 1
10251 84 2024-01-08 1
10252 76 2024-01-09 2
... ... ... ...
10443 66 2024-02-06 1

 

* learnsql ํฌ์ŠคํŠธ๋ฅผ ๋ฒˆ์—ญํ•ด ๊ณต์œ ํ•œ ๊ฒƒ.

 

 

 

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

 

 

SELECT ์ฃผ๋ฌธ๋ฒˆํ˜ธ

               , COUNT(์ฃผ๋ฌธ๋ฒˆํ˜ธ) AS ์ค‘๋ณต์ฒดํฌ FROM order_list
GROUP BY ์ฃผ๋ฌธ๋ฒˆํ˜ธ
HAVING COUNT(์ฃผ๋ฌธ๋ฒˆํ˜ธ);

 

 

order_list

์ฃผ๋ฌธ๋ฒˆํ˜ธ ์ค‘๋ณต์ฒดํฌ
10248 1
10249 1
10250 1
10251 2
10252 1

 

 

 

์ฃผ๋ฌธ๋ฒˆํ˜ธ์˜ ์ค‘๋ณต์ด ์žกํžŒ 10251 ๋ง๊ณ ๋Š” ์ „์ฒด๊ฐ€ 1๋กœ ์ฒดํฌ๋˜๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด, ์—ฌ๊ธฐ์„œ ์ง‘๊ณ„ ๊ธฐ์ค€์„ '1๋ณด๋‹ค ํฐ ๊ฐ’'์œผ๋กœ ๋ฐ”๊ฟ” ์ค€๋‹ค๋ฉด ์ค‘๋ณต ๊ฐ’๋งŒ ์ฃฝ ์ถœ๋ ฅํ•ด ๋ฆฌ์ŠคํŠธ๋กœ ์–ป์„ ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

 

 

SELECT ์ฃผ๋ฌธ๋ฒˆํ˜ธ

               , COUNT(์ฃผ๋ฌธ๋ฒˆํ˜ธ) AS ์ค‘๋ณต์ฒดํฌ FROM order_list
GROUP BY ์ฃผ๋ฌธ๋ฒˆํ˜ธ
HAVING COUNT(์ฃผ๋ฌธ๋ฒˆํ˜ธ) > 1;

 

 

์ฃผ๋ฌธ๋ฒˆํ˜ธ ์ค‘๋ณต์ฒดํฌ
10251 2

 

 

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

 

 

SELECT ์ฃผ๋ฌธ๋ฒˆํ˜ธ, ๊ณ ๊ฐID, ์ฃผ๋ฌธ์ผ์ž, ๋ฐฐ์†กID

               , COUNT(์ฃผ๋ฌธ๋ฒˆํ˜ธ) AS ์ค‘๋ณต์ฒดํฌ FROM order_list
GROUP BY ์ฃผ๋ฌธ๋ฒˆํ˜ธ, ๊ณ ๊ฐID, ์ฃผ๋ฌธ์ผ์ž, ๋ฐฐ์†กID
HAVING COUNT(์ฃผ๋ฌธ๋ฒˆํ˜ธ) > 1;

 

 

์ฃผ๋ฌธ๋ฒˆํ˜ธ ๊ณ ๊ฐID ์ฃผ๋ฌธ์ผ์ž ๋ฐฐ์†กID
10251 84 2024-01-08 1

 

 

 

 

 

 

์ฐธ๊ณ 

learnsql ํ™ˆํŽ˜์ด์ง€

๋”๋ณด๊ธฐ
TOOLS/SQL