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

MySQL에서 두 개의 서로 다른 행 집합 개수를 구한 뒤 나누는 방법

MySQL에서 하나의 테이블에 대해 조건이 서로 다른 두 행 집합의 개수(COUNT)를 각각 구한 뒤, 그 값을 나누어야 하는 경우가 있습니다. 예를 들어 특정 조건을 만족하는 행 수와 만족하지 않는 행 수의 비율을 구할 때 유용합니다.

이 작업은 count(*) 함수와 스칼라 서브쿼리(scalar subquery)를 활용하면 간단하게 처리할 수 있습니다. 아래 예제를 통해 단계별로 살펴보겠습니다.

1. 테이블 생성

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

mysql> create table DemoTable(isMarried tinyint(1));
Query OK, 0 rows affected (0.53 sec)

2. 데이터 삽입

insert 명령을 사용해 몇 개의 레코드를 추가합니다.

mysql> insert into DemoTable values(1);
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable values(0);
Query OK, 1 row affected (0.26 sec)
mysql> insert into DemoTable values(1);
Query OK, 1 row affected (0.07 sec)
mysql> insert into DemoTable values(1);
Query OK, 1 row affected (0.26 sec)
mysql> insert into DemoTable values(1);
Query OK, 1 row affected (0.17 sec)

3. 저장된 데이터 확인

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

mysql> select *from DemoTable;

위 쿼리는 다음과 같은 결과를 출력합니다.

+-----------+
| isMarried |
+-----------+
| 1         |
| 0         |
| 1         |
| 1         |
| 1         |
+-----------+
5 rows in set (0.00 sec)

현재 테이블에는 isMarried = 1인 행이 4개, isMarried = 0인 행이 1개 저장되어 있습니다.

4. 두 행 집합의 개수를 구해 나누는 쿼리

다음은 테이블에서 서로 다른 두 행 집합의 개수를 각각 구한 뒤 나누는 쿼리입니다. 각 조건별 COUNT를 서브쿼리로 계산하고, SELECT 절에서 나눗셈을 수행합니다.

mysql> select
    (
      select count(*) from DemoTable where isMarried=1) /
    (
      select count(*) from DemoTable where isMarried=0
    ) AS divide from dual;

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

+--------+
| divide |
+--------+
| 4.0000 |
+--------+
1 row in set (0.00 sec)

결과 해석 및 참고 사항

isMarried가 1인 행은 4개, 0인 행은 1개이므로 나눗셈 결과는 4.0000이 됩니다. MySQL에서 정수끼리 나누더라도 기본적으로 소수점 결과가 반환되므로 별도의 형 변환이 필요하지 않습니다.

여기서 사용된 dual은 값을 계산만 하고 실제 테이블 조회가 필요 없는 경우에 사용하는 가상(더미) 테이블입니다. MySQL에서는 FROM 절을 생략해도 동일하게 동작하므로 select (...) / (...) AS divide;처럼 작성해도 됩니다.

또한 분모가 0이 되는 상황(예: isMarried=0인 행이 없는 경우)에는 NULL이 반환되거나 오류가 발생할 수 있으므로, 실무에서는 NULLIF() 또는 CASE 문을 사용해 0으로 나누는 상황을 미리 처리해 주는 것이 안전합니다.