Группировка записей и функция COUNT()
Пусть необходимо узнать, какие сообщения и в каких темах имеются. Для этого можно воспользоваться стандартным запросом с использованием оператора SELECT:
Для того чтобы узнать сколько сообщений на форуме имеется, можно воспользоваться встроенной функцией COUNT(). Эта функция подсчитывает число строк. Причем, если в качестве аргумента этой функции выступает *, то подсчитываются все строки таблицы. А если в качестве аргумента указывается имя столбца, то подсчитываются только те строки, которые имеют значение в указанном столбце.
В данном примере оба аргумента дадут одинаковый результат, т.к. все столбцы таблицы имеют тип NOT NULL.
Напишем запрос, используя в качестве аргумента столбец id_topic:
SELECT COUNT(id_topic) FROM posts;
Таким образом, в темах имеется 4 сообщения.
Пусть теперь необходимо узнать, сколько сообщений имеется в каждой теме. Для этого понадобится сгруппировать сообщения по темам и вычислить для каждой группы количество сообщений. Для группировки в SQL используется оператор GROUP BY.
Запрос теперь будет выглядеть так:
SELECT id_topic, COUNT(id_topic) FROM posts GROUP BY id_topic;
Оператор GROUP BY указывает СУБД сгруппировать данные по столбцу id_topic (т.е. каждая тема – отдельная группа) и для каждой группы подсчитать количество строк:
Таким образом, в теме с id=1 – 3 сообщения, а с id=4 – одно.
Если бы в поле id_topic были возможны отсутствия значений, то такие строки были бы объединены в отдельную группу со значением NULL.
Предположим, что нас интересуют только те группы, в которых больше двух сообщений. В обычном запросе данное условие указывается с помощью оператора WHERE, но этот оператор умеет работать только со строками, а для групп те же функции выполняет оператор HAVING:
SELECT id_topic, COUNT(id_topic) FROM posts
GROUP BY id_topic
HAVING COUNT(id_topic) > 2;
В результате имеем:
Условия, которые можно задавать оператором WHERE, можно задавать и оператором HAVING, только надо запомнить, что WHERE фильтрует строки, а HAVING – группы.
Дата добавления: 2018-05-10; просмотров: 972;