MySQL에서 여러 열에 걸쳐 특정 값(예: 1)이 총 몇 번 등장하는지, 또는 모든 열이 특정 값을 만족하는 행이 몇 개인지 확인해야 할 때가 있습니다. 이럴 때 SUM() 함수와 산술·논리 연산자를 함께 사용하면 간단하게 해결할 수 있습니다.
기본 문법
select sum(yourColumnName1+yourColumnName2+yourColumnName3...N) as `anyAliasName1`, sum(yourColumnName1 and yourColumnName2 and yourColumnName3....N) as anyAliasName from yourTableName;
두 방식의 차이는 다음과 같습니다.
- + 연산자: 각 행마다 열들의 값을 더한 뒤 전체 합계를 구합니다. 즉, 1이 등장한 총 횟수를 반환합니다.
- AND 연산자: 모든 열이 1일 때만 1로 평가되므로, 세 열이 모두 1인 행의 개수를 반환합니다.
예제 테이블 생성
먼저 실습에 사용할 테이블을 만들어 보겠습니다.
mysql> create table demo36 -> ( -> id int not null auto_increment primary key, -> value1 int, -> value2 int, -> value3 int -> ); Query OK, 0 rows affected (1.68 sec)
데이터 삽입
INSERT 명령어를 사용해 샘플 레코드를 추가합니다.
mysql> insert into demo36(value1,value2,value3) values(1,0,0); Query OK, 1 row affected (0.14 sec) mysql> insert into demo36(value1,value2,value3) values(1,0,1); Query OK, 1 row affected (0.11 sec) mysql> insert into demo36(value1,value2,value3) values(1,1,1); Query OK, 1 row affected (0.22 sec) mysql> insert into demo36(value1,value2,value3) values(0,1,0); Query OK, 1 row affected (0.12 sec) mysql> insert into demo36(value1,value2,value3) values(1,1,0); Query OK, 1 row affected (0.10 sec)
저장된 데이터 확인
SELECT 문으로 테이블의 내용을 조회해 보겠습니다.
mysql> select * from demo36;
위 쿼리는 다음과 같은 결과를 출력합니다.
+----+--------+--------+--------+ | id | value1 | value2 | value3 | +----+--------+--------+--------+ | 1 | 1 | 0 | 0 | | 2 | 1 | 0 | 1 | | 3 | 1 | 1 | 1 | | 4 | 0 | 1 | 0 | | 5 | 1 | 1 | 0 | +----+--------+--------+--------+ 5 rows in set (0.00 sec)
특정 값이 있는 열 개수 계산 쿼리
이제 MySQL에서 특정 값(1)을 가진 열의 개수를 계산하는 실제 쿼리입니다.
mysql> select -> sum(value1+value2+value3) as `Total_Number_Of_1`, -> sum(value1 and value2 and value3) as `Total_Number_Of_Rows_With_1` -> from demo36;
실행 결과는 다음과 같습니다.
+-------------------+-----------------------------+ | Total_Number_Of_1 | Total_Number_Of_Rows_With_1 | +-------------------+-----------------------------+ | 9 | 1 | +-------------------+-----------------------------+ 1 row in set (0.00 sec)
결과 해석
- Total_Number_Of_1 = 9: + 연산자를 사용했기 때문에 전체 데이터에서 1이 등장한 총 횟수를 의미합니다.
- Total_Number_Of_Rows_With_1 = 1: AND 연산자를 사용했기 때문에 value1, value2, value3가 모두 1인 행(id=3)만 카운트된 것입니다.
이처럼 SUM() 함수에 어떤 연산자를 조합하느냐에 따라 '값의 총 개수'와 '조건을 만족하는 행 수'를 목적에 맞게 손쉽게 구할 수 있습니다.