JavaRush /Курсы /SQL SELF /Подсчёт количества строк с COUNT() и его ва...

Подсчёт количества строк с COUNT() и его варианты

SQL SELF
7 уровень , 1 лекция
Открыта

Функция 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).

Пример: посчитаем количество студентов, у которых указано имя.

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(*) (то есть написать COUNT(DISTINCT *)), получите ERROR: syntax error at or near "*". Причина не в том, что DISTINCT работает «только с конкретными столбцами» — он умеет работать с любыми выражениями, в том числе с конкатенациями нескольких полей: COUNT(DISTINCT first_name || last_name). Реальная причина — что * это особая форма аргумента, допустимая только для 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 уже фильтрует строки до подсчета.

Эти нюансы часто приводят к логическим ошибкам в запросах. Будьте внимательны!

2
Задача
SQL SELF, 7 уровень, 1 лекция
Недоступна
Подсчёт всех строк в таблице
Подсчёт всех строк в таблице
2
Задача
SQL SELF, 7 уровень, 1 лекция
Недоступна
Подсчёт строк с ненулевой ценой
Подсчёт строк с ненулевой ценой
Комментарии (12)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Euraks Уровень 25
2 июня 2026
🦔
C0N5P1RACY Уровень 1
25 февраля 2026
Не понимаю с чем сложность у людей с второй задачей Прошел ее с второго раза, валидатор явно показывает решение, и оно даже логичное
Maria Уровень 61
9 февраля 2026
А почему запрос некорректен? нужно же кол-во продуктов посчитать, а не цен кажется этот запрос более правильный

select count(id)  from products
where price is not null;
Anemon Уровень 13 Expert
12 августа 2025
В этот раз снова задание которое никак не соотносится с уроком. Вспоминаются старые добрые времена изучения джавы..)0
Aidar Mukushev Уровень 3
26 января 2026
тоже вспомнил времена, когда заходишь решить задачу, а ответ такой, который я по определению не знаю, потому что не прошел еще, лол
Anemon Уровень 13 Expert
12 августа 2025
😗
Sergii Kononenko Уровень 1
4 августа 2025
👎
Denis Murashko Уровень 51
3 августа 2025
забавно,что решенеие из раздела - правильное решение не подходит...ошибку так и не исправили
Евгений Уровень 57 Expert
17 июля 2025
второе задание косячное. Надо обязательно предварительно отфильтровывать строки с NULL, хотя COUNT сделает это сам. Ну и к тому же половина лекции об этом была.
Иван Фетисов Уровень 4
10 июля 2025
опечатка Вариант 2: Подсчёт строк с существующими значениями в столбце COUNT(column) Но что, если мы хотим подсчитать только те строки, где указано не-NULL значение в конкретном столбце? В этом случае используется COUNT(column). Пример: gосчитаем количество студентов, у которых указано имя.
Svetlana Kalsina Уровень 22
10 июля 2025
Не очень понимаю, зачем писать отдельно условие "where price is not null" во второй задаче, если "count(price)" итак посчитает только не null значения?