Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 중복·유사 데이터가 있는 행을 정리하고 SELECT 문으로 그룹별 대표 행 조회하기

테이블 생성하기

먼저 예제에 사용할 테이블을 생성합니다.

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)를 함께 지정하거나, 해당 열을 기준으로 정렬하는 방식을 활용하는 것이 좋습니다.