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

MySQL에서 서로 다른 행에 걸쳐 여러 조건을 모두 만족하는 값 선택하기

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 ...)의 비교 값만 바꿔 주면 되므로 확장성이 뛰어납니다.