DB/Oracle

[Oracle] group by, having 사용 방법

멍목 2021. 5. 25. 22:34
반응형

안녕하세요 이번 포스팅에서는 아래 예제를 통해 group by와 having 절 사용 방법에 대해 알아보겠습니다.

 


0. GROUP BY, HAVING 설명

SELECT		GROUP BY에서 지정된 컬럼,
	    	GROUP BY 별로 집계할 값
FROM		테이블
WHERE 		조건(집계함수 사용 불가능)
GROUP BY 	그룹으로 묶을 컬럼
HAVING 		묶은 그룹의 조건(집계함수로 조건 설정 가능)

Q : WHERE 절과 GROUP BY의 HAVING절의 차이는 무엇일까?

A : WHERE 절은 해당 SELECT 쿼리 전체의 조건이고, HAVING 절은 WHERE 조건 이후 그룹화 한 데이터에 조건을 거는 것이다.

추가로 WHERE 절에서는 집계함수를 사용할 수 없으며 HAVING 절에서 사용 가능하다.

 

SELECT 구문의 순서 : FROM > WHERE > GROUP BY > HAVING > SELECT > ORDER BY

 

1. 샘플 데이터 생성

CREATE TABLE sql_test_a 
( 
    ID          VARCHAR2(4000 BYTE), 
    NAME        VARCHAR2(200 BYTE), 
    GROUP_ID    VARCHAR2(200 BYTE),
    GENDER      VARCHAR2(1 BYTE)
); 

CREATE TABLE sql_test_b 
( 
    ID         VARCHAR2(4000 BYTE) 
); 

INSERT INTO sql_test_a (ID, NAME, GROUP_ID, GENDER) VALUES ('ID_1', '홍길동', 'G_01', 'M'); 

INSERT INTO sql_test_a (ID, NAME, GROUP_ID, GENDER) VALUES ('ID_2', '아무개', 'G_01', 'M'); 

INSERT INTO sql_test_a (ID, NAME, GROUP_ID, GENDER) VALUES ('ID_3', '김철수', 'G_02', 'W'); 

INSERT INTO sql_test_a (ID, NAME, GROUP_ID, GENDER) VALUES ('ID_4', '김영희', 'G_03', 'W'); 

INSERT INTO sql_test_a (ID, NAME, GROUP_ID, GENDER) VALUES ('ID_5', '국영수', 'G_03', 'M'); 

INSERT INTO sql_test_a (ID, NAME, GROUP_ID, GENDER) VALUES ('ID_6', '박서준', 'G_01', 'M');

INSERT INTO sql_test_a (ID, NAME, GROUP_ID, GENDER) VALUES ('ID_7', '아이유', 'G_03', 'W'); 

INSERT INTO sql_test_a (ID, NAME, GROUP_ID, GENDER) VALUES ('ID_8', '김지원', 'G_03', 'W'); 

INSERT INTO sql_test_a (ID, NAME, GROUP_ID, GENDER) VALUES ('ID_9', '천우희', 'G_02', 'W');

INSERT INTO sql_test_a (ID, NAME, GROUP_ID, GENDER) VALUES ('ID_10', '안재홍', 'G_03', 'M'); 

 

 

 

2. 각 GROUP_ID에 속해있는 사람의 수를 조회하기

SELECT GROUP_ID,
       COUNT(ID)
FROM sql_test_a
GROUP BY GROUP_ID;

 

 

3. 각 GROUP_ID에 속해있는 남자 사람의 수를 조회하기

SELECT GROUP_ID,
       COUNT(ID)
FROM sql_test_a
WHERE GENDER = 'M'
GROUP BY GROUP_ID;

 

 

 

4. 남자 사람이 3명 이상인 GROUP_ID를 조회하기

SELECT GROUP_ID,
       COUNT(ID)
FROM sql_test_a
WHERE GENDER = 'M'
GROUP BY GROUP_ID
HAVING COUNT(ID) >= 3;

 

 

 

 

 

반응형