2.15: Подсчет строк в SQL-шаблоны
Главная Страница » Книги по PHP » MySQL уроки для начинающих с нуля » Подсчет строк в SQL-шаблоны
Базы данных часто используются, чтобы ответить на вопрос о том, как часто некоторые данные попадаются в таблице. Например, вы могли бы узнать, сколько домашних животных у вас есть или сколько домашних животных имеет каждый владелец, или вы могли бы выполнять различные виды переписи животных. Подсчет общего количества ваших животных аналогичен вопросу о том, сколько строк находится в таблице pet? Дело в том, что имеется по одной записи на каждое домашнее животное. Функция COUNT() считает число не-NULL результатов, так что запрос для подсчета животных выглядит следующим образом:
mysql> SELECT COUNT(*) FROM pet;
+----------|
| COUNT () |
+----------|
| 9 |
+----------|
Поскольку в качестве аргумента C0UNT() задана звездочка, будут сосчитаны все строки в таблице. Здесь можно указывать и другие выражения.
Ранее вы нашли имена людей, у которых были домашние животные. Вы можете использовать C0UNT(), если хотите выяснить, сколько домашних животных имеет каждый владелец:
mysql> SELECT owner, C0UNT(*) FROM pet GROUP BY owner;
+--------|----------|
| owner | COUNT(*) |
+--------|----------|
| Benny | 2 |
| Diane | 2 |
| Gwen | 3 |
| Harold | 2 |
+--------|----------|
Обратите внимание на использование ключевого слова GROUP BY, чтобы сгруппировать вместе все записи для каждого владельца (owner). Без него все, что вы получите, это сообщение об ошибках:
mysql> SELECT owner, COUNT(owner) FROM pet;
ERROR 1140 at line 1: Mixing of GROUP columns (MIN(), MAX(), COUNT()...)
with no GROUP columns is illegal if there is no GROUP BY clause
COUNT() и GROUP BY полезны для характеристики ваших данных различными способами. Следующие примеры показывают различные способы выполнения операции переписи.
Число животных по разновидности:
mysql> SELECT species, COUNT(*) FROM pet GROUP BY species;
+---------+----------+
| species | COUNT(*) |
+---------+----------|
| птичка | 2 |
| кошка | 2 |
| собака | 3 |
| хомяк | 1 |
| змея | 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(*) |
+---------|------|----------+
| птичка | NULL | 1 |
| птичка | f | 1 |
| кошка | f | 1 |
| кошка | m | 1 |
| собака | f | 1 |
| собака | m | 2 |
| хомяк | f | 1 |
| змея | m | 1 |
+---------|------|----------+
Вы не должны получать всю таблицу, когда используете COUNT(). Например, предыдущий запрос, когда он выполняется только на кошках и собаках, выглядит следующим образом:
mysql> SELECT species, sex, COUNT(*) FROM pet
-> WHERE species = "??????" OR species = "?????" GROUP BY species, sex;
+---------|------|----------+
| species | sex | COUNT(*) |
+---------|------|----------+
| кошка | f | 1 |
| кошка | m | 1 |
| собака | f | 1 |
| собака | m | 2 |
+---------|------|----------+
Если вы хотите получить число животных каждого пола (только для животных, пол которых известен), используйте запрос:
mysql> SELECT species, sex, COUNT(*) FROM pet
-> WHERE sex IS NOT NULL GROUP BY species, sex;
+---------|------|----------+
| species | sex | COUNT(*) |
+---------|------|----------+
| птичка | f | 1 |
| кошка | f | 1 |
| кошка | m | 1 |
| собака | f | 1 |
| собака | m | 2 |
| хомяк | f | 1 |
| змея | m | 1 |
+---------|------|----------+