Notice
Recent Posts
Recent Comments
관리 메뉴

Developer Gonie

[6주차] 20. having 사용법(조건으로 그룹함수를 필요로 하는 경우)*** 본문

K-DigitalTraining 강의/2. Oracle + PLSQL

[6주차] 20. having 사용법(조건으로 그룹함수를 필요로 하는 경우)***

이대곤 2022. 6. 15. 09:32

* where, having 모두 조건을 걸어 필터링 하기위해 사용되는데, 그룹함수는 having 조건에서만 사용이 가능하기 때문에
   그룹함수의 사용이 필요한 경우 having 절을 사용하면 된다. 그리고 having 은 where 절의 기능을 포함하고 있기 때문에 

   where 에 있는 조건들을 가져와서 having에서 그대로 사용해도 똑같이 정상적인 결과가 나오는 것을 알 수 있기도 하다.

having을 사용해야 하는 경우(간단예시)

select publisher, avg(price) 
from book where avg(price) > 2000 
group by publisher

1행에 오류:
ORA-00934: 그룹 함수는 허가되지 않습니다
-- 출판사별 price 평균을 구한 뒤에 나온 결과에서 그 price 평균이 2000 이상인 라인만 추출하는 것
select publisher, avg(price)
from book
group by publisher
having avg(price) > 2000;

(실전1) having이 필요한 경우

Q. 출판사별 판매중인 price 평균을 구하고, 전체 평균보다 높은 출판사와 그 출판사의 price 평균을 가져오시오.

--1. publisher별 판매중인 책의 가격 평균
select publisher, avg(price)
from book
group by publisher;

PUBLISHER                                AVG(PRICE)
---------------------------------------- ----------
문학동네                                 2333.33333
문학과 지성                                    2000
창작과 비평                                    1500

--2. price 필드값 전체의 평균
select avg(price) from book;

AVG(PRICE)
----------
      2000
      
--3. "1. + 2." 출판사별 판매중인 price 평균을 구하고 전체 평균보다 높은 출판사와 그 출판사의 price 평균을 가져온 것.
select publisher, avg(price)
from book
group by publisher
having avg(price) > (select avg(price) from book);

PUBLISHER                                AVG(PRICE)
---------------------------------------- ----------
문학동네                                 2333.33333

(실전2) where + having이 필요한 경우

Q. 90년대에 출판된 도서에 한해서 출판사별 모든 책의 price의 평균을 구하고,
     그 중에서 모든 책의 price 평균 보다 같거나 높은 출판사와 그 출판사의 가격평균을 가져오시오. 

--90년대에 출판된 도서에 한해서 출판사별 모든 책의 price의 평균을 구하고
  그 중에서 모든 책의 price 평균 보다 같거나 높은 출판사와 그 출판사의 가격평균 조회하기
  
select publisher, avg(price)
from book 
where day like '9%'
group by publisher
having avg(price) >= (select avg(price) from book);

주의, Having이 필요한거 같지만 그렇지 않은 경우

* 아래의 문제를 해결하고자 할 때 having price >= avg(price) 을 쓰려고 했으나,

   group by 를 사용하지 않은 상태에서는 having 의 사용이 불가했다.
   따라서 다음과 같이 해결해야 한다.

-- 전체 가격 평균이상인 레코드의 수는?
select count(*)
from albums
where price >= (select avg(price) from albums); -- 가격평균은 숫자 평균으로 치환된다.

 

Comments