기록

database - 서브쿼리와 뷰 본문

[Study]/Database

database - 서브쿼리와 뷰

Dannnnnn 2019. 7. 29. 21:48
반응형

앞 포스팅에서 뷰라는 편리한 도구에 대해 배웠다.

이번 포스팅에서 배우는 '서브쿼리'는 이 뷰를 기반으로 하는 기술이다.

서브쿼리의 특징을 한마디로 정리하면 '일회용 뷰'다.

 

뷰란 데이터를 저장하는 것이 아니라 데이터를 추출하는 SELECT문을 저장하는 방법이였다.

반면, 서브쿼리는 뷰 정의 SELECT문을 그대로 FROM구에 삽입한 것이다.

 

SELECT goods_classify, cnt_goods
FROM (SELECT goods_classify, COUNT(*) AS cnt_goods -- 뷰 정의 SELECT문을 그대로 기술 
FROM Goods
GROUP BY goods_classify) AS GoodsSum;

 

이처럼 뷰 정의 SELECT문을 그대로 FROM구에 삽입한 것이 서브쿼리다.

AS GoodsSum이 해당 서브쿼리에 붙여진 이름이지만, 일회용으로 뷰처럼 기억장치에 저장되지 않고 실행 후에 사라진다. 여기서 AS는 생략 가능함.

 

<스칼라 서브쿼리>

스칼라란, '단일'이라는 의미이다.

앞의 서브쿼리는 기본적으로 복수 행을 결과로 반환한다.

스칼라 서브쿼리는 반드시 1행 1열만을 반환한다는 제약을 가진 서브쿼리이다.

('10'이나 '서울'처럼 하나의 값을 의미)

 

'판매단가가 전체 평균 판매단가보다 높은 상품만을 검색한다.'

-> 이것은 일반적인 방법으로 해결할 수 없다. 집약함수 AVG를 WHERE절에 쓸 수 없는 제약 때문이다.

 

--평균 판매단가를 구하는 스칼라 서브쿼리

SELECT AVG(sell_price) FROM Goods; -- 2097.5 라는 단일 값 반환

 

--판매단가가 전체 평균 판매단가보다 높은 상품만을 검색하는 쿼리

SELECT goods_id, goods_name, sell_price
FROM Goods
WHERE sell_price > (SELECT AVG(sell_price) FROM Goods);

 

-- 상품분류별로 계산한 평균 판매단가가 상품 전체 평균 판매단가보다 높은 상품분류를 선택하는 쿼리

SELECT goods_classify, AVG(sell_price)
FROM Goods
GROUP BY goods_classify
HAVING AVG(sell_price) > (SELECT AVG(sell_price) FROM Goods);

 

스칼라 서브쿼리를 사용할 때, 서브쿼리가 복수행을 반환하면 에러가 발생함으로 주의하자.

반응형