[TIL] SQL/Subquery

HYERINยท2024๋…„ 2์›” 15์ผ

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
11/13
post-thumbnail

๐Ÿ“– ์ด๋ก 

๐Ÿ“Œ Subquery

ํ•˜๋‚˜์˜ SQL ๋ฌธ ์•ˆ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ SQL ๋ฌธ
(๋ฉ”์ธ์ฟผ๋ฆฌ๊ฐ€ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ํฌํ•จํ•˜๋Š” ์ข…์†์ ์ธ ๊ด€๊ณ„)

โ€ข ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ๋ฉ”์ธ์ฟผ๋ฆฌ์˜ ์นผ๋Ÿผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
โ€ข ๋ฉ”์ธ์ฟผ๋ฆฌ๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ์นผ๋Ÿผ ์‚ฌ์šฉ ๋ถˆ๊ฐ€

๐Ÿšซ ์ฃผ์˜์‚ฌํ•ญ

โ€ข ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด์„œ ์‚ฌ์šฉ
โ€ข ๋‹จ์ผ ํ–‰ ํ˜น์€ ๋ณต์ˆ˜ ํ–‰ ๋น„๊ต ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
โ€ข ์„œ๋ธŒ์ฟผ๋ฆฌ ์—์„œ๋Š” order by ์‚ฌ์šฉ๋ถˆ๊ฐ€

๐Ÿ“Œ subquery ์ข…๋ฅ˜

์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ (Scalar Subquery) - SELECT ์ ˆ์— ์‚ฌ์šฉ
์ธ๋ผ์ธ ๋ทฐ (Inline View) - FROM ์ ˆ์— ์‚ฌ์šฉ
์ค‘์ฒฉ ์„œ๋ธŒ์ฟผ๋ฆฌ (Nested Subquery) - WHERE ์ ˆ์— ์‚ฌ์šฉ

๐Ÿ“Œ Nested Subquery

Single Row - ํ•˜๋‚˜์˜ ์—ด์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ
Multiple Row - ํ•˜๋‚˜ ์ด์ƒ์˜ ์—ด์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ
Multiple Column - ํ•˜๋‚˜ ์ด์ƒ์˜ ํ–‰์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ


๐Ÿ’ป ์‹ค์Šต

SCALAR SUBQUERY ๋ฌธ๋ฒ•

select column1, (select column2 from table2 where condition)
from table1
where condition

๐Ÿšซ ๊ฒฐ๊ณผ๋Š” ํ•˜๋‚˜์˜ Column ์ด์–ด์•ผ ํ•จ

INLINE VIEW ๋ฌธ๋ฒ•

select a.column, b.column
from table1 a, (select column1, column2 from table2) b
where condition

๐Ÿšซ ๋ฉ”์ธ์ฟผ๋ฆฌ์—์„œ๋Š” ์ธ๋ผ์ธ ๋ทฐ์—์„œ ์กฐํšŒํ•œ Column ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅ

NESTED SUBQUERY ๋ฌธ๋ฒ•

- single row
//์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ๋น„๊ต์—ฐ์‚ฌ์ž์™€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ

select column_name from tablename
where column_name = (select column_name from tablename where condition)
order by column_name

๐Ÿšซ ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋Š” ํ•œ ๊ฐœ์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๊ฐ€์ ธ์•ผํ•จ (๋‘๊ฐœ ์ด์ƒ์ธ ๊ฒฝ์šฐ ์—๋Ÿฌ)
๐Ÿšซ ๊ด„ํ˜ธ ์—†์œผ๋ฉด ์—๋Ÿฌ ๋ฐœ์ƒ

-Multiple Row - IN
//์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ค‘์— ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ

