Функция COUNT() является одной из самых популярных и полезных агрегатных функций в SQL. Её основная задача — подсчитывать количество строк в результатах запроса. Если бы функция COUNT() была супергероем в мире SQL, то её суперспособностью было бы умение быстро находить ответы на такие вопросы, как:
- Сколько сотрудников работает в компании?
- Какое количество студентов учится на каждом факультете?
- Сколько товаров продано за последний месяц?
Синтаксис COUNT() довольно прост:
COUNT(столбец)
где столбец — это имя столбца, строки которого будут подсчитываться. Но есть и другие варианты использования, которые мы разберем далее в лекции.
Давайте начнем с самого базового использования COUNT().
Вариант 1: Подсчёт всех строк с помощью COUNT(*)
Когда нужно подсчитать каждую строку в таблице, независимо от того, есть ли в них данные или нет, используется COUNT(*). Звездочка означает «все столбцы».
Пример: У нас есть таблица students с таким содержимым:
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | 22 |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
Выполним следующий запрос:
SELECT COUNT(*)
FROM students;
Результат:
| count |
|---|
| 4 |
Функция COUNT(*) не обращает внимания на NULL-значения в отдельных столбцах, так как она просто подсчитывает количество строк в таблице.
Вариант 2: Подсчёт строк с существующими значениями в столбце COUNT(column)
Но что, если мы хотим подсчитать только те строки, где указано не-NULL значение в конкретном столбце? В этом случае используется COUNT(column).
Пример: gосчитаем количество студентов, у которых указано имя.
SELECT COUNT(name)
FROM students;
Результат:
| count |
|---|
| 3 |
Заметили разницу? В таблице 4 строки, но в одной из них столбец name содержит значение NULL. Функция COUNT(column) игнорирует строки, где значение столбца равно NULL.
Сравнение COUNT(*) и COUNT(column)
Так все же, чем именно отличаются два варианта использования функции: COUNT(*) и COUNT(column).
COUNT(*)подсчитывает все строки в таблице, включая строки сNULLв любых из столбцов.COUNT(column)подсчитывает только те строки, где в указанном столбце значение не равно NULL.
Таблица для примера:
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
Запросы:
-- Подсчитает все строки.
SELECT COUNT(*) FROM students; -- 4 -- TOTAL (все строки)
-- Подсчитает только те строки, где имя не NULL.
SELECT COUNT(name) FROM students; -- 3 -- Считаем строки с указанным именем
-- Подсчитает только те строки, где возраст не NULL.
SELECT COUNT(age) FROM students; -- 3 -- Считаем строки с указанным возрастом
Вариант 3: Подсчёт уникальных значений с COUNT(DISTINCT column)
Иногда нужно подсчитать только уникальные значения в столбце. Например, мы хотим узнать, сколько уникальных возрастов указано у студентов. На помощь приходит COUNT(DISTINCT column).
Пример:
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
SELECT COUNT(DISTINCT age) FROM students;
Результат:
| count |
|---|
| 3 |
Обратите внимание, что в данном случае DISTINCT игнорирует не только дубли, но и NULL-значения.
Если вы попытаетесь использовать DISTINCT вместе с COUNT(*), получите ошибку: DISTINCT можно применять только к конкретным столбцам.
Примеры использования COUNT() в реальных задачах
Пример 1. Подсчет количества студентов
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
SELECT COUNT(*) AS total_students
FROM students;
Результат:
| total_students |
|---|
| 4 |
Пример 2. Подсчет студентов с известным возрастом
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
SELECT COUNT(age) AS students_with_age
FROM students;
Результат:
| students_with_age |
|---|
| 3 |
Пример 3. Подсчет уникальных возрастов
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 20 |
SELECT COUNT(DISTINCT age) AS unique_ages
FROM students;
Результат:
| unique_ages |
|---|
| 2 |
Типичные ошибки при использовании COUNT()
Ожидание, что COUNT(column) подсчитает все строки, даже если есть NULL.
Это неправда: COUNT(column) игнорирует строки с NULL в указанном столбце.
Использование COUNT(*) для подсчёта уникальных значений.
Вместо этого используйте COUNT(DISTINCT column).
Забывчивость при подсчёте конкретных данных с фильтрацией.
Например:
SELECT COUNT(*) FROM students WHERE age > 20;
Здесь вы получите только студентов старше 20 лет, а WHERE уже фильтрует строки до подсчета.
Эти нюансы часто приводят к логическим ошибкам в запросах. Будьте внимательны!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