Суммирование с помощью функции COUNT()

Задача
Вы хотите вычислить количество строк таблицы, количество строк, удовлетворяющих некоторому условию, или узнать, сколько раз встречается определенное значение.

Решение
Используйте функцию COUNT().

Обсуждение
Чтобы вычислить количество строк во всей таблице или количество строк, удовлетворяющих условию, используйте функцию COUNT(). Например, чтобы вывести содержимое записей таблицы, вы выполняете запрос SELECT *, а для того чтобы вместо этого сосчитать их количество, создайте запрос SELECT COUNT(*).

Если в запросе нет инструкции WHERE, то будут сосчитаны все записи таблицы, как в следующем запросе, выводящем количество строк таблицы driver_log:

mysql> SELECT COUNT(*) FROM driver_log;

+------------+
| COUNT(*) |
+------------+
| 10 |
+------------+


Если вы не знаете, сколько штатов в США, вам поможет такой запрос:

mysql> SELECT COUNT(*) FROM states;

+------------+
| COUNT(*) |
+------------+
| 50 |
+------------+

COUNT(*) без инструкции WHERE очень быстро выполняется для таблиц ISAM или MyISAM.


А вот для таблиц BDB или InnoDB функцию лучше не использовать; запрос проводит полный просмотр таблиц этих типов, поэтому для больших таблиц операция может быть медленной. Если вас интересует только приблизительное количество строк таблицы, и вы работаете с версией MySQL 3.23 или выше, то можете избежать полного просмотра, используя предложение SHOW TABLE STATUS и исследуя значение Rows вывода. Если бы таблица states относилась к типу InnoDB, результат запроса выглядел бы как-то так:

mysql> SHOW TABLE STATUS FROM cookbook LIKE 'states'\G
*************************** 1. row ***************************
Name: states
Type: InnoDB
Row_format: Dynamic
Rows: 50
Avg_row_length: 327
Data_length: 16384
Max_data_length: NULL
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: NULL
Update_time: NULL
Check_time: NULL
Create_options:
Comment: InnoDB free: 479232 kB

Чтобы сосчитать количество строк, удовлетворяющих некоторым условиям, укажите эти условия в инструкции WHERE. Условия могут быть любыми, благодаря чему COUNT() умеет отвечать на множество разных вопросов:

• Сколько раз водитель проезжал более 200 миль за день?

mysql> SELECT COUNT(*) FROM driver_log WHERE miles > 200;

+------------+
| COUNT(*) |
+------------+
| 4 |
+------------+

• Сколько дней была за рулем Suzi?

mysql> SELECT COUNT(*) FROM driver_log WHERE name = 'Suzi';

+------------+
| COUNT(*) |
+------------+
| 2 |
+------------+

• Сколько штатов входило в США в начале XX века?

mysql> SELECT COUNT(*) FROM states WHERE statehood < '1900-01-01';

+------------+
| COUNT(*) |
+------------+
| 45 |
+------------+

• Сколько из этих штатов вступило в Союз в XIX веке?

mysql> SELECT COUNT(*) FROM states
-> WHERE statehood BETWEEN '1800-01-01' AND '1899-12-31';

+------------+
| COUNT(*) |
+------------+
| 29 |
+------------+

На самом деле функцию COUNT() можно применять в двух формах.


Использованная нами ранее (*) считает строки. Вторая же форма, COUNT(выражение), принимает как аргумент имя столбца или выражение и вычисляет количество значений не-NULL. Следующий запрос показывает, как вывести для таблицы и счетчик строк, и количество значений не-NULL одного из ее столбцов:

SELECT COUNT(*), COUNT(mycol) FROM mytbl;

Тот факт, что COUNT(выражение) не учитывает значения NULL, можно использовать при получении нескольких счетчиков для одного набора данных. Чтобы в одном запросе вычислить количество поездок в выходные дни (субботу и воскресенье) в таблице driver_log, сделайте следующее:

mysql> SELECT
-> COUNT(IF(DAYOFWEEK(trav_date)=7,1,NULL)) AS 'Saturday trips',
-> COUNT(IF(DAYOFWEEK(trav_date)=1,1,NULL)) AS 'Sunday trips'
-> FROM driver_log;

+-----------------+----------------+
| Saturday trips | Sunday trips |
+-----------------+----------------+
| 1 | 2 |
+-----------------+----------------+

Чтобы отдельно сосчитать количество поездок в рабочие и выходные дни, выполните такой запрос:

mysql> SELECT
-> COUNT(IF(DAYOFWEEK(trav_date) IN (1,7),1,NULL)) AS 'weekend trips',
-> COUNT(IF(DAYOFWEEK(trav_date) IN (1,7),NULL,1)) AS 'weekday trips'
-> FROM driver_log;

+-----------------+-----------------+
| weekend trips | weekday trips |
+-----------------+-----------------+
| 3 | 7 |
+-----------------+-----------------+

Выражения IF() определяют, должно ли быть сосчитано значение каждого столбца.


Если да, то выражение оценивается в 1, и COUNT() включает его в итог. Если же нет, то выражение оценивается в 0, и COUNT() его игнорирует.Получается, что вычисляется количество значений, удовлетворяющих условию, заданному в первом аргументе IF().

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела MySQL на эту тему:
Выбор групп только с определенными характеристиками
Группирование по результатам выражения
Использование ключевого слова DISTINCT для удаления дубликатов
Итоги и значения NULL
Итоги по датам

Вернуться в раздел: MySQL / 7. Формирование итогов