쌓고 쌓다

[Oracle] HAVING 본문

프로그래밍/SQL

[Oracle] HAVING

승민아 2022. 10. 31. 21:43

HAVING 절

GROUP BY절에 의해 생성된 그룹을 대상으로 조건을 적용한다.

( WHERE절은 FROM에 명시된 테이블을 대상으로 조건을 적용한다. )

SELECT column, group function(column)
FROM table
[WHERE condition]
[GROUP BY grou_by_expression]
[HAVING group_condition]
[ORDER BY column]

 

순서

1. 테이블에 WHERE 절의 조건을 만족하는 행 집합 생성

2. 위의 행 집합을 GROUP BY 절에 의해 그룹화

3. HAVING 절에 의해 조건을 만족하는 그룹을 선택

 

EX) 학생 수가 4명 이상인 학년에 대해 학년, 학생 수 출력

SELECT grade, COUNT(*)
FROM student
GROUP BY grade
HAVING COUNT(*) >= 4;

 

( HAVING 절이 없다면 아래의 결과임 )

 

 

 

WHERE 절과 HAVING절의 조건이 똑같고 결과도 똑같다면 어떤 절이 좋을까?

SELECT deptno, AVG(sal)
FROM professor
GROUP BY deptno
HAVING deptno > 102;

SELECT deptno, AVG(sal)
FROM professor
WHERE deptno > 102
GROUP BY deptno;

학과(deptno)가 102 초과인 조건이라

두 개의 쿼리의 결과는 같다.

 

HAVING절은 그룹화된 결과 집합에 대해 검색 조건을 실행한다.

WHERE절은 그룹화 하기 전에 먼저 검색 조건을 실행한다.

=> WHERE 절의 검색 조건을 먼저 실행하는 것이 시간, 성능에 좋음.

 

WHERE 절에 그룹 함수를 사용할 수 없다.

SELECT grade, COUNT(*)
FROM student
WHERE COUNT(*) > 4
GROUP BY grade;

 

SQL 함수의 중첩

EX) 학과별 학생 수가 최대 또는 최소인 학과의 학생 수를 출력

SELECT MAX(COUNT(*)), MIN(COUNT(*))
FROM student
GROUP BY deptno;

 

위의 예제에서 학과도 궁금해서 아래처럼 칼럼을 deptno을 추가하면 안 된다.

 

물론 이것도 불가능.

'프로그래밍 > SQL' 카테고리의 다른 글

[Oracle] EQUI JOIN, NON-EQUI JOIN  (0) 2022.11.01
[Oracle] 조인(JOIN), 카티션 곱  (0) 2022.11.01
[Oracle] GROUPING SETS  (0) 2022.10.31
[Oracle] ROLLUP, CUBE, GROUPING  (0) 2022.10.31
[Oracle] GROUP BY(그룹핑), 그룹 함수  (0) 2022.10.20
Comments