특정 조건에 해당하는 두 개의 정확한 값을 가진 레코드를 조회하려면 GROUP BY 절과 HAVING 절을 함께 사용하면 됩니다. 이 방법은 여러 행에 걸쳐 조건을 검증해야 할 때 특히 유용합니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable
(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Value int
);
Query OK, 0 rows affected (0.52 sec)2. 샘플 데이터 삽입하기
INSERT 명령을 사용하여 테이블에 레코드를 추가합니다. 같은 값(600, 800)이 각각 두 번씩 들어가 있는 것이 핵심입니다.
mysql> insert into DemoTable(Value) values(600); Query OK, 1 row affected (0.14 sec) mysql> insert into DemoTable(Value) values(600); Query OK, 1 row affected (0.14 sec) mysql> insert into DemoTable(Value) values(800); Query OK, 1 row affected (0.12 sec) mysql> insert into DemoTable(Value) values(800); Query OK, 1 row affected (0.09 sec)
3. 전체 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+----+-------+ | Id | Value | +----+-------+ | 1 | 600 | | 2 | 600 | | 3 | 800 | | 4 | 800 | +----+-------+ 4 rows in set (0.00 sec)
4. 두 개의 정확한 값을 가진 레코드 조회 쿼리
Id가 1과 2인 두 레코드가 서로 동일한 값을 가지고 있는지 확인하는 쿼리는 다음과 같습니다.
mysql> select Value from DemoTable tbl where Id IN(1,2) group by Value having count(distinct Id)=2;
실행 결과는 다음과 같습니다.
+-------+ | Value | +-------+ | 600 | +-------+ 1 row in set (0.07 sec)
쿼리 동작 원리
이 쿼리가 어떻게 작동하는지 살펴보겠습니다.
WHERE Id IN(1,2) : 먼저 Id가 1 또는 2인 레코드만 필터링합니다.
GROUP BY Value : Value 값을 기준으로 레코드를 그룹화합니다.
HAVING COUNT(DISTINCT Id) = 2 : 각 그룹 내에서 서로 다른 Id의 개수가 정확히 2개인 그룹만 남깁니다.
결과적으로 Id 1과 2가 모두 포함된 유일한 그룹은 Value가 600인 그룹이므로, 위와 같은 결과가 출력됩니다. 만약 Id 1은 600, Id 2는 800처럼 값이 달랐다면 아무런 결과도 반환되지 않습니다.