0Pricing
Coding Interview Prep · Урок

COUNT(*) и COUNT(столбец) и COUNT(DISTINCT)

Классический вопрос о том, как каждая форма COUNT обрабатывает NULL и дубликаты.

«COUNT(*) и COUNT(столбец) и COUNT(DISTINCT)» — бесплатный урок Coding Interview Prep на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Coding Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Coding Interview Prep содержит 4 уроков всего.

Вопрос, который Вам зададут

Если Вы проходите собеседование по SQL, ожидайте этот вопрос в первые десять минут: В чём разница между COUNT(*), COUNT(column) и COUNT(DISTINCT column)?

Вопрос кажется простым, но интервьюеры используют его, чтобы проверить, действительно ли Вы понимаете, как агрегатные функции обрабатывают значения NULL и дубликаты. Уверенный и точный ответ показывает, что Вы писали реальные запросы, а не просто заучили синтаксис.

В этом уроке мы создадим надёжную мысленную модель, чтобы Вы могли сразу ответить и объяснить почему.

COUNT(*) считает строки

COUNT(*) считает строки. Он вообще не обращается к значениям столбцов, поэтому NULL не имеет значения. Если в таблице 100 строк, COUNT(*) возвращает 100, и точка.

Здесь звёздочка не означает умножение или расширение списка столбцов. Это специальный токен со значением «посчитать каждую подходящую строку». К этой форме обращаются, когда вопрос просто звучит так: «сколько записей?»

SELECT COUNT(*) AS total_rows
FROM employees;

Пример данных для рассуждений

Давайте привяжем всё к одной небольшой таблице. Представьте таблицу employees с допускающим NULL столбцом department:

  • Alice, Продажи
  • Bob, Продажи
  • Carol, NULL
  • Dan, Разработка
  • Eve, NULL

Всего это 5 строк. В трёх строках есть значение отдела (Продажи, Продажи, Разработка), а в двух строках — NULL. Запомните эти числа; мы подсчитаем строки этой таблицы тремя способами.

COUNT(столбец) пропускает NULL

COUNT(column) считает только строки, в которых этот столбец содержит значение, отличное от NULL. Он полностью игнорирует значения NULL.

Для наших примерных данных COUNT(department) возвращает 3, а не 5, потому что два значения отдела равны NULL. Это самый важный факт во всём уроке: COUNT для столбца никогда не считает NULL.

SELECT COUNT(department) AS depts_present
FROM employees;
-- returns 3 on our sample data

Пока сравним два варианта

Рядом друг с другом для одной и той же таблицы из 5 строк:

  • COUNT(*) = 5 (каждая строка)
  • COUNT(department) = 3 (отделы, отличные от NULL)

Разница между ними, 5 минус 3, равна числу отделов со значением NULL. Полезный приём для собеседования: COUNT(*) - COUNT(col) даёт количество NULL в этом столбце без отдельного предложения WHERE.

SELECT COUNT(*) - COUNT(department) AS null_departments
FROM employees;
-- returns 2

COUNT(DISTINCT столбец)

COUNT(DISTINCT column) считает количество уникальных значений, отличных от NULL. Сначала он удаляет дубликаты, затем игнорирует NULL, а потом считает оставшиеся значения.

В наших данных уникальными значениями отдела являются Продажи и Разработка, поэтому COUNT(DISTINCT department) возвращает 2. Два значения NULL не учитываются, а дубликат Продажи сворачивается в одно значение.

SELECT COUNT(DISTINCT department) AS unique_depts
FROM employees;
-- returns 2

Все три варианта вместе

Полная картина для нашей таблицы из 5 строк:

  • COUNT(*) = 5 — строки
  • COUNT(department) = 3 — значения, отличные от NULL
  • COUNT(DISTINCT department) = 2 — уникальные значения, отличные от NULL

Если Вы можете воспроизвести этот порядок — сначала с учётом NULL, затем с учётом дубликатов, — Вы поняли всю концепцию. Обратите внимание: каждая форма возвращает значение, меньшее или равное значению в строке выше.

SELECT
  COUNT(*)                       AS rows_total,
  COUNT(department)              AS depts_present,
  COUNT(DISTINCT department)     AS unique_depts
