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 |