❤ 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 |