본문 바로가기
SQL/기초

SQL 정리 5일차 GROUP BY, HAVING

by 유서담 2023. 8. 13.

5.1 GROUP BY와 HAVING절

SELECT 칼럼명, GROUP 함수
FROM 테이블명
WHERE 조건식
GROUP BY 칼럼명
HAVING 조건식
ORDER BY 칼럼이나 표현식 ( 가장 마지막에 )

GROUP BY : 전체 데이터를 소그룹으로 나눌 칼럼을 명시한다

HAVING : GROUP에 대한 조건을 기술

 

 

5.2 GROUP BY절

SELECT dept_id, AVG(salary) // dept_id : 부서 , AVG(salary) : 연봉의 Average
FROM s_emp		// s_emp 테이블
WHERE title = '사원'
GROUP BY dept_id;	// SELECT 에서 사용한 칼럼명과 같아야 한다. dept_id

 

SELECT customer_id, COUNT(order_id), SUM(order_total)
FROM orders
GROUP BY customer_id;

WHERE절 없어도 사용이 가능하다.

 

 

SELECT절에서 GROUP 함수의 잘못된 사용

SELECT region_id, COUNT(name)
FROM s_dept;
SELECT region_id, COUNT(name)
		*
ERROR at line 1 :
ORA-00937 : not a single-group group function

SELECT절에 그룹함수가 오면 SELECT절의 나머지 칼럼은 GROUP BY절에 기술되어야 한다.

즉, SELECT절에 그룹함수가 오거나, GROUP BY절 이하에 기술된 칼럼이 오면 나머지 칼럼은 SELECT절 뒤에 기술할 수 밖에 없다.

 

 

WHERE절에서 GROUP함수의 잘못된 사용

SELECT dept_id, AVG(salary)
FROM s_emp
WHERE AVG(salary) >= 2000
GROUP BY dept_id;
WHERE AVG(salary) >= 2000
		*
ERROR at line 3:
ORA-00934 : group function is not allowed here

GROUP절에 대한 조건은 WHERE절에서 기술할 수 없고, HAVING절에서 기술해야 한다.

 

 

 

5.3 HAVING절

 

SELECT title, AVG(salary), COUNT(*)
FROM s_emp
GROUP BY title
HAVING COUNT(*) > 2 ;

 

예시1 

주문 수가 3건 이상인 고객 찾기

SELECT customer_id, COUNT(order_id) as order_count
FROM orders
GROUP BY customer_id
HAVING order_count >= 3;

 

예시2

부서별로 평균 급여가 5000 이상인 부서 찾기

SELECT department, AVG(salary) as average_salary
FROM employees
GROUP BY department
HAVING average_salary >= 5000;

 

'SQL > 기초' 카테고리의 다른 글

SQL 정리 7일차 SubQUERY  (0) 2023.08.25
SQL 정리 6일차 JOIN  (0) 2023.08.16
SQL 정리 4일차 -2- 날짜형 함수, 변환형 함수  (0) 2023.08.11
SQL 정리 4일차 -1- 문자형 함수, 숫자형 함수  (0) 2023.08.08
SQL 정리 3일차  (0) 2023.08.05