| GROUP BY
특정 컬럼을 그룹화 하는 것
GROUP BY 절은 집계함수와 함께 사용됨
1) COUNT() : 행의 개수를 세어줌
2) AVG() : 행 안에 있는 값의 평균을 내어줌
3) MIN() : 행 안에 있는 값의 최솟값을 반환해줌
4) MAX() : 행 안에 있는 값의 최댓값을 반환해줌
5) SUM() : 행 안에 있는 값의 합을 내어줌
이러한 계산을 위해 행을 그룹화 시켜준다.

만약 이와 같은 테이블에서 나이가 22살이면서 점수가 가장 높은 값을 출력한다고 하면,

이렇게 쓸 수 있을 것이다. 하지만

ORA - 00937 오류가 발생하며 이는 단일 그룹의 그룹함수가 아니라는 의미이다.
AGE와 MAX(SCORE) 각각의 값을 확인해보기 위해 아래와 같이 작성하면



각각 결과가 2개, 1개가 나오는 것을 알 수 있고, 이는 처음에 작성했던 코드, 믹스된 함수가 한 곳에 사용이 불가능하다는 것을 알 수 있다.
이렇게 집계함수에서 원하는 값을 출력하려면 GROUP BY절을 사용해야 한다.


이렇게 나이가 22살이면서 점수가 가장 높은 값을 얻을 수 있었다.
실행 순서
1. FROM STUDENT --테이블 선택
2. WHERE AGE=22 --조건절로 데이터 선택
3. GROUP BY AGE; --GROUPING
4. SELECT AGE,MAX(SCORE) --요청한 커럼값을 화면에 출력
| HAVING
특정 컬럼을 그룹화한 결과에 조건을 거는 것
이번엔 조건절이 그룹함수일 때 조건에 따라 GROUPING하려고 했다.
**조건절에 괄호가 있다고 전부 그룹함수는 아니다!


이번엔 ORA - 00933 오류가 발생했고, 이는 그룹함수가 허가되지 않는다는 의미이다.
그룹함수를 사용하지 말아야 할 곳에서 사용 SUM(SCORE)
그룹함수를 사용하여 조건을 줄 때는 WHERE절이 아닌 HAVING절을 사용해야 한다.
위 코드를 HAVING 함수를 사용하여 아래와 같이 작성하면


점수가 40점 이상인 학생의 나이를 출력할 수 있다.
**GROUP BY, HAVING, WHERE, ORDER BY를 모두 한꺼번에 사용 가능하다.

학생테이블에서 나이가 24살이 아닌 학생들을 GROUPING하고 점수가 40점 이상인 학생들을 오름차순으로 정리하여 출력
실행 순서
1. FROM STUDENT
2. WHERE AGE!=24
3. GROUP BY AGE
4. HAVING SUM(SCORE)>=40 --GROUPING이 먼저 진행된 상황
5. SELECT AGE,SUM(SCORE)
6. ORDER BY SUM(SCORE) ASC; --오름차순 정렬
* WHERE랑 HAVING의 차이점
WHERE는 그룹화 하기 전이고, HAVING은 그룹화 후의 조건
'IT Study > DBMS' 카테고리의 다른 글
MySQL - 이클립스 연동하기 (0) | 2023.01.02 |
---|---|
Oracle - 함수 사용법 (0) | 2023.01.02 |
Oracle/JDBC - Java 드라이버 연동 (0) | 2023.01.02 |
Oracle - EQUI JOIN / 페이징처리 (0) | 2023.01.01 |
DBMS (0) | 2023.01.01 |
댓글