나만의 작은 도서관
[SQL] 기초 2. 그룹화(GROUP BY)와 정렬(ORDER BY) 본문
유의사항: 해당 글은 MySQL 문법을 기반으로 작성된 글입니다. 다른 SQL과 다른 부분이 있을 수 있습니다.
개요
데이터 각각의 정보가 아닌, 총 합, 평균, 개수 등 그룹에 대한 정보를 얻고 싶을 때가 있다. 이때 사용하는 함수를 집계함수라고 부르며 GROUP BY절과 함께 사용한다.
또한, 특정 컬럼을 기준으로 정렬하는 ORDER BY를 알아보자.
그룹화하기(GROUP BY절)
그룹화하고자 하는 컬럼을 GROUP BY절에 적는다.
그룹화를 하게되면 해당 컬럼의 데이터 값이 같은 행들이 하나의 행으로 묶인다. (아래 예시: 컬럼 1을 기준으로 그룹화)
SELECT *
FROM 테이블
GROUP BY 컬럼1
만약 하나가 아닌 여러 컬럼들을 기준으로 그룹화하고 싶다면 GROUP BY절에 컬럼을 추가한다. (아래 예시: 컬럼1, 컬럼2, 컬럼3을 기준으로 그룹화)
SELECT *
FROM 테이블
GROUP BY 컬럼1, 컬럼2, 컬럼3
컬럼의 이름이 아닌 숫자를 넣어도 되는데, SELECT문에 존재하는 컬럼의 위치를 적으면 해당 컬럼의 이름을 넣었을 때와 동일한 의미를 가진다. (아래 예시: 컬럼 1을 기준으로 그룹화)
SELECT 컬럼1, 컬럼2
FROM 테이블
GROUP BY 1
GROUP BY절을 통해 생성된 결과물에 조건을 걸어 필터링하고싶다면 HAVING을 사용한다.
SELECT 컬럼1, 컬럼2
FROM 테이블
GROUP BY 1
HAVING 조건
집계 함수
그룹화를 한 이후, 그룹의 집계 결과를 알고 싶은 경우가 대부분일 것이다. 이런 경우 SELECT문에 집계 함수를 추가하면 간단히 집계 결과를 알 수 있다.
+) 여담으로 DB에선 통계라는 단어 대신 집계라는 말을 더 자주 사용한다. 뜻은 비슷하다.
SELECT *, 집계 함수(컬럼)
FROM 테이블
GROUP BY 컬럼1
집계 함수의 종류
집계 함수 | 예시 설명 | 예시 |
SUM() | 각 그룹의 나이 합 | SUM(age) |
AVG() | 각 그룹의 나이 평균 | AVG(age) |
COUNT() | 각 그룹의 개수 | COUNT(*) 또는 COUNT(1) |
MAX() | 각 그룹의 최고 나이 | MAX(age) |
MIN() | 각 그룹의 최소 나이 | MIN(age) |
count()함수의 입력 값이 2개인 이유
COUNT()의 경우 입력 값으로 * 또는 1을 넣는데, 두 방식의 결과는 크게 다르지 않다. 다만, *은 모든 열을 확인하기 때문에 1보다 상대적으로 실행 속도가 느리며, 각 열에 존재하는 NULL에 따른 결과의 차이가 있을 수 있다.
추가로 1은 더미 값으로, 1이 가지는 의미는 없다. 2를 넣든 345를 넣든 똑같다.(확인필요)
정렬 하기(ORDER BY절)
ORDER BY절을 사용하면 특정한 컬럼을 기준으로 정렬한 테이블을 얻을 수 있다.
참고로, 집계 함수와 같이 기존에 테이블에 없던 컬럼도 SELECT문에 존재하는 컬럼이라면 정렬 기준으로 사용할 수 있다.(ORDER BY가 SELECT문 보다 늦게 실행되기 때문)
SELECT *
FROM 테이블
ORDER BY 컬럼1
기본 정렬 순은 오름차 순이며, 정렬 순을 설정하고 싶다면 오름차순은 ASC, 내림차순은 DESC를 붙여준다.
SELECT *
FROM 테이블
ORDER BY 컬럼1 DESC
만약 여러 컬럼을 기준으로 정렬하고 싶다면 우선순위가 높은 컬럼부터 차례로 ORDER BY절에 추가한다.
SELECT *
FROM 테이블
ORDER BY 컬럼1 ASC, 컬럼2 DESC
'Common > MySQL' 카테고리의 다른 글
[SQL] 기초 5. 피봇 테이블, 윈도우 함수, 날짜 함수 (0) | 2024.04.11 |
---|---|
[SQL] 기초 4. 서브쿼리(SubQuery)와 조인(JOIN) (0) | 2024.04.11 |
[SQL] 기초 3. 조건문(IF, CASE)과 문자열 함수 (0) | 2024.04.11 |
[SQL] 기초 1. 쿼리(Query)의 간단한 사용법 (0) | 2024.04.11 |