DBMS - GRUOP BY, SUB QUERY
GRUOP BY
GROUP BY는 특정 컬럼을 기준으로 집계를 내는데 사용이 되는 함수이다. 즉, 특정 컬럼에서 같은 값을 가지는 데이터끼리 그룹을 지어서 보여준다.
ID | NAME | POSITION | TEAM_ID |
1 | 홍길동 | MF | 232 |
2 | 이순신 | DF | 234 |
3 | 리신 | GK | 235 |
4 | 벨베스 | MF | 236 |
위의 그래프는 PLAYER 테이블로 ID(PK), NAME, POSITION, TEAM_ID(FK)로 구성되어 있다. 이 때 POSITION.별로 몇명이 속해져 있는지 알고 싶다면 다음과 같이 query문을 작성할 수 있다.
-- oracle에서 POSITION 문법을 제공하기 때문에 칼럼명으로 사용할 경우 큰따옴표를 사용하여야 한다.
SELECT "POSITION" 포지션, COUNT(ID) AS "POSITION별 인원수"
FROM PLAYER
GROUP BY "POSITION";
이 쿼리문의 결과를 보면,
포지션 | POSITION별 인원수 |
MF | 2 |
DF | 1 |
GK | 1 |
포지션별 인원수에 대한 집계를 얻을 수 있다.
HAVING절
GROUP BY문에도 조건식을 추가할 수 있는데 바로 이 때 사용하는 문법이 HAVING절이다. HAVING절을 사용을 할 때에는 주의할 점이 있는데 바로 HAVING절보다는 WHERE절을 사용을 권장한다는 것이다.
왜냐하면, 최적화, 효율 측면에서 HAVING절보다는 WHERE절이 더 효율적이기 때문에 HAVING절에 사용은 최소화하는 것이 좋다.
즉, WHERE절에서 조건을 처리할 수 있다면 반드시 WHERE절에서 처리를 해준 후 WHERE절에서 하지 못하는 조건식을 HAVING절을 통해 처리를 해야 한다.
예를 들어 전체적으로 적용이 되는 조건의 경우는 WHERE절로, GROUP을 하였을 때 적용되는 조건식 또는 집계함수를 사용하여야 하는 상황에서는 HAVING절로 처리를 해야 하는 것이다.(집계함수는 WHERE절에 사용 불가능)
HAVING절을 사용하기 위한 FORMAT은 다음과 같다.
SELECT col1, col2, ... FROM 테이블명
WHERE 조건식
GROUP BY 컬럼명
HAVING 조건절;
SUB QUERY
DBMS를 SQL문(Query문)을 통해 다루기 위해서는 필수적으로 알아야 하는 개념이 있다. 바로,
SQL문(Query문) = "하나의 값"
쿼리문을 하나의 값으로 인식을 할 수 있어야 한다. 이러한 개념이 잡히면 SUB QUERY에 대한 개념도 쉽게 잡힌다. SUB QUERY는 QUERY문을 하나의 값으로서 QUERY문 내에서 사용하는 문법이기 때문이다.
SUB QUERY문은 들어가는 위치에 따라 다음과 같이 분류가 된다.
- IN LINE VIEW : FROM절
- SCALAR : SELECT절
- SUB QUERY : WHERE절
부르는 명칭이 다를뿐이지만 SQL문을 하나의 값으로서 사용하는 것은 똑같다. 사용할 때 주의할 점은 SUB QUERY로 사용하는 SQL문은 소괄호로 묶어주어야 한다.
예시를 들어보면 아래와 같은 PLAYER 테이블이 있다고 가정하자.
ID | NAME | WEIGHT | HEIGHT | POSITION |
1 | 리신 | 80 | 180 | TOP |
2 | 리산드라 | 60 | 160 | MID |
3 | 룰루 | 50 | 150 | BOT |
4 | 이즈리얼 | 80 | 170 | BOT |
5 | 아트록스 | 90 | 190 | TOP |
6 | 페이커 | 70 | 170 | MID |
위의 테이블에서 전체 평균 키와 표지션별 평균 키를 구한다고 하였을 때, 다음의 쿼리문을 사용할 수 있다.
SELECT "POSITION", AVG(HEIGHT) AS "포지션별 평균키",
(SELECT AVG(HEIGHT) FROM PLAYER) AS "전체 평균키" FROM PLAYER
GROUP BY "POSITION";
GROUP BY를 하고 집계함수를 사용할 경우, 그룹에 따른 집계를 하기 때문에 전체 평균 키를 구하기 위해서 SUB QUERY문을 사용한 것을 볼 수 있습니다. 이 쿼리문을 실행시키면,
POSITION | 포지션별 평균키 | 전체 평균키 |
TOP | 185 | 170 |
MID | 165 | 170 |
BOT | 160 | 170 |
다음의 결과를 얻을 수 있습니다. 전체 평균키의 경우, 전체이기 때문에 모든 그룹에서 같은 값을 가지게 됩니다.
2023.08.15 - [Programming 공부/DBMS] - DBMS - Optimizer, Hint
DBMS - Optimizer, Hint
Optimizer Oracle DBMS에서는 옵티마이저(Optimizer)를 제공하고 있다.옵티마이저란 사용자가 질의한 SQL문에 대해 최적의 실행 방법을 결정하는 DBMS 내부의 핵심 엔진이다. 사용자가 쿼리문으로 결과를
codingralro.tistory.com