DATABASE(MY SQL)

(My SQL) GROUP BY/HAVING

서윤-정 2023. 9. 26. 15:50

❤ GROUP BY

데이터를 그룹화하고 그룹 단위로 집계 함수를 사용하여 데이터를 요약하는 데 사용된다.

데이터베이스에서 많은 레코드를 가진 테이블에서 유용하다.

GROUP BY를 사용하면 특정 열의 값에 따라 데이터를 그룹화하고,

그룹 내에서 SUM, COUNT, AVG 등과 같은 집계함수를 사용하여 그룹 내 데이터를 분석할 수 있다.

 

SELECT column1, aggregate_function(column2)
FROM table_name
GROUP_BY column1;

• column1: 데이터를 그룹화하려는 열을 나타낸다.

aggregate_function(column2): 그룹 내에서 적용할 집계 함수를 나타낸다. 

이것은 SUM, COUNT, AVG 등이 될 수 있다.

table_name: 데이터를 추출하려는 테이블의 이름을 나타낸다.

 

 

예를 들어, 주문 테이블에서 각 고객별로 주문한 총 금액을 구하려면 다음과 같은 sql 쿼리를 사용할 수 있다.

SELECT customer_id, SUM(order_amount)
FROM orders
GROUP BY customer_id;

-> 이 쿼리는 주문 테이블의 데이터를 customer_id로 그룹화하고, 

각 그룹 내에서 주문 금액을 합계로 계산하여 각 고객의 총 주문 금액을 얻을 것이다.

 

 

 

 

 

 

 

❤ HAVING

GROUP BY와 함께 사용하여 그룹화된 데이터에 대한 필터링을 수행하는데 사용된다.

HAVING 절은 일반적으로 집계 함수와 함께 사용되며, 

특정 조건을 충족하는 그룹만을 결과에 포함시킬 때 유용하다.

 

HAVING 절은 다음과 같은 기본 구조를 가진다.

SELECT column1, aggregate_function(column2)
FROM table_name
GROUP BY column1
HAVING condition;

• column1: 데이터를 그룹화하려는 열을 나타낸다.

 aggregate_function(column2): 그룹 내에서 적용할 집계 함수를 나타낸다. 

이것은 SUM, COUNT, AVG 등이 될 수 있다.

 table_name: 데이터를 추출하려는 테이블의 이름을 나타낸다.

condition: 그룹화된 결과에 대한 필터링 조건을 지정한다. 

이 조건은 집계 함수의 결과에 대한 비교 조건이며, 조건을 충족하는 그룹만 결과에 포함된다.

 

예를 들어, 주문 테이블에서 주문 금액이 1000 이상인 고객만을 포함하는 경우

다음과 같은 sql 쿼리를 사용할 수 있다.

SELECT customer_id, SUM(order_amount)
FROM orders
GROUP BY customer_id
HAVINIG SUM(order_amount) >= 1000;

-> 이 쿼리는 주문 테이블의 데이터를 customer_id로 그룹화하고, 

각 고객의 주문 금액 합계를 계산한 후, 

이 합계가 1000 이상인 그룹만을 결과로 반환한다.

 

 

 

💛 GROUP BY와 HAVING 절의 문법과 주의사항

문법 주의사항
GROUP BY <속성> GROUP BY로 투플을 그룹으로 묶은 후 SELECT 절에는
GROUP BY에서 사용한 <속성>과 집계함수만 나올 수 있다.

맞는 예
SELECT custid, SUM(saleprice)
FROM orders
GROUP BY custid;

틀린 예
SELECT bookid, SUM(saleprice)
/* SELECT절에 bookid 속성이 올 수 없음 */
FROM orders
GROUP BY custid;
HAVING <검색조건> WHERE 절과 HAVING 절이 같이 포함된 SQL문은 검색조건이 모호해질 수 있다.
HAVING절은 
1. 반드시 GROUP BY 절과 같이 작성해야 하고
2. WHERE 절보다 뒤에 나와야 한다.
3. <검색조건>에는 SUM, AVG, MAX, MIN, COUNT와 같은
집계함수가 와야 한다.

맞는 예
SELECT custid, COUNT(*) AS 도서수량
FROM orders
WHERE saleprice >= 8000
GROUP BY custid
HAVING count(*) >= 2;

틀린 예
SELECT custid, COUNT(*) AS 도서수량
FROM orders
HAVING count(*) >= 2 /*순서가 틀림*/
WHERE saleprice >= 8000
GROUP BY custid;

 

 

 

 

 

🧡 WHERE? HAVING?

WHERE절과 HAVING절은 SQL 쿼리에서 데이터를 필터링하는 데 사용되지만

다음과 같은 차이점이 있다.

 

1. 사용위치

  WHERE: WHERE절은 데이터를 추출하기 전에 행 수준에서 필터링을 수행한다.

즉, 테이블의 각 행에 조건을 적용하고, 조건을 만족하는 행만이 결과 집합에 포함된다.

HAVING: HAVING절은 GROUP BY와 함께 사용되며, 그룹화된 데이터에 대한 필터링을 수행한다.

 따라서 HAVING은 집계 함수와 함께 사용되며, 집계된 결과에 대한 필터링을 수행한다.

 

2. 사용목적

WHERE: 일반적으로 개별 행을 필터링하거나 조인된 테이블에서 조건을 적용하는데 사용된다.

HAVING: 주로 그룹화된 데이터에 대한 조건을 지정하는데 사용된다.

집계 함수의 결과르 기반으로 그룹 단위로 데이터를 필터링한다.

 

WHERE절은 다음과 같이 사용될 수 있다.

SELECT * FROM orders
WHERE order_amount > 100;

-> 이 쿼리는 주문 테이블에서 주문 금액이 100보다 큰 모든 행을 선택한다.

 

 

반면에 HAVING절은 그룹화된 데이터에 대한 조건을 다음과 같이 지정할 수 있다.

SELECT customer_id, SUM(order_amount)
FROM orders
GROUP BY customer_id
HAVING SUM(order_amount) >= 100;

-> 이 쿼리는 주문 테이블의 데이터를 고객별로 그룹화하고,

각 고객의 주문 금액 합계를 계산한 후, 합계가 1000 이상인 그룹만을 결과로 반환한다.

HAVING은 집계 함수인 SUM(order_amount)에 대한 필터링을 수행한다.

'DATABASE(MY SQL)' 카테고리의 다른 글

(MY SQL) 내장함수  (0) 2023.10.22
(MY SQL) JOIN  (0) 2023.10.09