슴슴한 IT

[SQLD,SQLP]SQL기본 - GROUP BY, HAVING 절 본문

SQL

[SQLD,SQLP]SQL기본 - GROUP BY, HAVING 절

요한바울 2023. 8. 8. 22:08
728x90

집계함수

데이터베이스의 열 데이터들을 그룹화하거나 집계하여 통계적 또는 요약정보로 변환

주로 SELECT문에서 사용되며, GROUP BY 절과 함께 사용

 

집계함수명 ( [DISTINCT | ALL] 컬럼이나 표현식 )

 

  1. COUNT(): 특정 컬럼의 값 개수를 세는 함수입니다. NULL 값을 제외하고 세기 때문에 주로 PRIMARY KEY나 UNIQUE 제약 조건이 적용된 컬럼에 사용됩니다.
  2. SUM(): 특정 숫자 컬럼의 합계를 계산하는 함수입니다. NULL 값을 무시하고 합을 계산합니다.
  3. AVG(): 특정 숫자 컬럼의 평균을 계산하는 함수입니다. NULL 값을 무시하고 평균을 계산합니다.
  4. MIN(): 특정 컬럼에서 최소 값을 찾는 함수입니다.
  5. MAX(): 특정 컬럼에서 최대 값을 찾는 함수입니다.
  6. GROUP_CONCAT() 또는 STRING_AGG(): 특정 컬럼의 값을 문자열로 결합하는 함수로, GROUP BY와 함께 사용될 때 그룹 내에서 문자열 결합이 이루어집니다.

 

COUNT( ) : 특정 컬럼의 값 갯수를 세는 함수 

SELECT COUNT(*) AS total_students
FROM students;

 

SUM( ) : 특정 숫자 컬럼의 합계를 계산하는 함수

SELECT SUM(sales_amount) AS total_sales
FROM sales;

 

AVG( ) : 특정 숫자 컬럼의 합계를 계산하는 함수

SELECT AVG(price) AS average_price
FROM products;

 

MIN( ) : 특정 컬럼에서 최소 값을 찾는 함수

SELECT MIN(age) AS youngest_age
FROM employees;

 

MAX( ) : 특정 컬럼에서 최대 값을 찾는 함수

SELECT MAX(salary) AS highest_salary
FROM employees;

 

GROUP_CONCAT(), STRING_AGG() : 특정 컬럼의 값을 문자열로 결합 

SELECT department, GROUP_CONCAT(employee_name) AS employee_list
FROM employees
GROUP BY department;
SELECT department, STRING_AGG(employee_name, ', ') AS employee_list
FROM employees
GROUP BY department;

 

728x90

GROUP BY, HAVING 

특징

  • GROUP BY 절을 통해 소그룹별 기준을 정한 후 SELECT절에서 집계함수를 사용
  • 집계함수의 통계 정보는 NULL 값을 가진 행은 제외하고 수행
  • GROUP BY절에서는 SELECT 절과는 달리 ALIAS 명을 사용할 수 없음
  • 집계함수는 WHERE 절에는 사용할 수 없음 => WHERE절이 먼저 수행
  • WHERE 절은 전체 데이터를 GROUP으로 나누기 전에 행들을 미리 제거
  • HAVING 절은 GROUP BY 절의 기준 항목이나 소그룹의 집계함수를 이용한 조건을 표시 
  • GROUP BY 절에 의한 소그룹별로 만들어진 집계 데이터 중, HAVING 절에서 제한
  • HAVING절은 GROUP BY 절 뒤에 위치

ORDER 테이블에서 각 고객별로 주문된 제품의 총 가격을 조회하되, 총 지출액이 50보다 큰 고객들만 조회하는 경우, 

ORDER 테이블 

ORDER_ID CUSTOMER_ID PRODUCT_ID QUANTITY UNIT_PRICE
1 101 201 2 10
2 102 202 3 8
3 101 203 1 5
4 103 201 4 10
5 102 204 2 15
SELECT customer_id, SUM(quantity * unit_price) AS total_spent
FROM orders
GROUP BY customer_id
HAVING SUM(quantity * unit_price) > 50;
--결과
customer_id | total_spent 
-------------------------
102         | 54

CUSTOMER_ID 101는 ( 2 × 10 ) + ( 1 × 5 ) = 25, 

CUSTOMER_ID 102는 ( 3 × 8 ) + ( 2 × 15 ) = 54, 

CUSTOMER_ID 102는 ( 4 × 10 )  = 40


"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

728x90