테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1468
-> (
-> Id int,
-> Name varchar(20),
-> Age int
-> );
Query OK, 0 rows affected (1.21 sec)
샘플 데이터 삽입하기
INSERT 문으로 레코드를 추가합니다. 이때 Id와 Name이 서로 겹치는 데이터를 일부러 포함시켜 중복 상황을 만들어 보겠습니다.
mysql> insert into DemoTable1468 values(100,'Chris',23); Query OK, 1 row affected (0.19 sec) mysql> insert into DemoTable1468 values(101,'Bob',25); Query OK, 1 row affected (0.12 sec) mysql> insert into DemoTable1468 values(102,'David',30); Query OK, 1 row affected (0.11 sec) mysql> insert into DemoTable1468 values(100,'Chris',23); Query OK, 1 row affected (0.35 sec) mysql> insert into DemoTable1468 values(100,'Chris',38); Query OK, 1 row affected (0.14 sec) mysql> insert into DemoTable1468 values(101,'Bob',23); Query OK, 1 row affected (0.13 sec)
전체 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select * from DemoTable1468;
실행 결과는 다음과 같습니다.
+------+-------+------+ | Id | Name | Age | +------+-------+------+ | 100 | Chris | 23 | | 101 | Bob | 25 | | 102 | David | 30 | | 100 | Chris | 23 | | 100 | Chris | 38 | | 101 | Bob | 23 | +------+-------+------+ 6 rows in set (0.00 sec)
결과를 보면 Id 100 'Chris'와 Id 101 'Bob' 조합이 여러 번 반복되어 저장되어 있는 것을 확인할 수 있습니다.
중복 행 제거 후 대표 행 조회하기
중복되거나 유사한 내용의 행을 한 번씩만 남기고 조회하려면 GROUP BY 절과 HAVING 절을 함께 사용하면 됩니다.
mysql> select Id,Name,Age from DemoTable1468
-> group by Name,Id
-> having max(Age);
실행 결과는 다음과 같습니다.
+------+-------+------+ | Id | Name | Age | +------+-------+------+ | 100 | Chris | 23 | | 101 | Bob | 25 | | 102 | David | 30 | +------+-------+------+ 3 rows in set (0.00 sec)
쿼리 동작 원리
GROUP BY Name, Id는 이름과 Id가 동일한 행들을 하나의 그룹으로 묶어 주기 때문에, 결과 집합에는 각 조합이 한 번씩만 나타나게 됩니다. 이어지는 HAVING max(Age) 조건은 그룹별 Age 최댓값이 유효한(0이 아닌) 그룹만 통과시켜 불필요한 행을 걸러 줍니다.
참고로 각 그룹의 실제 최댓값 자체를 화면에 출력하고 싶다면 SELECT 목록에 MAX(Age)를 함께 지정하거나, 해당 열을 기준으로 정렬하는 방식을 활용하는 것이 좋습니다.