MySQL에서 고유한(중복되지 않는) 성(last name)을 가진 모든 사용자를 찾으려면 GROUP BY 절과 HAVING COUNT() 함수를 함께 사용하면 됩니다. 이 방법은 특정 성이 테이블 내에서 한 번만 등장하는 경우를 필터링할 때 유용합니다.
먼저 예제에 사용할 테이블을 생성해 보겠습니다.
테이블 생성 예제
mysql> create table demo76
-> (
-> firstName varchar(20),
-> lastName varchar(20)
-> );
Query OK, 0 rows affected (9.29 sec)다음으로 INSERT 명령을 사용하여 테이블에 몇 개의 레코드를 삽입합니다.
데이터 삽입 예제
mysql> insert into demo76 values('John','Doe');
Query OK, 1 row affected (2.52 sec)
mysql> insert into demo76 values('David','Smith');
Query OK, 1 row affected (6.31 sec)
mysql> insert into demo76 values('Adam','Smith');
Query OK, 1 row affected (1.52 sec)SELECT 문을 사용하여 테이블의 레코드를 확인합니다.
데이터 조회 예제
mysql> select *from demo76;
위 쿼리는 다음과 같은 결과를 출력합니다.
출력 결과
+-----------+----------+ | firstName | lastName | +-----------+----------+ | John | Doe | | David | Smith | | Adam | Smith | +-----------+----------+ 3 rows in set (0.00 sec)
삽입된 데이터를 보면 'Smith'라는 성은 David와 Adam 두 명이 공유하고 있고, 'Doe'라는 성은 John 한 명만 가지고 있습니다. 따라서 고유한 성을 가진 사용자는 John뿐입니다.
이제 고유한 성을 가진 모든 사용자를 찾는 실제 쿼리를 살펴보겠습니다.
고유한 성을 가진 사용자 찾기 쿼리
mysql> select max(tbl.firstName), tbl.lastName,
-> count(distinct tbl.firstName) as CountOfFirstName
-> from demo76 as tbl
-> group by tbl.lastName
-> having count(distinct tbl.firstName) = 1;쿼리 동작 방식을 간단히 설명하면 다음과 같습니다.
- GROUP BY tbl.lastName: 성(lastName)을 기준으로 데이터를 그룹화합니다.
- COUNT(DISTINCT tbl.firstName): 각 그룹 내에서 서로 다른 이름(first name)의 개수를 계산합니다.
- HAVING ... = 1: 이름이 하나뿐인 그룹, 즉 해당 성을 가진 사용자가 오직 한 명인 경우만 필터링합니다.
위 쿼리는 다음과 같은 결과를 출력합니다.
출력 결과
+--------------------+----------+------------------+ | max(tbl.firstName) | lastName | CountOfFirstName | +--------------------+----------+------------------+ | John | Doe | 1 | +--------------------+----------+------------------+ 1 row in set (0.00 sec)
결과를 보면 'Doe'라는 성을 가진 John만 출력된 것을 확인할 수 있습니다. 'Smith'는 두 명의 사용자가 공유하고 있어 HAVING 조건에 의해 제외되었습니다. 이처럼 GROUP BY와 HAVING COUNT()를 조합하면 중복 여부에 따른 데이터를 손쉽게 필터링할 수 있습니다.