Select count 1 что означает
Перейти к содержимому

Select count 1 что означает

  • автор:

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

SQL_Deep_3.02-5020-df713a.png

Многие наверняка знают про то, что если написать Count(*) по таблице, получите количество строк в таблице. Довольно часто я встречаю мнение, что лучше писать Count(1), так как это будет использовать меньше ресурсов сервера, потому что вы указываете скалярное выражение вместо всех полей таблицы.

Так что же использовать?

 
SELECT COUNT(*) FROM Sales.CustomerTransactions; Или же SELECT COUNT(1) FROM Sales.CustomerTransactions;

Возможно, когда-то для некоторых СУБД это было правдой и Count(1) экономил ресурсы, но не для SQL Server — даже в далёкой версии 2005 оба выражения работали одинаково эффективно.

Давайте в этом убедимся

Выполним запрос и посмотрим на актуальный план:

1-20219-2eef3b.png

Видим, что план одинаковый и оптимизатор оценивает стоимость выполнения обоих запросов, как равную. Теперь посмотрим на часть по статистике ввода-вывода:

2-20219-3854a0.png

Количество сканирований и логических чтений для обоих запросов абсолютно идентично. Значит оба варианта равноценны по производительности для SQL Server. Обращаю внимание, что для других РСУБД результат может быть иной.

Миф о том, что Count(1) менее ресурсоёмкий возник довольно давно и связан с тем, что символ звездочка * указывает на выборку всех полей, а значит, логически подумав, можно предположить, что считать строки, используя все поля таблицы, будет значительно дороже, чем посчитать, используя скалярное выражение — 1 .

Также есть ситуации, когда пишут Count(FieldName) . В этом случае всегда нужно помнить, что если поле FieldName может содержать NULL, то Count проигнорирует такие строки, а значит и результат Count(*) и Count(FieldName) может быть разный.

MS_SQL_970x550-20219-e9481b.png

А вы используете в своем проекте 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

Следующий запрос возвращает количество стран, за исключением нулевых значений.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *