[SQL] DML(3) - Grouping data(GROUP BY)

문지은·2023년 4월 8일
0

Database with SQLite

목록 보기
5/7
post-thumbnail

Aggregate function과 GROUP BY 절을 사용하여 특정 그룹으로 묶인 결과를 조회하는 방법에 대해 알아보자.
사용한 파일명과 테이블 명은 이전 글과 같다.


Aggregate function

  • 집계함수
  • 값 집합의 최대값, 최소값, 평균, 함계 및 개수를 계산
  • 값 집합에 대한 계산을 수행하고 단일 값을 반환
    • 여러 행으로부터 하나의 결과 값을 반환하는 함수
  • SELECT 문의 GROUP BY 절과 함께 종종 사용됨
  • 제공하는 함수 목록
    • AVG(), COUNT(), MAX(), MIN(), SUM()
  • AVG(), MAX(), MIN(), SUM()는 숫자를 기준으로 계산이 되어져야 하기 때문에 반드시 컬럼의 데이터 타입이 숫자(INTEGER)일 때만 사용 가능

Aggregate function 예제 1

  • users 테이블의 전체 행 수 조회하기
SELECT COUNT(*) FROM users;
  • 전체 유저의 평균 balance 조회하기
SELECT avg(balance) From users;

GROUP BY clause

SELECT column_1, aggregate_function(column_2) FROM table_name
GROUP BY column_1, column_2;
  • Make a set of summary rows from a set of rows
  • 특정 그룹으로 묶인 결과를 생성
  • 선택된 컬럼 값을 기준으로 데이터(행)들의 공통 값을 묶어서 결과로 나타냄
  • SELECT 문에서 선택적으로 사용 가능한 절
  • SELECT 문의 FROM 절 뒤에 작성
    • WHERE 절이 포함된 경우 WHERE 절 뒤에 작성해야 함
  • 각 그룹에 대해 MIN, MAX, SUM, COUNT 또는 AVG와 같은 집계함수(aggregate function)를 적용하여 각 그룹에 대한 추가적인 정보 제공 가능

Aggregate function 예제 2

  • 지역별 평균 balance 구하기
SELECT country, avg(balance) FROM users
GROUP BY country;

-- balance 기준 오름차순 정렬하여 조회하기
SELECT country, avg(balance) FROM users
GROUP BY country ORDER BY avg(balance) DESC;
  • 나이가 30살 이상인 사람들의 평균 나이 구하기
SELECT AVG(age) FROM users WHERE age >= 30;

GROUP BY 예제

  • 각 지역별로 몇 명씩 살고 있는지 조회하기
    • 지역별로 그룹을 나누어야 한다.
      SELECT country FROM users GROUP BY country;
    • 그룹별로 포함되는 데이터 수를 구함 → Aggregation Function 의 COUNT 사용
      SELECT country, COUNT(*) FROM users GROUP BY country;
    • 참고 사항
      • 이전 쿼리에서 COUNT(), COUNT(age), COUNT(last_name) 등 어떤 컬럼을 넣어도 결과는 같음
      • 현재 쿼리에서는 그룹화된 country를 기준으로 카운트하는 것이기 때문에 어떤 컬럼을 카운트해도 전체 개수는 동일하기 때문
  • 각 성씨가 몇 명씩 있는지 조회하기
SELECT last_name, COUNT(*) FROM users
GROUP BY last_name;

-- AS 키워드를 사용해 컬럼명 변경가능
SELECT last_name, COUNT(*) AS number_of_name FROM users
GROUP BY last_name;
  • 인원이 가장 많은 성씨 순으로 조회하기
SELECT last_name, COUNT(*) FROM users
GROUP BY last_name ORDER BY COUNT(*) DESC;
  • 각 지역별 평균 나이 조회하기
SELECT country, AVG(age) FROM users
GROUP BY country;

📍 요약

-- users 테이블의 전체 행 수 조회하기
SELECT COUNT(*) FROM users;

-- 전체 유저의 평균 balance 조회하기 
SELECT avg(balance) From users;

-- 지역별 평균 balance 구하기
SELECT country, avg(balance) FROM users
GROUP BY country;
-- 지역별 평균 balance를 평균 balance 기준 오름차순 정렬하여 조회하기
SELECT country, avg(balance) FROM users
GROUP BY country ORDER BY avg(balance) DESC;

-- 나이가 30살 이상인 사람들의 평균 나이 구하기
SELECT AVG(age) FROM users WHERE age >= 30;

-- 각 지역별로 몇 명씩 살고 있는지 조회하기
SELECT country, COUNT(*) FROM users GROUP BY country;

-- 각 성씨가 몇 명씩 있는지 조회하기
SELECT last_name, COUNT(*) FROM users
GROUP BY last_name;
-- AS 키워드를 사용해 컬럼명 변경가능
SELECT last_name, COUNT(*) AS number_of_name FROM users
GROUP BY last_name;

-- 인원이 가장 많은 성씨 순으로 조회하기
SELECT last_name, COUNT(*) FROM users
GROUP BY last_name ORDER BY COUNT(*) DESC;

-- 각 지역별 평균 나이 조회하기
SELECT country, AVG(age) FROM users
GROUP BY country;
profile
코드로 꿈을 펼치는 개발자의 이야기, 노력과 열정이 가득한 곳 🌈

0개의 댓글