SELECT vend_id, COUNT(*) AS num_prods
FROM Products
GROUP BY vend_id;
-- GROUP BY 절에게 vend_id로 그룹핑하고 데이터를 정렬하라고 명령한다.
GROUP BY 절을 사용하면 자동으로 각 그룹에 대해 계산하기 때문에, 계산할 그룹을 따로 명시할 필요가 없다.
GROUP BY 절은 DBMS에게 먼저 데이터를 그룹핑한 후, 각각의 그룹에 대해 계산하라고 지시한다.
WHERE 절의 모든 유형은 HAVING 절에서도 사용이 가능하다.
차이점은 WHERE 절은 행을 필터링하고, HAVING 절은 그룹을 필터링한다.
WHERE 절은 데이터가 그룹핑되기 전에 필터링하고, HAVING 절은 데이터가 그룹핑된 후에 필터링한다.
GROUP BY 절이 있을 때만 HAVING 절을 사용하고, 행 단위로 필터링 할때는 WHERE 절을 사용하자!
SELECT cust_id, COUNT(*) AS orders
FROM Orders
GROUP BY cust_id
HAVING COUNT(*) >= 2;
-- Products 테이블에서 가격이 4달러 이상인 제품을 2개이상 가진 판매처를 가져와라
SELECT vend_id, COUNT(*) AS num_prods
FROM Products
WHERE prod_price >= 4
GROUP BY vend_id
HAVING count(*) >= 2;
ORDER BY | GROUP BY |
---|---|
결과를 정렬한다. | 행을 그룹핑한다. 결과는 그룹 순서대로 출력되지 않을 수 있다. |
가져오지 않은 열이라도 사용할 수 있다. | 선택된 열이나 수식만 사용할 수 있고, 선택된 열이나 수식을 꼭 사용해야 한다. |
필수 항목은 아니다. | 그룹 함수와 함께 사용하는 열(또는 수식)이 있는 경우 필수 항목이다. |
GROUP BY 절을 사용할 때마다 ORDER BY 절을 명시해야 한다.
그렇게 해야 데이터가 제대로 정렬되었다고 확신할 수 있다.
-- Orderitems 테이블에서 세 개 이상의 제품을 주문한 경우의 주문 번호와 주문 수량을 항목 수로 정렬하여 가져와라.
SELECT order_num, COUNT(*) AS items
FROM Orderitems
GROUP BY order_num
HAVING COUNT(*) >= 3
ORDER BY items, order_num;
✔️ SELECT문 순서
SELECT 가져올 열이나 순서
FROM 데이터를 가져올 테이블
WHERE 행 레벨 필터링
GROUP BY 그룹 지정
HAVING 그룹 레벨 필터링
ORDER BY 정렬 순서