MySQL에서 여러 행이 공유하는 동일한 열 값을 찾으려면 GROUP BY 절과 HAVING 절을 함께 사용하면 됩니다. 이 글에서는 예제 테이블을 직접 만들어 보면서 단계별로 쿼리를 작성하는 방법을 살펴보겠습니다.
1단계: 예제 테이블 생성
먼저 학생 정보를 담을 테이블을 생성합니다.
mysql> create table DemoTable
-> (
-> StudentId int,
-> StudentMarks int
-> );
Query OK, 0 rows affected (4.71 sec)
2단계: 데이터 삽입
INSERT 명령을 사용해 테이블에 레코드를 추가합니다.
mysql> insert into DemoTable values(23,58); Query OK, 1 row affected (0.70 sec) mysql> insert into DemoTable values(25,89); Query OK, 1 row affected (0.46 sec) mysql> insert into DemoTable values(26,58); Query OK, 1 row affected (1.13 sec) mysql> insert into DemoTable values(28,98); Query OK, 1 row affected (0.86 sec)
3단계: 전체 데이터 확인
SELECT 문으로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
출력 결과
+-----------+--------------+ | StudentId | StudentMarks | +-----------+--------------+ | 23 | 58 | | 25 | 89 | | 26 | 58 | | 28 | 98 | +-----------+--------------+ 4 rows in set (0.00 sec)
결과를 보면 학생 ID 23번과 26번이 모두 58점이라는 동일한 점수를 받았음을 알 수 있습니다.
4단계: 동일한 열 값을 가진 행 조회하기
다음은 GROUP BY와 HAVING 절을 사용하여 두 학생(23번, 26번)이 공통으로 가진 점수를 조회하는 쿼리입니다.
mysql> select StudentMarks from DemoTable -> group by StudentMarks -> having sum(StudentId=23) > 0 and -> sum(StudentId=26) > 0;
출력 결과
+--------------+ | StudentMarks | +--------------+ | 58 | +--------------+ 1 row in set (0.00 sec)
쿼리 동작 원리
이 쿼리가 어떻게 작동하는지 각 절의 역할을 살펴보겠습니다.
- GROUP BY StudentMarks: 점수(StudentMarks)를 기준으로 행들을 그룹화합니다.
- HAVING sum(StudentId=23) > 0: 해당 그룹 안에 학생 ID 23번이 포함되어 있는지 검사합니다. MySQL에서는 비교 조건식이 참이면 1, 거짓이면 0을 반환하기 때문에 SUM() 함수로 특정 값의 존재 여부를 집계할 수 있습니다.
- sum(StudentId=26) > 0: 마찬가지로 학생 ID 26번도 같은 그룹에 속해 있는지 확인합니다.
두 조건을 모두 충족하는 그룹, 즉 23번과 26번 학생이 동시에 가진 점수는 58점 하나뿐이므로 위와 같은 결과가 출력됩니다. 이 패턴은 특정 여러 레코드가 공통으로 가지는 값을 찾아야 할 때 유용하게 활용할 수 있습니다.