Навигация

Поиск по Сайту

Партнеры

Самоучитель. Книги.

Статистика

    Каталог@Mail.ru - каталог ресурсов интернет

Подсчет строк в 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        |
+---------|------|----------+