Разница между count(1) и count(*) в запросах SQL
Быстрый ответ
SQL-запрос SELECT COUNT(1) FROM table_name;
используется для подсчёта строк в таблице table_name
. Этот запрос часто сравнивают с COUNT(*)
, и в некоторых СУБД его считают более продуктивным, так как число один служит простым заполнителем для быстрого подсчёта строк.
SELECT COUNT(1) FROM table_name; //-- "Каждая строка для меня — как звезда!" 😉
Эквивалентность COUNT(1) и COUNT(*)
На самом деле, COUNT(1)
в SQL-запросе считает все строки в таблице таким же образом, как и COUNT(*)
. Однако стоит упомянуть, что:
COUNT(1)
можно сравнить с подсчётом 'хлеба и масла'. В этом случае единица всегда отлична от NULL и представляет собой условное значение для подсчёта каждой строки.COUNT(*)
напоминает подсчёт всего состава команды. Она проводит полный подсчёт строк без всякого анализа содержимого колонок.
СУБД обрабатывают COUNT(1)
и COUNT(*)
одинаково, поэтому между ними нет существенного отличия.
Отсутствие значений NULL
Выражения COUNT(1)
и COUNT(*)
неразрывны для значений NULL.
- Выражение '1' в
COUNT(1)
не может быть NULL и, следовательно, гарантирует подсчёт каждой строки без учёта её содержимого. COUNT(*)
также считает все строки без какого-либо исключения.
В этой битве против NULL наши герои проявляют полную устойчивость!
Модификаторы: ALL и DISTINCT на поле боя
В SQL COUNT()
может принимать две роли: ALL
и DISTINCT
:
ALL
: По умолчанию,COUNT()
подсчитывает всех игроков, включая дубликаты.DISTINCT
: При этом условииCOUNT()
подсчитывает только уникальные строки.
Визуализация
Давайте рассмотрим SQL-команду SELECT COUNT(1) FROM table_name
на примере отважного искателя сокровищ, которые считает сундуки с золотом:
Представьте таинственный остров 🏝️ с множеством сундуков, закопанных в песке (ваша таблица базы данных).
🏝️ Остров (Таблица Базы Данных): [💰, 💰, 💰, ..., 💰]
Искатель сокровищ (функция COUNT
) хочет узнать, сколько сундуков спрятано на острове:
SELECT COUNT(1) FROM остров_сокровищ; //-- "Я пришел, я увидел, я подсчитал!" 💰
Расчёты искателя сокровищ:
- Считает каждый сундук как "1" (🔢)
- Не интересуется содержимым (🔒)
- Сообщает: "Шеф, на острове X сундуков со скарбами!"
Так же, как искатель сокровищ, COUNT(1)
концентрируется на количестве, а не на содержимом.
Функция COUNT и производительность
Вопрос проективного результата — ключевой для SQL-команд:
- Без разницы: Неважно, используете ли вы
COUNT(1)
илиCOUNT(*)
, современные СУБД обеспечивают оптимальную производительность обоих вариантов. - Рациональное выполнение: СУБД умно интерпретируют
COUNT(1)
иCOUNT(*)
, и подсчёт строк проходит без анализа данных.
Лучше сосредоточиться на улучшении структуры данных, индексации и правильном использовании условий WHERE для повышения производительности.
Как максимально эффективно использовать COUNT
Вот стратегические советы для эффективного использования COUNT()
в SQL:
- Выражения по умолчанию:
COUNT(*)
идеально подходит для общих подсчетов;COUNT(1)
полезен для специальных случаев. - COUNT с WHERE: Применяйте
COUNT()
совместно сWHERE
для подсчета строк, соответствующих определенным критериям. Это будет вашим счётчиком по критериям. - Влияние объединений: При использовании left join
COUNT(column_name)
, гдеcolumn_name
— столбец из присоединенной таблицы, можно получить другой результат, нежели при использованииCOUNT(*)
.
Полезные материалы
- В чем разница между select count(*) и select count(любойненулевойстолбец)? – Database Administrators Stack Exchange
- В SQL, в чем разница между count(column) и count(*)? – Stack Overflow
- COUNT — Официальная документация Oracle по COUNT.
- Count(*) против Count(1) – SQL Server – Stack Overflow
- Как и когда использовать функцию COUNT в SQL