Функция SQL COUNT()
Оператор SQL COUNT() — функция возвращающая количество записей (строк) таблицы. Запись функции с указанием столбца (синтаксис ниже) вернет количество записей конкретного столбца за исключением NULL записей.
Функция SQL COUNT() имеет следующий синтаксис:
COUNT(column_name)
Запись функции с указанием маски «*» вернет количество всех записей в таблице.
COUNT(*)
Примеры оператора SQL COUNT: Имеется следующая таблица Universities :
ID | UniversityName | Students | Faculties | Professores | Location | Site |
1 | Perm State National Research University | 12400 | 12 | 1229 | Perm | psu.ru |
2 | Saint Petersburg State University | 21300 | 24 | 13126 | Saint-Petersburg | spbu.ru |
3 | Novosibirsk State University | 7200 | 13 | 1527 | Novosibirsk | nsu.ru |
4 | Moscow State University | 35100 | 39 | 14358 | Moscow | msu.ru |
5 | Higher School of Economics | 20335 | 12 | 1615 | Moscow | hse.ru |
6 | Ural Federal University | 57000 | 19 | 5640 | Yekaterinburg | urfu.ru |
7 | National Research Nuclear University | 8600 | 10 | 936 | Moscow | mephi.ru |
Пример 1. Вывести число записей таблицы, используя оператор SQL COUNT:
SELECT COUNT(*)
FROM Universities
Пример 2. Найти количество университетов расположенных в Москве, используя оператор SQL COUNT:
SELECT COUNT(*) FROM Universities WHERE Location = 'Moscow'
Пример 3. Найти количество университетов с больше чем 20 факультетами, используя оператор SQL COUNT:
SELECT COUNT(*) FROM Universities WHERE Faculties > 20
SQL — разница между COUNT(1) и COUNT(*)?
Разницы нет. Оба варианта вернут одинаковый результат. По производительности тоже различий не будет, т.к. оптимизатор не станет преобразовывать * в список столбцов за ненадобностью.
Отслеживать
ответ дан 22 сен 2017 в 19:46
MaxU — stand with Ukraine MaxU — stand with Ukraine
149k 12 12 золотых знаков 59 59 серебряных знаков 132 132 бронзовых знака
разве не нужно контекст рассматривать? stackoverflow.com/a/2710703
22 сен 2017 в 19:52
@АлексейШиманский, спасибо за ссылку! Да, для JOIN не совсем понятно как поведет себя оптимизатор в случае использования COUNT(1) .
22 сен 2017 в 19:56
Вообще было бы классно перевести на русский. + то, что там в дубликате возможно. Хоть не часто такой вопрос задается, но как FAQ и эталон мог бы тут существовать
22 сен 2017 в 20:03
@АлексейШиманский, согласен, но времени у меня сейчас на это нет. Мне кажется еще лучще было бы перевести соответствующие «куски» из ANSI SQL-92
22 сен 2017 в 20:13
@MaxU с джоинами тоже будет работать правильно, если используется именно COUNT(1). В статье по ссылке кстати написано, почему нельзя использовать COUNT(something.1), поскольку семантически невозможно определить конкретный запрос в этом случае, в отличие от COUNT(something.*), который сработает корректно
22 сен 2017 в 20:14
Это два эквивалентных запроса. Причем в MySQL если вы используете MyISAM движок, то COUNT(*) будет выполнен очень быстро, если используется SELECT из одной таблицы и нет WHERE условия, поскольку информация о количестве строк будет храниться в специальном хранилище.
Для COUNT(1) эта оптимизация так же сработает, но при условии, что первый столбец объявлен как NOT NULL .
Дополнительно можно почитать здесь
Отслеживать
ответ дан 22 сен 2017 в 19:46
Roman Danilov Roman Danilov
2,465 8 8 серебряных знаков 18 18 бронзовых знаков
а при JOIN разве будет одинаковый результат?
22 сен 2017 в 19:53
@АлексейШиманский, да, при JOIN тоже будет одинаковый результат. Поскольку сравнивается COUNT( * ) и COUNT(1), но не COUNT(*) и COUNT(something.1)
22 сен 2017 в 20:05
@РоманДанилов, вы можете объяснить связь между COUNT(1) и первым столбцом?
22 сен 2017 в 20:16
@MaxU, я добавил ссылку, там можно покопаться, думаю
22 сен 2017 в 20:24
@РоманДанилов, «expression:» 1 — априори NOT NULL и не имеет отношение к первому столбцу — собственно поэтому я и спросил.
Мифы про Count(1) vs Count(*)
Многие наверняка знают про то, что если написать Count(*) по таблице, получите количество строк в таблице. Довольно часто я встречаю мнение, что лучше писать Count(1), так как это будет использовать меньше ресурсов сервера, потому что вы указываете скалярное выражение вместо всех полей таблицы.
Так что же использовать?
SELECT COUNT(*) FROM Sales.CustomerTransactions; Или же SELECT COUNT(1) FROM Sales.CustomerTransactions;Возможно, когда-то для некоторых СУБД это было правдой и Count(1) экономил ресурсы, но не для SQL Server — даже в далёкой версии 2005 оба выражения работали одинаково эффективно.
Давайте в этом убедимся
Выполним запрос и посмотрим на актуальный план:
Видим, что план одинаковый и оптимизатор оценивает стоимость выполнения обоих запросов, как равную. Теперь посмотрим на часть по статистике ввода-вывода:
Количество сканирований и логических чтений для обоих запросов абсолютно идентично. Значит оба варианта равноценны по производительности для SQL Server. Обращаю внимание, что для других РСУБД результат может быть иной.
Миф о том, что Count(1) менее ресурсоёмкий возник довольно давно и связан с тем, что символ звездочка * указывает на выборку всех полей, а значит, логически подумав, можно предположить, что считать строки, используя все поля таблицы, будет значительно дороже, чем посчитать, используя скалярное выражение — 1 .
Также есть ситуации, когда пишут Count(FieldName) . В этом случае всегда нужно помнить, что если поле FieldName может содержать NULL, то Count проигнорирует такие строки, а значит и результат Count(*) и Count(FieldName) может быть разный.
А вы используете в своем проекте Count(1)? Пишите в комментариях!
COUNT SQL
Функция SQL COUNT используется для подсчета количества записей в таблице. Она имеет следующий синтаксис::
SELECT COUNT(*) FROM имя_таблицы;
Здесь * обозначает все столбцы в таблице, а имя_таблицы - имя таблицы, которую нужно просуммировать.
Функция COUNT принимает один из нескольких параметров:
- * - означает то, что функция COUNT возвращает все записи в таблице;
- column_name - функция COUNT возвращает количество записей конкретного столбца (только NOT NULL);
- DISTINCT column_name - функция COUNT возвращает количество только разных записей конкретного столбца (только NOT NULL).
SQL COUNT Примеры
Рассмотрим несколько примеров написания запросов с COUNT в SQL.
SQL COUNT. Пример 1
Напишем запрос SELECT COUNT, возвращающий количество записей в таблице users.
SELECT COUNT(*) FROM users;
SQL COUNT. Пример 2
Напишем запрос, возвращающий количество записей столбца User_ID в таблице users, дата которых равна "20.05.2012".
SELECT COUNT(User_ID) FROM users WHERE date = "20.05.2012";
SQL COUNT DISTINCT. Пример 3
Теперь получим количество только разных записей столбца User_ID.
SELECT COUNT(DISTINCT User_ID) FROM users;
SQL COUNT ALL. Пример 4
Следующий запрос возвращает количество стран, за исключением нулевых значений.