Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 여러 SELECT 결과를 하나로 병합하는 방법 – GROUP BY와 HAVING 활용

여러 개의 SELECT 조건을 하나의 쿼리로 병합해 처리하려면 GROUP BY 절과 HAVING 절을 함께 활용해야 합니다. 이 글에서는 실제 테이블 생성부터 데이터 삽입, 그리고 병합 쿼리 작성까지 단계별로 자세히 살펴보겠습니다.

예제 테이블 생성하기

먼저 개념을 이해하기 위해 간단한 테이블을 만들어 보겠습니다. 아래 쿼리로 'MergingSelectDemo' 테이블을 생성합니다.

mysql> create table MergingSelectDemo
-> (
-> RoomServicesId int,
-> RoomId int,
-> ServiceId int
-> );
Query OK, 0 rows affected (1.98 sec)

샘플 데이터 삽입하기

테이블 생성이 완료되면 INSERT 명령어를 사용해 레코드를 추가합니다.

mysql> insert into MergingSelectDemo values(10,10,10);
Query OK, 1 row affected (0.29 sec)
mysql> insert into MergingSelectDemo values(20,10,20);
Query OK, 1 row affected (0.22 sec)
mysql> insert into MergingSelectDemo values(30,10,30);
Query OK, 1 row affected (0.14 sec)
mysql> insert into MergingSelectDemo values(50,10,50);
Query OK, 1 row affected (0.19 sec)
mysql> insert into MergingSelectDemo values(110,20,20);
Query OK, 1 row affected (0.14 sec)
mysql> insert into MergingSelectDemo values(120,20,30);
Query OK, 1 row affected (0.37 sec)

전체 레코드 조회하기

SELECT 문으로 테이블에 저장된 모든 레코드를 확인할 수 있습니다.

mysql> select *from MergingSelectDemo;

실행 결과는 다음과 같습니다.

+----------------+--------+-----------+
| RoomServicesId | RoomId | ServiceId |
+----------------+--------+-----------+
| 10 | 10 | 10 |
| 20 | 10 | 20 |
| 30 | 10 | 30 |
| 50 | 10 | 50 |
| 110 | 20 | 20 |
| 120 | 20 | 30 |
+----------------+--------+-----------+
6 rows in set (0.00 sec)

SELECT 결과를 병합하는 쿼리 작성

핵심은 WHERE 절에서 IN 연산자로 원하는 ServiceId 값을 모두 지정한 뒤, RoomId 기준으로 그룹화하고, HAVING 절에서 필요한 개수만큼의 행을 가진 그룹만 필터링하는 것입니다. 아래는 세 가지 서비스(ID 10, 20, 30)를 모두 보유한 방(RoomId)을 찾는 쿼리입니다.

mysql> select RoomId from MergingSelectDemo
-> where ServiceId IN(10,20,30)
-> group by RoomId
-> HAVING COUNT(*)=3;

실행 결과는 다음과 같습니다.

+--------+
| RoomId |
+--------+
| 10 |
+--------+
1 row in set (0.15 sec)

결과를 해석해 보면, RoomId가 10인 방은 ServiceId 10, 20, 30을 모두 포함하고 있으므로 정상적으로 조회되었습니다. 반면 RoomId 20은 두 개의 서비스만 보유하고 있어 COUNT(*)=3 조건을 충족하지 못해 제외됩니다. 이처럼 GROUP BY와 HAVING을 조합하면 여러 조건을 동시에 만족하는 그룹만 손쉽게 추출할 수 있으며, 복잡한 서브쿼리 없이도 깔끔하게 SELECT 결과를 병합할 수 있습니다.