SELECT에 대한 기본적인 내용은 아래 글을 참고해주세요!
2024.02.02 - [DB/SQL - Oracle] - [SQL] DML(데이터 조작어) - select
[SQL] DML(데이터 조작어) - select
SQL 종류 1. 데이터를 정의하는 쿼리 - DDL(데이터 정의어) : create, drop, alter, truncate 2. 데이터를 조작하는 쿼리 - DML(데이터 조작어) : insert, select, update, delete 3. 데이터를 제어하는 쿼리 - DCL(데이터
bio-logisch.tistory.com
GROUP BY 절은 데이터를 특정 기준에 따라 그룹화하여
MAX, MIN, SUM, COUNT와 같은 집계 함수를 적용하는 데
사용될 수 있다.
집계 함수는 테이블 전체를 기준으로 데이터를
추출할 수도 있지만, GROUP BY를 사용하면 특정 그룹으로
데이터를 묶어서 해당 그룹을 기준으로 데이터를 집계할 수도 있다.
예를 들어,
MEMBER 테이블에서 연령이 20대인 회원의 튜플을
그룹화하고, 해당 그룹에 대한 세부적인 정보를 얻고자 할 때
GROUP BY를 활용할 수 있다.
이를 통해 20대 회원의 특정 그룹에 대한 집계 함수를 적용하면
보다 세세한 데이터 분석이 가능하다.
또한, 연령대별 인원을 구할 때도 GROUP BY를 사용하여 연령대를
기준으로 데이터를 그룹화하고, 각 연령대별 인원 수를 구할 수도 있다.
그룹으로 묶을 컬럼명이나 표현식을 GROUP BY 절에 명시해서 사용하며
GROUP BY 구문은 아래와 같이 WHERE과 ORDER BY 절 사이에 위치한다.
HAVING 절의 경우는 단독으로 올 수 없고
항상 GROUP BY절과 함께 쓰인다.
GROUP BY에서 지정한 그룹에 대한 별도의 조건을
걸어주는 역할을 하기 때문에 조건의 대상이 될
그룹에 대한 정의 없이 HAVING절만 단독으로 쓰일 수 없다.
HAVING절의 위치는 GROUP BY절 바로 다음에 위치한다.
SELECT [ALL 또는 DISTINCT] 컬럼명1, 컬럼명2, ...
FROM 테이블명1, ...
WHERE 조건
GROUP BY 컬럼명1, ...
HAVING 그룹조건
ORDER BY 속성 [ASC 또는 DESC] ;
그렇다면 구체적으로 GROUP BY 구문와 HAVING 구문을
어떻게 활용하는지 예시와 함께 살펴보자.
// member(회원) 테이블 생성
CREATE table member(
no number(2) primary key,
name varchar2(10) not null,
age number(2) not null,
addr varchar2(20) not null
);
**no : 회원번호 / name : 회원명 /
age : 나이 / addr : 주소(도시)
//회원 정보 튜플 삽입
INSERT INTO member VALUES (1, 'John', 30, 'New York');
INSERT INTO member VALUES (2, 'Emma', 25, 'London');
INSERT INTO member VALUES (3, 'Michael', 35, 'Paris');
INSERT INTO member VALUES (4, 'Sophia', 28, 'Berlin');
INSERT INTO member VALUES (5, 'William', 32, 'Tokyo');
INSERT INTO member VALUES (6, 'Olivia', 27, 'Seoul');
INSERT INTO member VALUES (7, 'James', 40, 'Sydney');
INSERT INTO member VALUES (8, 'Sophia', 25, 'New York');
INSERT INTO member VALUES (9, 'James', 35, 'Paris');
INSERT INTO member VALUES (10, 'Emma', 22, 'New York');
INSERT INTO member VALUES (11, 'Oliver', 28, 'London');
INSERT INTO member VALUES (12, 'Isabella', 32, 'Paris');
INSERT INTO member VALUES (13, 'William', 30, 'London');
INSERT INTO member VALUES (14, 'Charlotte', 27, 'Paris');
INSERT INTO member VALUES (15, 'Mia', 29, 'New York');
INSERT INTO member VALUES (16, 'Ethan', 33, 'London');
INSERT INTO member VALUES (17, 'Amelia', 26, 'Paris');
먼저 MEMBER 테이블을 생성한 뒤에
회원 데이터를 해당 테이블에 추가했다.
이제 GROUP BY와 HAVING을 사용해서
데이터를 그룹화하고, 그룹화된 데이터에
조건을 적용해보겠다.
예시 1 : 도시별로 회원 수가 2명 이상인 도시와 회원 수 조회
MEMBER 테이블에서 회원의 주소(도시)를 기준으로
그룹화한 후에 해당 도시에 거주하는 회원이 2명 이상인 경우만
조회하도록 조건을 걸고, 해당 도시 거주 회원수가
출력되도록 해보자.
// 도시별로 회원 수가 2명 이상인 도시 조회
SELECT addr, COUNT(*) AS member_count
FROM member
GROUP BY addr
HAVING COUNT(*) >= 2;
결과는 다음과 같다.
예시 1과 같이 원본 테이블인 MEMBER의 컬럼명과 값을
그룹명으로 그대로 활용할 수도 있지만 아예 새로운
그룹명을 지정해줄 수도 있다.
MEMBER 테이블에는 각 회원의 나이는 있지만
그 회원의 연령대가 20대인지, 30대인지 등을 별도로
나타내는 데이터는 없다.
GROUP BY와 HAVING을 사용하여
어떤 기준의 그룹인지를 컬럼명으로 정의하고 - GROUP_AGE
해당 컬럼에 대한 그룹명을 값으로 둔 후에 - 20대, 30대, 40대 이상
각 그룹에 대해 집계함수인 SUM 함수를 사용하여
각 그룹의 인원수를 구해보고자 한다.
예시 2 : 연령대별 회원수 구하기
MEMBER 테이블에서 회원의 연령대를 크게 3가지
그룹(20대, 30대, 40대 이상)으로 그룹화한 후
각 그룹의 인원수를 조회해보자.
SELECT
CASE
WHEN age BETWEEN 20 AND 29 THEN '20대'
WHEN age BETWEEN 30 AND 39 THEN '30대'
ELSE '40대 이상'
END AS age_group,
COUNT(*) AS member_count
FROM
member
GROUP BY
CASE
WHEN age BETWEEN 20 AND 29 THEN '20대'
WHEN age BETWEEN 30 AND 39 THEN '30대'
ELSE '40대 이상'
END
ORDER BY
age_group;
위 쿼리문은
MEMBER 테이블에서 나이별로 그룹화하여
각 연령대별 회원 수를 계산하고,
그 결과를 나이 그룹에 따라 오름차순으로 정렬되도록
설정한 후 데이터를 반환하게 했다.
CASE문으로 WHEN절에서 회원의 나이를
기준으로 조건을 설정했고 THEN절에서는 해당 조건이
참일 경우 해당하는 연령대로 지정하도록 했다.
(ELSE절은 WHEN절의 모든 조건이 거짓일 때 실행되므로
20대도 30대도 아닌 경우에는 40대 이상으로 분류되도록 했다.)
CASE문의 결과를 AGE_GROUP이라는 새로운 컬럼으로 지정하였고
GROUP BY절을 활용하여 CASE문과 동일한 조건을 사용하여
나이를 그룹화 했다. 이 그룹화를 기준으로 각 연령대에 해당하는
회원 수를 COUNT할 수 있는 것이다.
끝으로 ORDER BY절을 사용하여 AGE_GROUP 컬럼을 기준으로
오름차순으로 결과를 정렬하였다.
'DB > SQL - Oracle' 카테고리의 다른 글
[SQL] 조인(JOIN) - Inner join, outer join, cross join (1) | 2024.02.16 |
---|---|
[SQL] DML(데이터 조작어) - select *order by* 정렬 + ASCII(아스키코드) + UNICODE(유니코드) (0) | 2024.02.16 |
[SQL] 뷰(VIEW)의 생성과 삭제 그리고 장단점 (0) | 2024.02.15 |
[SQL] DCL(데이터 제어어) - grant, revoke (0) | 2024.02.15 |
[SQL] 인덱스(INDEX)의 장점과 단점, 활용 방법 (0) | 2024.02.14 |