MySQL에서 중복 데이터를 다룰 때 SELECT DISTINCT와 GROUP BY는 가장 많이 사용되는 두 가지 방법입니다. 두 구문은 비슷한 결과를 내기도 하지만, 용도와 동작 방식에는 분명한 차이가 있습니다. 이 글에서는 각각의 개념과 실제 예제를 통해 두 구문의 차이를 명확히 살펴보겠습니다.
SELECT DISTINCT란?
SELECT DISTINCT는 특정 컬럼에서 중복된 값을 제거하고 고유한(distinct) 값만 반환하는 데 사용됩니다. 단순히 중복 레코드를 걸러내는 용도로 쓰이며, MAX, AVG 같은 집계 함수와 함께 사용할 수도 있습니다.
예제 테이블 생성하기
DISTINCT를 실습하기 위해 CREATE 명령어로 테이블을 먼저 생성해 보겠습니다.
mysql> CREATE TABLE DistinctDemo
-> (
-> id int,
-> name varchar(100)
-> );
Query OK, 0 rows affected (0.64 sec)
레코드 삽입하기
이제 테스트용 데이터를 INSERT 명령어로 추가합니다.
mysql> INSERT into DistinctDemo values(1,'John');
Query OK, 1 row affected (0.17 sec)
mysql> INSERT into DistinctDemo values(2,'John');
Query OK, 1 row affected (0.18 sec)
mysql> INSERT into DistinctDemo values(3,'Bob');
Query OK, 1 row affected (0.17 sec)
mysql> INSERT into DistinctDemo values(4,'John');
Query OK, 1 row affected (0.15 sec)
mysql> INSERT into DistinctDemo values(5,'David');
Query OK, 1 row affected (0.17 sec)
mysql> INSERT into DistinctDemo values(6,'Bob');
Query OK, 1 row affected (0.16 sec)
전체 데이터 조회하기
SELECT 명령어로 저장된 모든 레코드를 확인해 보겠습니다.
mysql> SELECT * from DistinctDemo;
실행 결과는 다음과 같습니다.
+------+-------+
| id | name |
+------+-------+
| 1 | John |
| 2 | John |
| 3 | Bob |
| 4 | John |
| 5 | David |
| 6 | Bob |
+------+-------+
6 rows in set (0.00 sec)
위 결과를 보면 총 6개의 레코드가 있으며, 'John'은 3번, 'Bob'은 2번 반복되어 중복 데이터가 존재합니다.
DISTINCT로 중복 제거하기
DISTINCT를 적용하면 중복된 이름을 제거하고 고유한 값만 얻을 수 있습니다. 기본 문법은 다음과 같습니다.
SELECT DISTINCT column_name FROM yourTableName ORDER BY column_name;
실제 쿼리를 실행해 보겠습니다.
mysql> SELECT DISTINCT name from DistinctDemo;
실행 결과:
+-------+
| name |
+-------+
| John |
| Bob |
| David |
+-------+
3 rows in set (0.00 sec)
중복이 제거되고 'John', 'Bob', 'David' 세 개의 고유한 값만 반환된 것을 확인할 수 있습니다.
GROUP BY란?
GROUP BY는 여러 컬럼의 데이터를 하나 이상의 기준 컬럼으로 그룹화하는 데 사용됩니다. DISTINCT와 마찬가지로 SUM, AVG, COUNT 같은 집계 함수와 함께 활용할 수 있으며, 그룹별 통계를 낼 때 특히 유용합니다.
예제 테이블 생성하기
GROUP BY 실습을 위한 테이블을 생성합니다.
mysql> CREATE table GroupDemo1
-> (
-> id int,
-> name varchar(100),
-> address varchar(100)
-> );
Query OK, 0 rows affected (0.68 sec)
레코드 삽입하기
테이블 생성 후 데이터를 입력합니다.
mysql> INSERT into GroupDemo1 values(1,'John','US');
Query OK, 1 row affected (0.18 sec)
mysql> INSERT into GroupDemo1 values(2,'Bob','UK');
Query OK, 1 row affected (0.13 sec)
mysql> INSERT into GroupDemo1 values(3,'David','US');
Query OK, 1 row affected (0.12 sec)
mysql> INSERT into GroupDemo1 values(4,'David','US');
Query OK, 1 row affected (0.15 sec)
전체 데이터 조회하기
mysql> SELECT * from GroupDemo1;
실행 결과:
+------+-------+---------+
| id | name | address |
+------+-------+---------+
| 1 | John | US |
| 2 | Bob | UK |
| 3 | David | US |
| 4 | David | US |
+------+-------+---------+
4 rows in set (0.00 sec)
GROUP BY로 그룹별 집계하기
이번에는 주소(address)별로 데이터를 그룹화하여 각 주소가 몇 번 등장하는지 COUNT로 집계해 보겠습니다. 기본 문법은 다음과 같습니다.
SELECT column_name1, ..., aggregate_function() FROM yourTableName GROUP BY column_name;
실제 쿼리를 적용해 보겠습니다.
mysql> SELECT address, count(*) from GroupDemo1 group by address;
실행 결과:
+---------+----------+
| address | count(*) |
+---------+----------+
| US | 3 |
| UK | 1 |
+---------+----------+
2 rows in set (0.00 sec)
'US'는 3건, 'UK'는 1건으로 그룹별 건수가 정상적으로 집계되었습니다.
정리: DISTINCT vs GROUP BY, 무엇을 써야 할까?
- SELECT DISTINCT: 단순히 중복 값을 제거하고 고유한 값 목록만 필요할 때 적합합니다.
- GROUP BY: 그룹별로 데이터를 묶어 COUNT, SUM, AVG 등의 집계 연산을 수행해야 할 때 적합합니다.
두 구문 모두 내부적으로 유사한 방식으로 처리되지만, 목적에 맞게 선택하는 것이 좋습니다. 단순 중복 제거라면 DISTINCT를, 그룹 단위 통계나 집계가 필요하다면 GROUP BY를 사용하는 것이 MySQL 쿼리 작성의 기본 원칙입니다.