select column_name from tablename
where column_name in (select column_name from tablename where condition)
order by column_name
`
-Multiple Row - EXISTS
//์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์— ๊ฐ’์ด ์žˆ์œผ๋ฉด ๋ฐ˜ํ™˜

select column_name from tablename
where exists (select column_name from tablename where condition)
order by column_name

-Multiple Row - ANY
//์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ค‘์— ์ตœ์†Œํ•œ ํ•˜๋‚˜๋ผ๋„ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ (๋น„๊ต์—ฐ์‚ฐ์ž ์‚ฌ์šฉ)

select column_name from tablename
where column_name = any (select column_name from tablename where condition)
order by column_name

-Multiple Row - ALL
//์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ(๋น„๊ต ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ)

select column_name from tablename
where column_name = all (select column_name from tablename where condition)
order by column_name
-Multi Column Subquery - ์—ฐ๊ด€ ์„œ๋ธŒ์ฟผ๋ฆฌ
//์„œ๋ธŒ์ฟผ๋ฆฌ ๋‚ด์— ๋ฉ”์ธ์ฟผ๋ฆฌ ์ปฌ๋Ÿผ์ด ๊ฐ™์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ

select column_name from tablename a
where (a.column1, a.column2, ...) (select b.column1, b.column2, ... from tablename b where a.column = b.column)
order by column_name

๐Ÿงธ review

  • ๊ณต๊ณต๋ฐ์ดํ„ฐ csv ํŒŒ์ผ๋กœ ์—ฐ์Šตํ•˜๊ธฐ
    5๋Œ€๋ฒ”์ฃ„ ๋ฐœ์ƒ ๊ฒ€๊ฑฐ ํ˜„ํ™ฉ
    5๋Œ€๋ฒ”์ฃ„ ๋ฐœ์ƒ ์žฅ์†Œ๋ณ„ ํ˜„ํ™ฉ

  • ์„œ์šธ์‹œ ์‚ด์ธ์ด ๊ฐ€์žฅ ๋งŽ์ด ๋ฐœ์ƒํ•œ ์žฅ์†Œ์™€ ์‚ด์ธ ๋ฐœ์ƒ ๊ฑด์ˆ˜ ์กฐํšŒ
select ANY_VALUE(์žฅ์†Œ) ์žฅ์†Œ, max(๋ฐœ์ƒ๊ฑด์ˆ˜) ๋ฐœ์ƒ๊ฑด์ˆ˜,
(select sum(๊ฑด์ˆ˜) from ์ง€์—ญ๋ณ„_5๋Œ€๋ฒ”์ฃ„ where ์ฃ„์ข…='์‚ด์ธ' and ๋ฐœ์ƒ๊ฒ€๊ฑฐ='๋ฐœ์ƒ') ์ด๋ฐœ์ƒ๊ฑด์ˆ˜
from ์žฅ์†Œ๋ณ„_5๋Œ€๋ฒ”์ฃ„ 
where ๋ฒ”์ฃ„๋ช…='์‚ด์ธ'

โ—๏ธsql_mode=only_full_group_by ์—๋Ÿฌ
group by ์ ˆ์— ํฌํ•จ๋˜์ง€ ์•Š๋Š” column ์„ select ํ•  ๊ฒฝ์šฐ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ

ํ•ด๊ฒฐ๋ฐฉ์•ˆ
ANY_VALUE(column)ํ•จ์ˆ˜ ์‚ฌ์šฉ

  • ์ง€์—ญ๋ณ„๋กœ ๊ฐ€์žฅ ๋งŽ์ด ๋ฐœ์ƒํ•œ ๋ฒ”์ฃ„ ๊ฑด์ˆ˜์™€ ๋ฒ”์ฃ„ ์œ ํ˜•์„ inline view ๋ฅผ ์กฐํšŒ
    (๋ฐœ์ƒ๊ฑด์ˆ˜๊ฐ€ ํฐ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ 5๊ฐœ ์กฐํšŒ)
select ์ง€์—ญ, ์ฃ„์ข… ์œ ํ˜•, ๊ฑด์ˆ˜ ๋ฐœ์ƒ๊ฑด์ˆ˜ 
from ์ง€์—ญ๋ณ„_5๋Œ€๋ฒ”์ฃ„ a,
(select ์ง€์—ญ ์ง€์—ญ๊ตฌ๋ถ„, max(๊ฑด์ˆ˜) ๋ฐœ์ƒ๊ฑด์ˆ˜ from ์ง€์—ญ๋ณ„_5๋Œ€๋ฒ”์ฃ„ where ๋ฐœ์ƒ๊ฒ€๊ฑฐ='๋ฐœ์ƒ' group by ์ง€์—ญ๊ตฌ๋ถ„) b 
where a.์ง€์—ญ = b.์ง€์—ญ๊ตฌ๋ถ„ and a.๊ฑด์ˆ˜=b.๋ฐœ์ƒ๊ฑด์ˆ˜
order by ๊ฑด์ˆ˜ desc
limit 5;
  • ๋ฐœ์ƒ ๊ฑด์ˆ˜๊ฐ€ ๊ฐ€์žฅ ํฐ ๋ฒ”์ฃ„ ์œ ํ˜•๊ณผ ์ง€์—ญ์„ nested subquery ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์กฐํšŒ
select ์ง€์—ญ, ์ฃ„์ข… ๋ฒ”์ฃ„์œ ํ˜• 
from ์ง€์—ญ๋ณ„_5๋Œ€๋ฒ”์ฃ„ 
where ๊ฑด์ˆ˜ in (select max(๊ฑด์ˆ˜) from ์ง€์—ญ๋ณ„_5๋Œ€๋ฒ”์ฃ„ where ๋ฐœ์ƒ๊ฒ€๊ฑฐ='๋ฐœ์ƒ');
  • ๋ฐœ์ƒ ๊ฑด์ˆ˜๊ฐ€ 2000 ์ด์ƒ์ธ ์ง€์—ญ๊ณผ ๋ฒ”์ฃ„์œ ํ˜•์„ ์ค‘๋ณต์—†์ด nested subquery ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์กฐํšŒ
select distinct(์ง€์—ญ),์ฃ„์ข… ๋ฒ”์ฃ„์œ ํ˜•
from ์ง€์—ญ๋ณ„_5๋Œ€๋ฒ”์ฃ„ a
where exists 
(select ์ง€์—ญ, ์ฃ„์ข… from ์ง€์—ญ๋ณ„_5๋Œ€๋ฒ”์ฃ„ b where a.์ง€์—ญ = b.์ง€์—ญ and ๋ฐœ์ƒ๊ฒ€๊ฑฐ='๋ฐœ์ƒ' and a.์ฃ„์ข…=b.์ฃ„์ข… and ๊ฑด์ˆ˜ >=2000);

์‹ค์Šตํ™•์ธ


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