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

MySQL에서 동일한 테이블 내 다른 ID를 가진 행 중 공통 값을 조회하는 방법

MySQL GROUP BY와 HAVING 절로 공통 값 조회하기

동일한 테이블 안에서 서로 다른 ID를 가진 여러 행 중에 특정 값이 반복적으로 나타나는 경우를 찾고 싶다면 GROUP BY 절과 HAVING 절을 함께 사용하면 됩니다. GROUP BY로 데이터를 그룹화한 뒤, HAVING 조건을 통해 그룹별 개수가 일정 기준을 넘는 행만 필터링하는 방식입니다.

실제 예제를 통해 단계별로 살펴보겠습니다.

1단계: 테이블 생성

먼저 예제에 사용할 테이블을 생성합니다.

mysql> create table DemoTable1467
    -> (
    -> Id int,
    -> Name varchar(20)
    -> );
Query OK, 0 rows affected (0.64 sec)

2단계: 데이터 삽입

INSERT 명령어를 사용해 몇 개의 레코드를 입력합니다. 이때 ID 100번 'Chris' 데이터는 의도적으로 세 번 반복해서 삽입합니다.

mysql> insert into DemoTable1467 values(100,'Chris');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable1467 values(110,'David');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable1467 values(120,'Mike');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable1467 values(100,'Chris');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable1467 values(130,'Carol');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable1467 values(100,'Chris');
Query OK, 1 row affected (0.20 sec)

3단계: 전체 데이터 확인

SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.

mysql> select * from DemoTable1467;

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

+------+-------+
| Id   | Name |
+------+-------+
|  100 | Chris |
|  110 | David |
|  120 | Mike  |
|  100 | Chris |
|  130 | Carol |
|  100 | Chris |
+------+-------+
6 rows in set (0.00 sec)

출력 결과를 보면 ID 100인 'Chris' 행이 총 세 번 등장한 것을 확인할 수 있습니다.

4단계: GROUP BY HAVING으로 공통 값 조회

이제 동일한 테이블에서 다른 ID(행)들 사이에 공통 값이 2개보다 많이 나타나는 행을 조회하는 쿼리입니다.

mysql> select Id,Name,count(*) as IdCount from DemoTable1467
    -> group by Id
    -> having IdCount > 2;

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

+------+-------+---------+
| Id   | Name |  IdCount |
+------+-------+---------+
|  100 | Chris |        3 |
+------+-------+---------+
1 row in set (0.00 sec)

쿼리 동작 원리 정리

위 쿼리의 핵심 로직은 다음과 같습니다.

GROUP BY Id: ID 값을 기준으로 행들을 그룹화합니다. 같은 ID를 가진 행들은 하나의 그룹으로 묶입니다.

COUNT(*) AS IdCount: 각 그룹에 속한 행의 개수를 계산하여 별칭(IdCount)으로 표시합니다.

HAVING IdCount > 2: WHERE 절은 집계 함수와 함께 사용할 수 없기 때문에, 집계 결과에 조건을 적용하려면 HAVING 절을 사용해야 합니다. 여기서는 개수가 2보다 큰, 즉 3번 이상 반복된 그룹만 결과로 반환합니다.

결과적으로 ID 100('Chris')만 세 번 등록되어 있으므로 해당 행 하나만 조회됩니다. 만약 두 번 이상 반복된 모든 행을 찾고 싶다면 조건을 having IdCount > 1로 변경하면 됩니다.