기록
database - 서브쿼리와 뷰 본문
앞 포스팅에서 뷰라는 편리한 도구에 대해 배웠다.
이번 포스팅에서 배우는 '서브쿼리'는 이 뷰를 기반으로 하는 기술이다.
서브쿼리의 특징을 한마디로 정리하면 '일회용 뷰'다.
뷰란 데이터를 저장하는 것이 아니라 데이터를 추출하는 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);
스칼라 서브쿼리를 사용할 때, 서브쿼리가 복수행을 반환하면 에러가 발생함으로 주의하자.
'[Study] > Database' 카테고리의 다른 글
database - 다양한 함수 (산술함수, 문자열함수) (0) | 2019.07.30 |
---|---|
database - 상관 서브쿼리 (0) | 2019.07.29 |
database - 뷰(View) (0) | 2019.07.28 |
database - 트랜잭션의 ACID 특성 (0) | 2019.07.28 |
database - 트랜잭션의 정의와 구문 (0) | 2019.07.28 |