๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์„ค๊ณ„

[๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์„ค๊ณ„] 3-7 having์ ˆ, ์ค‘์ฒฉ ์งˆ์˜๋ฌธ

by ์ ผ์ ผ39 2024. 11. 26.
having์ ˆ Having ์ ˆ + ์กฐ๊ฑด => group by๊ฐ€ ์žˆ์„ ๋•Œ, ๊ทธ๋ฃน๋“ค ์ค‘ ์„ ํƒํ•  ๋•Œ ์‚ฌ์šฉ. ์ง‘๊ณ„ํ•จ์ˆ˜ ๋งŽ์ด ์”€
 
-      having ์ ˆ์— ์ง‘๊ณ„ํ•จ์ˆ˜ ๋“ค์–ด๊ฐ€๋Š” ์ผ์ด ๋งŽ๋‹ค
-      group by๊ฐ€ ์žˆ์„ ๋•Œ, ๊ทธ๋ฃน๋“ค ์ค‘ ์„ ํƒํ•  ๋•Œ having ์ ˆ์„ ์‚ฌ์šฉ
-      where ์ ˆ์€ ๊ทธ๋ฃน ํ˜•์„ฑ ์ „์— ์‹คํ–‰๋˜๊ณ , having ์ ˆ์€ ๊ทธ๋ฃน ๊ตฌ์„ฑ ํ›„์— ์ ์šฉ๋จ
-      having ์ ˆ์€ select ์ „์— ์‹คํ–‰๋˜์–ด์„œ, select์—์„œ ๊ณ ๋ฅด์ง€ ์•Š์€ ์ปฌ๋Ÿผ์„ ์กฐ๊ฑด์œผ๋กœ ์จ๋„ ๋จ
 

Q) find the names and average salaries of all departments whose average salary is greater than 42000
=> select dept_name, avg(salary) as avg_salary
    from instructor
    where TRUE                // ์—ฌ๊ธฐ์„œ 42000 ๋น„๊ตํ•˜๋Š” ๊ฑฐ ์•„๋‹˜!! ๊ทธ๋ฃน๋‹จ์œ„๋ผ having์—์„œ ํ•จ
    group by dept_name
    having avg(salary) > 42000;    // ์—ฌ๊ธฐ์„œ ์กฐ๊ฑด ๋งŒ์กฑํ•˜๋Š” ๊ทธ๋ฃน ์„ ํƒํ•จ
์ค‘์ฒฉ ์งˆ์˜๋ฌธ ์ค‘์ฒฉ ์งˆ์˜๋ฌธ Nested Subqueries = ๋‹ค๋ฅธ ์ฟผ๋ฆฌ ๋‚ด์— ์ค‘์ฒฉ๋˜๋Š” select-from-where ๋ฌธ
select -> ํฌํ•จ์‹œํ‚ฌ ์ปฌ๋Ÿผ๋“ค ์—ด๊ฑฐ์‹œ ์ผ๋ถ€ ์ปฌ๋Ÿผ์„ ์ปฌ๋Ÿผ๋ช… ๋Œ€์‹  SFW ์„œ๋ธŒ์ฟผ๋ฆฌ๋กœ ๋Œ€์ฒด(๋‹จ์ผ๊ฐ’ ๋‚ด๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ)
from    -> ํ…Œ์ด๋ธ” ์—ด๊ฑฐ๊ทธ ํ…Œ์ด๋ธ” ์ค‘ ํ•˜๋‚˜๊ฐ€ SFW์˜ ์„œ๋ธŒ์ฟผ๋ฆฌ(๊ฒฐ๊ณผ๋Š” relation)๋กœ ๋Œ€์ฒด๋˜๋Š” ๊ฒฝ์šฐ
where -> ์กฐ๊ฑด์„ ์ฃผ๋Š”๋ฐ ๊ทธ ์กฐ๊ฑด ์ž์ฒด๊ฐ€ ๊ทธ ์†์— SFW๋ฅผ ํฌํ•จํ•˜๋Š”์ปฌ๋Ÿผ <๋ช‡๊ฐ€์ง€ ์—ฐ์‚ฐ> (SFW ์„œ๋ธŒ์ฟผ๋ฆฌ)
 
๋ฐ”๊นฅ์ชฝ SFW = outer query
์•ˆ์ชฝ SFW = sub query, inner query

 

  select *
from R
where A = 5 and B < 100
select *
from R
where A in ( select A
                    from S
                    where B = 20 )
  select *
from R
where P
select *
from R
where P

 

Outer ์งˆ์˜ ์ชฝ์˜ ํˆฌํ”Œ์˜ ์ปฌ๋Ÿผ๊ฐ’์ด ํˆฌ์ž…๋˜์–ด ์‹คํ–‰๋œ๋‹ค๋ฉด co-related

  select *
from R
where A in ( select A
            from S
            where B = 20 )
select *
from R
where A in ( select A
                    from S
                    where B = R.B )