MySQL에서 특정 쿼리 결과의 전체 행 수(row count)를 구하려면 집계 함수 COUNT(*)를 서브쿼리(subquery) 형태로 활용하면 됩니다. 이 방식은 메인 쿼리의 각 행마다 테이블의 총 행 수를 함께 출력할 수 있어, 목록 조회 시 전체 건수를 동시에 확인해야 하는 경우에 유용합니다.
1. 예제 테이블 생성
먼저 실습용 테이블을 생성합니다.
mysql> create table DemoTable
(
StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentFirstName varchar(20),
StudentAge int
);
Query OK, 0 rows affected (0.48 sec)
2. 샘플 데이터 삽입
INSERT 명령을 사용해 학생 데이터를 여러 건 입력합니다.
mysql> insert into DemoTable(StudentFirstName,StudentAge) values('John',23);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable(StudentFirstName,StudentAge) values('Larry',21);
Query OK, 1 row affected (0.40 sec)
mysql> insert into DemoTable(StudentFirstName,StudentAge) values('Johnny',23);
Query OK, 1 row affected (0.43 sec)
mysql> insert into DemoTable(StudentFirstName,StudentAge) values('Chris',21);
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable(StudentFirstName,StudentAge) values('David',23);
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable(StudentFirstName,StudentAge) values('James',21);
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable(StudentFirstName,StudentAge) values('Jace',24);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(StudentFirstName,StudentAge) values('Mike',21);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable(StudentFirstName,StudentAge) values('Robert',25);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable(StudentFirstName,StudentAge) values('Mike',22);
Query OK, 1 row affected (0.23 sec)
3. 저장된 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+-----------+------------------+------------+ | StudentId | StudentFirstName | StudentAge | +-----------+------------------+------------+ | 1 | John | 23 | | 2 | Larry | 21 | | 3 | Johnny | 23 | | 4 | Chris | 21 | | 5 | David | 23 | | 6 | James | 21 | | 7 | Jace | 24 | | 8 | Mike | 21 | | 9 | Robert | 25 | | 10 | Mike | 22 | +-----------+------------------+------------+ 10 rows in set (0.00 sec)
4. 서브쿼리로 전체 행 수 구하기
아래 쿼리처럼 메인 쿼리 안에 (select count(*) from DemoTable) 서브쿼리를 넣으면, 각 행마다 테이블의 총 행 수가 별도 컬럼으로 함께 출력됩니다.
mysql> select StudentFirstName,(select count(*) from DemoTable) AS Total_Count from DemoTable limit 10;
실행 결과는 다음과 같습니다.
+------------------+-------------+ | StudentFirstName | Total_Count | +------------------+-------------+ | John | 10 | | Larry | 10 | | Johnny | 10 | | Chris | 10 | | David | 10 | | James | 10 | | Jace | 10 | | Mike | 10 | | Robert | 10 | | Mike | 10 | +------------------+-------------+ 10 rows in set (0.03 sec)
참고: 상황별 최적의 COUNT 방법
- 테이블 전체 행 수만 필요한 경우: 단순히
SELECT COUNT(*) FROM 테이블명;을 실행하는 것이 가장 빠릅니다. InnoDB 스토리지 엔진은 인덱스를 스캔하여 카운트를 계산합니다. - 조회 결과와 함께 전체 건수를 표시해야 하는 경우(페이징 등): 위 예제처럼 서브쿼리로
COUNT(*)를 함께 조회하거나, 애플리케이션 레벨에서 별도의 COUNT 쿼리를 한 번 더 실행하는 방식을 사용할 수 있습니다. - MySQL 8.0 이상: 윈도우 함수인
COUNT(*) OVER()를 활용하면 서브쿼리 없이도 동일한 결과를 얻을 수 있어 코드가 더 간결해집니다.
예:SELECT StudentFirstName, COUNT(*) OVER() AS Total_Count FROM DemoTable;