MySQL에서 한 컬럼에 있는 값이 다른 컬럼에도 존재하는 등 상호 관계(mutual relation)가 있는 행의 개수를 구하려면 집계 함수 COUNT(*)와 셀프 조인(Self Join)을 함께 사용하면 됩니다. 이 글에서는 예제 테이블을 만들고 단계별로 쿼리를 작성하는 방법을 살펴보겠습니다.
1. 예제 테이블 생성
먼저 두 개의 정수 컬럼을 가진 테이블을 생성합니다.
mysql> create table DemoTable1543
-> (
-> Value1 int,
-> Value2 int
-> );
Query OK, 0 rows affected (1.36 sec)
2. 샘플 데이터 삽입
INSERT 명령을 사용해 몇 개의 레코드를 입력합니다.
mysql> insert into DemoTable1543 values(57,60);
Query OK, 1 row affected (0.52 sec)
mysql> insert into DemoTable1543 values(60,68);
Query OK, 1 row affected (0.38 sec)
mysql> insert into DemoTable1543 values(90,98);
Query OK, 1 row affected (0.36 sec)
mysql> insert into DemoTable1543 values(98,90);
Query OK, 1 row affected (0.20 sec)
3. 저장된 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select * from DemoTable1543;
위 쿼리는 다음과 같은 결과를 출력합니다.
+--------+--------+
| Value1 | Value2 |
+--------+--------+
| 57 | 60 |
| 60 | 68 |
| 90 | 98 |
| 98 | 90 |
+--------+--------+
4 rows in set (0.00 sec)
4. 상호 관계가 있는 행 개수 세기
여기서 확인하고 싶은 것은 90이라는 값이 Value1과 Value2 양쪽에 서로 연결되어 존재하는지, 즉 (90, 98)과 (98, 90)처럼 순서만 바뀐 쌍이 있는 경우입니다.
이를 위해 같은 테이블을 자기 자신과 조인(셀프 조인)한 뒤, 첫 번째 별칭(tbl1)의 Value1이 90이고 조인된 두 번째 별칭(tbl2)의 Value2가 90이 되는 조건을 걸어 행 수를 세면 됩니다.
mysql> select count(*) from DemoTable1543 tbl1
-> join DemoTable1543 tbl2
-> on tbl1.Value2=tbl2.Value1
-> where tbl1.Value1=90 and tbl2.Value2=90;
실행 결과
+----------+
| count(*) |
+----------+
| 1 |
+----------+
1 row in set (0.00 sec)
쿼리 동작 원리
- tbl1.Value2 = tbl2.Value1: 첫 번째 행의 Value2 값과 일치하는 Value1 값을 가진 행을 찾아 연결합니다.
- tbl1.Value1 = 90: 시작점이 되는 행의 Value1이 90인 경우만 대상으로 제한합니다.
- tbl2.Value2 = 90: 연결된 행의 Value2 역시 90이어야 하므로, 90 → 98 → 90처럼 양방향으로 순환되는 관계만 최종적으로 남게 됩니다.
결과적으로 COUNT(*)가 1을 반환했으므로, 90을 포함하는 상호 관계(순환 쌍)가 하나 존재한다는 것을 확인할 수 있습니다. 이 방식은 특정 값뿐 아니라 WHERE 절 조건만 바꾸면 어떤 값에 대해서도 동일하게 응용할 수 있습니다.