HAVING* ( group by 결과물의 조건문 )
2019. 1. 30. 10:49
총정리
- HAVING은 GROUP BY 끝난 쿼리문에서 조건을 추가적으로 달 수 있다.
- HAVING은 1차 처리된 칼럼(COUNT()등)을 조건을 걸고 싶을 땐, alias사용이 안된다.
HAVING
-- 내장함수 & HAVING -- 내장함수의 종류 : -- COUNT(), SUM() -- 예제 ) 고객별 구매횟수 ( 횟수, 건수 : 해당 테이블의 id를 카운트 해버리면 된다) SELECT customers.first_name, customers.last_name, COUNT(purchases.id) FROM customers JOIN purchases ON customers.id = purchases.customer_id GROUP BY customers.id -- AVG() -- 예제 ) 아이템의 가격 평균 SELECT AVG(items.price) FROM items; -- 예제 ) 구매된(join으로 교집합) 아이템 가격의 평균 SELECT * FROM items INNER JOIN purchases ON items.id = purchases.item_id; SELECT AVG(items.price) FROM items INNER JOIN purchases ON items.id = purchases.item_id; -- 1) 구매된 아이템 중 가격 TOP 1 을 구하는 첫번째 : JOIN 구매된 아이템 -> ORDER BY -> LIMIT SELECT * FROM items INNER JOIN purchases ON items.id = purchases.item_id; SELECT items.name, items.price FROM items INNER JOIN purchases ON items.id = purchases.item_id SELECT items.name, items.price FROM items INNER JOIN purchases ON items.id = purchases.item_id ORDER BY items.price DESC LIMIT 1; -- 2) 구매된 아이템 가격 TOP 1을 구하는 두번째 : JOIN 구매된 아이템 -> MAX() ? -- : 집계테이블이 되어, 같은 테이블 내 칼럼선택(items.name)을 못함 -- 만약, 다른컬럼(items.name)도 같이보려고, 집계함수 앞에 SELECT 시 -- ~별 기준이 되어버려서, 각 items.name 별 최대값들이 여러 row로 나옴. SELECT MAX(items.price) FROM items INNER JOIN purchases ON items.id = purchases.item_id; -- 집계테이블로서 1개 칼럼밖에 못봄 SELECT items.name, MAX(items.price) FROM items INNER JOIN purchases ON items.id = purchases.item_id GROUP BY items.name;-- 하나더보려고 select + groupby에 넣으면 기준테이블이 되어 각 아이템별로 최대값이 되어버림 -- 3) HAVING = GROUP BY + 집계함수 결과에 filter링 (집계함수의 WHERE절) -- (1) 고객별 구매횟수를 위에서 작성했떤 것 복사해오자. SELECT customers.first_name, customers.last_name, COUNT(purchases.id) FROM customers JOIN purchases ON customers.id = purchases.customer_id GROUP BY customers.id -- (2) GROUPBY + 집계함수의 결과에서 HAVING을 이용하여 다시 3개이상의 구매자만 걸러내보자. -- *** 이때, 집계한칼럼의 alias로는 HAVING에서 조건을 걸 수 없다. -- *** 1차 작업물이 SELECT 문에 있을시 -> 이후 사용은 그 문장 그대로! SELECT customers.first_name, customers.last_name, COUNT(purchases.id) AS purchase_count FROM customers JOIN purchases ON customers.id = purchases.customer_id GROUP BY customers.id HAVING purchase_count > 2; -- alias 사용시 오류 SELECT customers.first_name, customers.last_name, COUNT(purchases.id) AS purchase_count FROM customers JOIN purchases ON customers.id = purchases.customer_id GROUP BY customers.id HAVING COUNT(purchases.id) > 2; -- 4) 다음에 같은작업(고객별 구매횟수가 가장 많은 사람 뽑기)할일이 있다면, VIEW로 만들어보자.
'한의대 생활 > └ PostgreSQL' 카테고리의 다른 글
ENUM* (순서를 가진 문자열범주 - ordinal) and NESTED SELECT*(집계결과는 따로받아, 해당테이블 SELECT 칼럼연산 or WHERE조건으로 사용) (0) | 2019.01.31 |
---|---|
DATE - timestamp (0) | 2019.01.31 |
DROP * ( with CASCADE ) and VIEW* ( with LOCAL / CASECADE CHECK OPTION ) (0) | 2019.01.30 |
SEQUENCE* ( autoincrement대체 ) and INDEX* ( WHERE서치를 문자열에서 빠르게 내부binary파일생성) (0) | 2019.01.30 |
CREAT TABLE*(primary key, references) and INSERT INTO (0) | 2019.01.29 |