MySQL에서 중복된 값을 제외하고 고유한 값만 조회하려면 GROUP BY 절과 COUNT 함수를 함께 사용하면 됩니다. COUNT 결과가 1인 그룹, 즉 테이블 내에서 단 한 번만 나타나는 값만 필터링하는 방식입니다. 기본 문법은 다음과 같습니다.
select yourColumnName from yourTableName group by yourColumnName having count(*)=1;
1. 예제 테이블 생성
먼저 실습에 사용할 테이블을 생성합니다.
mysql> create table DemoTable
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Subject varchar(100)
-> );
Query OK, 0 rows affected (0.70 sec)
2. 데이터 삽입
INSERT 명령으로 여러 개의 레코드를 추가합니다. 중복 확인을 위해 MongoDB, Java, C는 의도적으로 두 번씩 입력했습니다.
mysql> insert into DemoTable(Subject) values('MySQL');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable(Subject) values('MongoDB');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable(Subject) values('Java');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable(Subject) values('MongoDB');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable(Subject) values('C');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable(Subject) values('C++');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable(Subject) values('Java');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable(Subject) values('C');
Query OK, 1 row affected (0.23 sec)3. 전체 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select *from DemoTable;
출력 결과
+----+---------+
| Id | Subject |
+----+---------+
| 1 | MySQL |
| 2 | MongoDB |
| 3 | Java |
| 4 | MongoDB |
| 5 | C |
| 6 | C++ |
| 7 | Java |
| 8 | C |
+----+---------+
8 rows in set (0.00 sec)
4. 중복 값 제외 쿼리 실행
HAVING COUNT(*) = 1 조건을 적용하면 두 번 이상 등장하지 않는 값만 결과로 반환됩니다.
mysql> select Subject from DemoTable group by Subject having count(*)=1;
출력 결과
+---------+
| Subject |
+---------+
| MySQL |
| C++ |
+---------+
2 rows in set (0.00 sec)
실행 결과를 보면 MongoDB, Java, C는 각각 두 번씩 저장되어 있어 결과에서 제외되었고, 한 번만 등장한 MySQL과 C++만 출력된 것을 확인할 수 있습니다.
참고로, 중복을 제거한 전체 목록이 필요하다면 DISTINCT 키워드를 사용하고, 오직 한 번만 나타나는 값만 필요하다면 위 예제처럼 HAVING COUNT(*)=1 방식을 사용하는 것이 좋습니다. 두 방법의 목적이 다르므로 상황에 맞게 선택하시기 바랍니다.