MySQL에서 하나의 열이 여러 값을 동시에 만족하는 행을 선택하려면 GROUP BY 절과 HAVING 절을 IN() 연산자와 함께 사용하면 됩니다. 이 글에서는 실제 예제를 통해 그 방법을 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1885
(
FirstName varchar(20),
Subject varchar(50)
);
Query OK, 0 rows affected (0.00 sec)2. 데이터 삽입하기
INSERT 명령어를 사용하여 테이블에 레코드를 추가합니다.
mysql> insert into DemoTable1885 values('John','MySQL');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1885 values('John','MongoDB');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1885 values('Carol','MySQL');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1885 values('David','Java');
Query OK, 1 row affected (0.00 sec)3. 테이블 데이터 확인하기
SELECT 문으로 저장된 데이터를 조회해 보겠습니다.
mysql> select * from DemoTable1885;
실행 결과는 다음과 같습니다.
+-----------+---------+ | FirstName | Subject | +-----------+---------+ | John | MySQL| | John | MongoDB| | Carol | MySQL| | David | Java | +-----------+---------+ 4 rows in set (0.00 sec)
4. 여러 값을 모두 만족하는 행 선택하기
핵심 쿼리는 다음과 같습니다. 'MySQL'과 'MongoDB' 두 값을 모두 가진 사람(FirstName)을 찾는 쿼리입니다.
mysql> select FirstName from DemoTable1885
where Subject IN('MySQL','MongoDB')
group by FirstName
having count(*)=2;실행 결과는 다음과 같습니다.
+-----------+ | FirstName | +-----------+ | John | +-----------+ 1 row in set (0.00 sec)
쿼리 동작 원리
이 쿼리가 어떻게 작동하는지 단계별로 살펴보겠습니다.
- WHERE Subject IN('MySQL','MongoDB'): 먼저 Subject 열의 값이 'MySQL' 또는 'MongoDB'인 행만 필터링합니다. 따라서 'Java'를 가진 David는 이 단계에서 제외됩니다.
- GROUP BY FirstName: 필터링된 행을 이름(FirstName) 기준으로 그룹화합니다.
- HAVING count(*) = 2: 각 그룹 내에서 조건에 해당하는 행이 정확히 2개, 즉 두 값을 모두 만족하는 그룹만 최종 결과로 남깁니다.
결과적으로 John은 'MySQL'과 'MongoDB' 두 값을 모두 가지고 있어 결과에 포함되지만, Carol은 'MySQL' 하나만 가지고 있어 제외됩니다. 이처럼 IN()으로 후보 값을 좁힌 뒤 GROUP BY와 HAVING count(*)로 값의 개수를 검증하면, 하나의 열이 여러 값을 모두 충족하는 행을 손쉽게 찾을 수 있습니다.