본문 바로가기
DB/DBMS

DBMS - GRUOP BY, SUB QUERY

by 코딩하는 랄로 2023. 8. 15.
728x90

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

 

728x90

'DB > DBMS' 카테고리의 다른 글

DBMS - JOIN  (0) 2023.08.17
DBMS - Optimizer, Hint  (0) 2023.08.15
DBMS - 집계함수, ORDERBY,CASE  (0) 2023.08.14
DBMS - NULL, 숫자형 함수  (0) 2023.08.14
DBMS - 정규화(NF) : 이상현상  (0) 2023.08.14