3.3.4.8 행의 카운트
데이터베이스는 "테이블에서 특정 유형의 데이터가 얼마나 자주 나타나는가?"라는 질문에 대답하기 위해 사용되는 경우가 종종 있습니다. 예를 들어, 몇 마리 애완 동물을 기르고 있는지, 각각의 소유자가 몇 마리의 애완 동물을 소유하고 있는지를 조회하거나 동물에 다양한 개체수 조사를 실시 할 수있을 것입니다.
애완 동물의 수를 계산하는 것은 " pet
테이블에는 몇 줄 있느냐 '는 질문에 해당합니다. 이 테이블에는 애완 동물 당 하나의 레코드가 존재하기 때문입니다. COUNT(*)
행 수를 계산하기 위해 애완 동물의 수를 계산하는 쿼리는 다음과 같이됩니다.
mysql> SELECT COUNT(*) FROM pet;
+----------+
| COUNT(*) |
+----------+
| 9 |
+----------+
전에 애완 동물 소유자의 이름을 취득했습니다. COUNT()
를 사용하여 각 소유자의 애완 동물의 수를 확인할 수 있습니다.
mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner;
+--------+----------+
| owner | COUNT(*) |
+--------+----------+
| Benny | 2 |
| Diane | 2 |
| Gwen | 3 |
| Harold | 2 |
+--------+----------+
이 쿼리는 GROUP BY
를 사용하여 각 owner
의 모든 레코드를 그룹화하고 있습니다. COUNT()
를 GROUP BY
와 함께 사용하면 다양한 그룹화에서 데이터의 특징을 나타낼 수 있습니다. 다음 예제에서는 애완 동물의 개체수 조사를 실행하는 다양한 방법을 보여줍니다.
종마다의 애완 동물 수
mysql> SELECT species, COUNT(*) FROM pet GROUP BY species;
+---------+----------+
| species | COUNT(*) |
+---------+----------+
| bird | 2 |
| cat | 2 |
| dog | 3 |
| hamster | 1 |
| snake | 1 |
+---------+----------+
성별마다의 애완 동물 수
mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex;
+------+----------+
| sex | COUNT(*) |
+------+----------+
| NULL | 1 |
| f | 4 |
| m | 4 |
+------+----------+
(이 출력에서 NULL
은 성별 불명을 나타냅니다.)
종과 성별 조합 당 애완 동물 수
mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;
+---------+------+----------+
| species | sex | COUNT(*) |
+---------+------+----------+
| bird | NULL | 1 |
| bird | f | 1 |
| cat | f | 1 |
| cat | m | 1 |
| dog | f | 1 |
| dog | m | 2 |
| hamster | f | 1 |
| snake | m | 1 |
+---------+------+----------+
COUNT()
를 사용할 때 테이블 전체를 제거 할 필요는 없습니다. 예를 들어, 이전의 쿼리를 개와 고양이에 대해서만 실행하려면 다음과 같이합니다.
mysql>SELECT species, sex, COUNT(*) FROM pet
->WHERE species = 'dog' OR species = 'cat'
->GROUP BY species, sex;
+---------+------+----------+ | species | sex | COUNT(*) | +---------+------+----------+ | cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 | +---------+------+----------+
또는 성별 깨닫는 애완 동물에 대해서만 성별마다의 애완 동물 수를 확인하려면 :
mysql>SELECT species, sex, COUNT(*) FROM pet
->WHERE sex IS NOT NULL
->GROUP BY species, sex;
+---------+------+----------+ | species | sex | COUNT(*) | +---------+------+----------+ | bird | f | 1 | | cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 | | hamster | f | 1 | | snake | m | 1 | +---------+------+----------+
COUNT()
값 외에도 선택하는 컬럼을 지정하는 경우, 그 컬럼을 GROUP BY
절에 지정해야합니다. 그렇지 않은 경우는 다음과 같습니다.
ONLY_FULL_GROUP_BY
SQL 모드가 활성화되어 있으면 오류가 발생합니다.mysql>
SET sql_mode = 'ONLY_FULL_GROUP_BY';
Query OK, 0 rows affected (0.00 sec) mysql>SELECT owner, COUNT(*) FROM pet;
ERROR 1140 (42000) : Mixing of GROUP columns (MIN (), MAX (), COUNT () ...) with no GROUP columns is illegal if there is no GROUP BY clauseONLY_FULL_GROUP_BY
이 유효하지 않은 경우이 쿼리는 모든 행을 하나의 그룹으로 간주하여 처리되지만 지정된 각 컬럼에 선택되는 값은 불확정입니다. 서버에서 모든 행의 값이 자유롭게 선택됩니다.mysql>
SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec) mysql>SELECT owner, COUNT(*) FROM pet;
+--------+----------+ | owner | COUNT(*) | +--------+----------+ | Harold | 8 | +--------+----------+ 1 row in set (0.00 sec)
섹션 12.19.3 "MySQL의 GROUP BY 처리" 를 참조하십시오.