이번엔 이전 글에 이어 GROUP BY와 ORDER BY에 대해 이야기해볼까 합니다.
2020/08/25 - [개발 창고/데이터베이스 개발] - [SQL] SELECT 기본문법(1)
SELECT [ALL|DISTINCT] 컬럼명 [, 컬럼명 ...]
FROM 테이블명 [, 테이블명 ...]
[WHERE 조건식]
[GROUP BY 컬러명 [, 컬럼명 ...]
[HAVING 조건식]]
[ORDER BY 컬럼명 [, 컬럼명 ...]
GROUP BY
그룹 함수는 보통 중복제거를 위해 사용한다고들 합니다. 그럼 이런 중복은 언제 발생을 할까요? 흔히 중복 자체에 대한 구분을 위해 GROUP BY를 쓰는 경우보다는 통계 등에 활용하기 위해 사용되는 경우가 많습니다.
ex)
- 상품별 구매한 금액
- 박스별 물품 수량
- 피보험자의 가입 보험 개수
이와 같이 OO별 OO수량 등을 위해 그룹을 짓는 경우가 많습니다(아닌 경우는 보통 이력 데이터를 활용하여 콤보박스를 만드는 경우 정도).
<주문테이블>
주문번호 | 상품명 | 구매금액 |
10001 | 사과 | 1000 |
10001 | 바나나 | 2000 |
10002 | 사과 | 1000 |
10002 | 포도 | 1500 |
만약 다음과 같이 물건을 팔았다면, 주문 1건당 2개의 상품이 팔렸음을 알 수 있습니다.
이때 팔린 상품의 품목들을 알고 싶다면 다음과 같이 SQL문을 작성할 수 있을 겁니다.
만약 GROUP BY가 없다면 다음과 같은 결과가 나오게 될 겁니다.
SELECT 상품명
FROM 주문테이블
상품명 |
사과 |
바나나 |
사과 |
포도 |
하지만 사용자가 저 결과에서 사과라는 결과가 중복되니 하나로 줄이고 싶다면 어떻게 해야 할까요? 이때 GROUP BY를 활용할 수 있습니다.
SELECT 상품명
FROM 주문테이블
GROUP BY 상품명
이 경우 상품명 별로 중복된 항목을 제거하고 상품을 보여줍니다.
상품명 |
사과 |
바나나 |
포도 |
이는 이전 블로그 글에서 DISTINCT를 활용할 수도 있습니다.
SELECT DISTINCT 상품명
FROM 주문테이블
그럼 DISTINCT를 쓰면 되지 왜 GROUP BY를 쓰는 걸까요? 이는 2가지 이유를 들 수 있는데 첫 번째는 GROUP BY는 그룹핑을 한 컬럼을 굳이 SELECT절에 작성하지 않아도 되기 때문에 불필요한 항목을 줄일 수 있습니다 (컬럼명이 필요한게 아니라 컬럼을 서브쿼리로 변환해서 반환하는 경우), 또 두 번째는 HAVING절을 사용할 수 있기 때문입니다.
만약 2번 이상 팔린 항목을 보고 싶다면 어떻게 할까요?? 보통 처음 HAVING을 활용하지 않는다면 다음과 같이 쓸 수 있을 겁니다.
SELECT 상품명
FROM (
SELECT 상품명, COUNT(*) CNT
FROM 주문테이블
GROUP BY 상품명
)
WHERE CNT >= 2
다음과 같이 작성하면 2번 이상 판매된 상품이 나올 것이고 위의 표에서 대입해보면 다음과 같은 결과가 나올 겁니다.
상품명 |
사과 |
사과만 두 번 판매되었기 때문에 사과만 결과로 나오게 됩니다. 여기서 COUNT(*)는 그룹핑한 컬럼별 중복된 개수를 표현해줍니다.
이는 HAVING절을 이용하면 조금 더 간단해집니다.
SELECT 상품명
FROM 주문테이블
GROUP BY 상품명 HAVING COUNT(*) >= 2
다음을 글로 설명하면 다음과 같습니다.
"[주문테이블]의 데이터 중에서 [상품명]이 2개 이상 중복되는 데이터의 상품명을 보여주세요"
ORDER BY
ORDER BY는 간단히 어떤 순서로 정렬할지를 나타냅니다. 보통 ORDER BY를 입력하지 않으면 임의의 순서대로 나열됩니다. 또한 ORDER BY 절에서는 ASC/DESC로 오름차순/내림차순으로 표현이 가능한데, 만약 이를 생각한 경우 오름차순(ASC)으로 표현됩니다.
만약 상품명 오름차순(가나다 순)으로 표현하고 싶다면 다음과 같이 설정해주면 됩니다.
SELECT *
FROM 주문테이블
ORDER BY 상품명
주문번호 | 상품명 | 구매금액 |
10001 | 바나나 | 2000 |
10001 | 사과 | 1000 |
10002 | 사과 | 1000 |
10002 | 포도 | 1500 |
이 경우 가나다 순으로 바 -> 사 -> 포 순으로 정렬이 됩니다. 2번 3번 열의 경우 기존에 데이터가 정렬된 순으로 표현됩니다. 만약 상품명 다음으로 주문번호를 내림차순으로 정렬을 하고 싶은 경우 ORDER BY 절의 상품명 다음으로 구매금액을 정렬해주면 됩니다.
SELECT *
FROM 주문테이블
ORDER BY 상품명, 주문번호 DESC
주문번호 | 상품명 | 구매금액 |
10001 | 바나나 | 2000 |
10002 | 사과 | 1000 |
10001 | 사과 | 1000 |
10002 | 포도 | 1500 |
또한 정렬은 숫자로도 가능합니다. 만약 위의 상품명/주문번호로 정렬을 하고 싶은 경우 아래와 같이도 사용 가능합니다.
SELECT *
FROM 주문테이블
ORDER BY 2, 1 DESC
이렇게 하면 Column값의 두 번째인 상품명 다음으로 첫 번째 컬림인 주문번호의 역순으로 정렬을 하게 됩니다. 하지만 이는 컬럼의 배치가 바뀌면 정렬순서가 원하지 않는 결과가 될 수 도 있기 때문에 사용에 주의가 필요합니다.
'개발 창고 > Database' 카테고리의 다른 글
[SQL] JOIN이란? - OUTER JOIN (0) | 2020.09.16 |
---|---|
[SQL] JOIN이란? - INNER JOIN (0) | 2020.09.15 |
[SQL] WITH절 사용하는 방법 (11) | 2020.09.02 |
[SQL] SELECT 기본문법(1) (1) | 2020.08.25 |
[MariaDB] Database 및 사용자 계정 생성 (0) | 2020.08.04 |