FROM employees;

Разобранный вариант вопроса на собеседовании

Интервьюеры часто формулируют вопрос так: «Сколько сотрудников отнесено к отделу и сколько существует уникальных отделов?»

Первая часть — это COUNT(department) (отнесён к отделу означает, что значение не равно NULL). Вторая часть — COUNT(DISTINCT department). Умение распознать, какой COUNT соответствует каждой формулировке, — именно тот навык, который проверяется.

SELECT
  COUNT(department)          AS assigned_employees,
  COUNT(DISTINCT department) AS distinct_departments
FROM employees;

COUNT с условием

Любимый дополнительный вопрос: считать только строки, удовлетворяющие условию. Чистый переносимый приём — использовать COUNT с выражением CASE. Поскольку COUNT(column) пропускает NULL, сделайте так, чтобы CASE возвращал NULL для строк, которые нужно исключить.

Здесь мы считаем сотрудников отдела Продажи. CASE выдаёт значение только для строк отдела Продажи, а в остальных случаях — NULL, поэтому COUNT подсчитывает только их.

SELECT
  COUNT(CASE WHEN department = 'Sales' THEN 1 END) AS sales_count
FROM employees;
-- returns 2

Распространённые ошибки, которых следует избегать

Следите за следующими ловушками, которые устраивают интервьюеры:

  • Предполагать, что COUNT(column) равен COUNT(*) — это верно только тогда, когда столбец не содержит ни одного NULL.
  • Считать, что COUNT(DISTINCT col) включает NULL как одно уникальное значение — это не так.
  • Писать COUNT(1), ожидая, что он будет пропускать NULL — он ведёт себя как COUNT(*), подсчитывая все строки.

Упомяните эти моменты сами на собеседовании, чтобы показать глубину понимания.

COUNT(1) и COUNT(константа)

Кандидаты часто спрашивают, что быстрее: COUNT(*) или COUNT(1). Ответ: они семантически идентичны — оба считают каждую строку независимо от NULL — и современные оптимизаторы обрабатывают их одинаково, поэтому реальной разницы в производительности нет.

Константа внутри COUNT(1) никогда не равна NULL, поэтому ни одна строка не пропускается. Для ясности предпочитайте COUNT(*); это принятая форма.

SELECT COUNT(*) AS a, COUNT(1) AS b
FROM employees;
-- a and b are always equal

Быстрая проверка

Проверьте свою мысленную модель на примере таблицы.

Итоги

Теперь Вы уверенно отвечаете на самый частый вопрос об агрегатных функциях:

  • COUNT(*) считает каждую строку, включая строки со значением NULL.
  • COUNT(column) считает только значения, отличные от NULL.
  • COUNT(DISTINCT column) считает уникальные значения, отличные от NULL.
  • COUNT(*) - COUNT(col) даёт количество NULL без отдельного запроса.
  • COUNT(1) равен COUNT(*) — NULL не пропускаются, разницы в скорости нет.

Формулируйте ответ чётко и объясняйте причину. Далее: обработка NULL функциями SUM и AVG.

Часто задаваемые вопросы

Урок «COUNT(*) и COUNT(столбец) и COUNT(DISTINCT)» бесплатный?

Да — полный текст урока «COUNT(*) и COUNT(столбец) и COUNT(DISTINCT)» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Coding Interview Prep, подпишись на CoddyKit PRO. Курс Coding Interview Prep содержит 4 уроков всего.

Чему я научусь в уроке «COUNT(*) и COUNT(столбец) и COUNT(DISTINCT)»?

Классический вопрос о том, как каждая форма COUNT обрабатывает NULL и дубликаты. Ты практикуешь Coding Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Coding Interview Prep?

Предыдущий опыт не требуется. Coding Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «COUNT(*) и COUNT(столбец) и COUNT(DISTINCT)»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Coding Interview Prep?

Да. Каждый урок Coding Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. COUNT(*) и COUNT(столбец) и COUNT(DISTINCT)
  2. SUM и AVG с NULL
  3. MIN, MAX и агрегирование нечисловых данных
  4. Агрегаты без GROUP BY
← Назад к Coding Interview Prep