쌓고 쌓다
[Oracle] HAVING 본문
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