MySQL에서는 IN() 함수와 GROUP BY 절을 함께 사용하면, 여러 개의 행에 각각 흩어져 있는 조건들을 모두 동시에 만족하는 값을 손쉽게 조회할 수 있습니다. 예를 들어 '특정 그룹이 A, B, C 세 가지 값을 모두 가지고 있는지'를 확인해야 하는 경우에 유용합니다.
기본 문법
SELECT yourColumnName1 FROM yourTableName WHERE yourColumnName2 IN(value1, value2, .....N) GROUP BY yourColumnName1 HAVING COUNT(DISTINCT yourColumnName2) = conditionValue;
핵심 아이디어는 다음과 같습니다.
WHERE ... IN(...)으로 관심 있는 값들만 먼저 필터링합니다.GROUP BY로 대상 컬럼 기준으로 그룹화합니다.HAVING COUNT(DISTINCT ...)로 그룹 내에 존재하는 고유 값의 개수가 조건 값과 일치하는지 검사합니다.
예제 테이블 생성
문법을 이해하기 위해 먼저 테이블을 생성해 보겠습니다.
mysql> create table DifferentRows -> ( -> FirstRow int, -> SecondRow int -> ); Query OK, 0 rows affected (0.72 sec)
데이터 삽입
INSERT 명령으로 몇 개의 레코드를 추가합니다.
mysql> insert into DifferentRows values(10,10); Query OK, 1 row affected (0.15 sec) mysql> insert into DifferentRows values(10,100); Query OK, 1 row affected (0.17 sec) mysql> insert into DifferentRows values(10,300); Query OK, 1 row affected (0.16 sec) mysql> insert into DifferentRows values(20,100); Query OK, 1 row affected (0.18 sec)
저장된 데이터 확인
SELECT 문으로 테이블의 전체 레코드를 조회해 보겠습니다.
mysql> select *from DifferentRows;
실행 결과는 다음과 같습니다.
+----------+-----------+ | FirstRow | SecondRow | +----------+-----------+ | 10 | 10 | | 10 | 100 | | 10 | 300 | | 20 | 100 | +----------+-----------+ 4 rows in set (0.00 sec)
여러 조건을 모두 만족하는 값 조회하기
이제 서로 다른 행에 나누어 저장된 조건(SecondRow가 10, 100, 300)을 모두 만족하는 FirstRow 값을 조회하는 쿼리를 실행해 보겠습니다.
mysql> select FirstRow from DifferentRows -> where SecondRow IN(10,100,300) -> group by FirstRow -> having count(distinct SecondRow)=3;
실행 결과는 다음과 같습니다.
+----------+ | FirstRow | +----------+ | 10 | +----------+ 1 row in set (0.00 sec)
결과 해석
FirstRow 값이 10인 데이터는 SecondRow로 10, 100, 300 세 가지 값을 모두 가지고 있으므로 조건을 만족합니다. 반면 FirstRow 값이 20인 데이터는 100 하나만 가지고 있어 고유 값 개수가 3개 미만이므로 결과에서 제외됩니다.
이처럼 IN(), GROUP BY, HAVING COUNT(DISTINCT ...)를 조합하면 여러 행에 분산된 조건을 한 번의 쿼리로 검증할 수 있습니다. 참고로 이 방식은 '관계 나누기(Relational Division)' 문제를 푸는 대표적인 패턴이며, 조건 값의 개수가 많아질 때도 COUNT(DISTINCT ...)의 비교 값만 바꿔 주면 되므로 확장성이 뛰어납니다.