MySQL에서 고유 ID를 가진 전체 레코드 조회하기
MySQL에서 중복된 ID 값이 존재할 때, 각 ID별로 하나의 레코드만 조회하고 싶다면 GROUP BY 절을 활용하면 됩니다. 기본 문법은 다음과 같습니다.
SELECT * FROM 테이블명 GROUP BY 컬럼명;
예제 테이블 생성
문법을 실제로 이해하기 위해 간단한 테이블을 만들어 보겠습니다.
mysql> create table DistinctIdDemo
-> (
-> Id int,
-> Name varchar(20),
-> Age int
-> );
Query OK, 0 rows affected (1.03 sec)중복된 ID 데이터 삽입
INSERT 명령으로 몇 개의 레코드를 추가합니다. 이때 의도적으로 ID에 중복 값을 넣었습니다.
mysql> insert into DistinctIdDemo values(1,'Mike',23); Query OK, 1 row affected (0.16 sec) mysql> insert into DistinctIdDemo values(2,'Sam',24); Query OK, 1 row affected (0.20 sec) mysql> insert into DistinctIdDemo values(1,'Carol',23); Query OK, 1 row affected (0.15 sec) mysql> insert into DistinctIdDemo values(1,'John',28); Query OK, 1 row affected (0.33 sec) mysql> insert into DistinctIdDemo values(3,'David',26); Query OK, 1 row affected (0.22 sec) mysql> insert into DistinctIdDemo values(2,'Larry',29); Query OK, 1 row affected (0.20 sec)
전체 레코드 확인
먼저 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DistinctIdDemo;
실행 결과는 다음과 같습니다.
+------+-------+------+ | Id | Name | Age | +------+-------+------+ | 1 | Mike | 23 | | 2 | Sam | 24 | | 1 | Carol | 23 | | 1 | John | 28 | | 3 | David | 26 | | 2 | Larry | 29 | +------+-------+------+ 6 rows in set (0.00 sec)
위 결과에서 볼 수 있듯이 ID 1은 세 번, ID 2는 두 번 반복되어 있습니다.
GROUP BY로 고유 ID만 조회
이제 GROUP BY를 사용하여 각 ID별로 하나의 레코드만 가져오는 쿼리입니다.
mysql> select *from DistinctIdDemo group by Id;
실행 결과는 다음과 같습니다.
+------+-------+------+ | Id | Name | Age | +------+-------+------+ | 1 | Mike | 23 | | 2 | Sam | 24 | | 3 | David | 26 | +------+-------+------+ 3 rows in set (0.00 sec)
중복되던 6개의 레코드가 ID 기준으로 그룹화되어 3개의 행만 반환된 것을 확인할 수 있습니다.
주의 사항
MySQL 5.7 이상 버전에서는 기본적으로 ONLY_FULL_GROUP_BY 모드가 활성화되어 있어, 위와 같은 쿼리가 오류를 발생시킬 수 있습니다. 이 경우 다음과 같은 대안을 사용하는 것이 좋습니다.
- SELECT 절에 GROUP BY에 사용한 컬럼 외에는 집계 함수(MIN, MAX 등)를 적용합니다. 예:
SELECT Id, MIN(Name), MIN(Age) FROM DistinctIdDemo GROUP BY Id; - 윈도우 함수인
ROW_NUMBER()를 사용해 각 ID의 첫 번째 레코드만 선택합니다.
이처럼 GROUP BY를 활용하면 중복된 ID 중 하나씩만 골라서 조회할 수 있으며, 상황에 맞게 집계 함수나 윈도우 함수를 함께 사용하면 더욱 안정적인 쿼리를 작성할 수 있습니다.