MySQL에서는 단일 열뿐만 아니라 두 개 이상의 열을 조합해서도 IN 조건을 사용할 수 있습니다. 이 방식은 '행 생성자(row constructor)'라고 불리며, 여러 열의 값 조합이 특정 패턴과 일치하는 레코드만 필터링할 때 매우 유용합니다.
이 글에서는 예제 테이블을 만들고, 두 개의 열(First, Second)에 대해 IN 조건을 적용해 원하는 레코드만 조회하는 과정을 단계별로 살펴보겠습니다.
1. 예제 테이블 생성
먼저 두 개의 정수형 열을 가진 테이블을 생성합니다.
mysql> create table DemoTable810( First int, Second int);Query OK, 0 rows affected (0.73 sec)
2. 레코드 삽입
INSERT 명령을 사용해 테이블에 샘플 데이터를 입력합니다.
mysql> insert into DemoTable810 values(20,40);Query OK, 1 row affected (0.10 sec)mysql> insert into DemoTable810 values(70,90);Query OK, 1 row affected (0.22 sec)mysql> insert into DemoTable810 values(120,150);Query OK, 1 row affected (0.20 sec)mysql> insert into DemoTable810 values(78,128);Query OK, 1 row affected (0.32 sec)
3. 전체 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable810;
실행 결과는 다음과 같습니다.
+-------+--------+| First | Second |+-------+--------+| 20 | 40 || 70 | 90 || 120 | 150 || 78 | 128 |+-------+--------+4 rows in set (0.00 sec)
4. 두 개의 열에 IN 조건 적용하기
핵심은 괄호를 사용해 열들을 하나의 튜플로 묶는 것입니다. 아래 쿼리는 (First, Second) 값의 조합이 (120,150) 또는 (20,40)과 정확히 일치하는 레코드만 반환합니다.
mysql> select *from DemoTable810 where (First,Second) IN((120,150),(20,40));
실행 결과는 다음과 같습니다.
+-------+--------+| First | Second |+-------+--------+| 20 | 40 || 120 | 150 |+-------+--------+2 rows in set (0.00 sec)
동작 원리 정리
위 쿼리에서 WHERE 절의 (First,Second)는 두 열의 값을 하나의 행 값(row value)으로 묶어줍니다. 그런 다음 IN 목록 안의 각 튜플 (120,150), (20,40)과 순서대로 비교하며, 두 열의 값이 모두 일치하는 경우에만 해당 레코드가 결과에 포함됩니다.
예를 들어 First가 120이지만 Second가 150이 아닌 레코드나, First와 Second 중 하나만 일치하는 레코드는 제외됩니다. 즉, 각 열을 따로따로 비교하는 것이 아니라 값의 조합 전체를 기준으로 매칭이 이루어지는 것이 핵심입니다.
이처럼 행 생성자와 IN을 함께 사용하면 복잡한 OR 조건문을 작성하지 않고도 깔끔하고 가독성 높은 쿼리로 여러 열의 조합 조건을 처리할 수 있습니다.