count sql что значит
Функция COUNT (Transact-SQL)
Эта функция возвращает количество элементов, найденных в группе. Функция COUNT работает подобно функции COUNT_BIG. Эти функции различаются только типами данных в возвращаемых значениях. Функция COUNT всегда возвращает значение типа данных int. Функция COUNT_BIG всегда возвращает значение типа данных bigint.

Синтаксис
Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.
Аргументы
ALL
Применяет агрегатную функцию ко всем значениям. Аргумент ALL используется по умолчанию.
DISTINCT
Указывает, что функция COUNT возвращает количество уникальных значений, не равных NULL.
expression
Выражение любого типа, кроме image, ntext и text. Обратите внимание, что функция COUNT не поддерживает агрегатные функции и вложенные запросы в выражении.
*
Указывает, что функция COUNT должна учитывать все строки, чтобы определить общее количество строк таблицы для возврата. Функция COUNT(*) не принимает параметры и не поддерживает использование аргумента DISTINCT. Для функции COUNT(*) не требуется параметр expression, так как по определению она не использует сведения о конкретном столбце. Функция COUNT(*) возвращает количество строк в указанной таблице с учетом повторяющихся строк. Она подсчитывает каждую строку отдельно. При этом учитываются и строки, содержащие значения NULL.
Типы возвращаемых данных
Remarks
Функция COUNT(*) возвращает количество элементов в группе. Сюда входят значения NULL и повторяющиеся значения.
Функция COUNT(ALL expression) вычисляет expression для каждой строки в группе и возвращает количество значений, не равных NULL.
Функция COUNT(DISTINCT expression) вычисляет expression для каждой строки в группе и возвращает количество уникальных значений, не равных NULL.
COUNT — это детерминированная функция, если она используется без _ предложений OVER и ORDER BY. Она не детерминирована при использовании _ с предложениями OVER и ORDER BY. Дополнительные сведения см. в статье Детерминированные и недетерминированные функции.
Примеры
A. Использование функции COUNT и параметра DISTINCT
В этом примере функция возвращает количество различных должностей, которые может иметь сотрудник Компания Adventure Works Cycles.
Б. Использование функции COUNT(*)
В этом примере функция возвращает общее количество сотрудников Компания Adventure Works Cycles.
В. Использование функции COUNT(*) совместно с другими статистическими функциями
Г. Использование предложения OVER
Примеры: Azure Synapse Analytics и Система платформы аналитики (PDW)
Д. Использование функции COUNT и параметра DISTINCT
В этом примере функция возвращает количество различных должностей, которые может иметь конкретный сотрудник компании.
Е. Использование функции COUNT(*)
Ж. Использование функции COUNT(*) совместно с другими статистическими функциями
З. Использование функции COUNT с предложением HAVING
И. Использование функции COUNT с предложением OVER
COUNT(*)
У меня есть подборка простеньких вопросов, которые я люблю задавать при собеседовании. Например, как посчитать общее число записей к таблице? Вроде бы ничего сложного, но если копнуть глубже, то можно много интересных нюансов рассказать собеседнику.
Давайте начнем с простого… Эти запросы отличаются чем-то друг от друга с точки зрения конечного результата?
Большинство отвечали: «Нет».
Реже старались долее детально формировать ответ: «Запросы вернут идентичный результат, но COUNT вернет значение типа INT, а COUNT_BIG – тип BIGINT».
Если проанализировать план выполнения, то можно заметить различия, которые многие упускают из вида. При использовании COUNT на плане будет операция Compute Scalar:
Если посмотреть в свойства оператора, то мы увидим там:
Это происходит потому, что при вызове COUNT неявно используется COUNT_BIG после чего результат преобразуется в INT.
Не сказал бы, что существенно, но преобразования типов увеличивает нагрузку на процессор. Многие, конечно, могут сказать, что этот оператор ничего не стоит при выполнении, но нужно отметить простой факт – SQL Server очень часто недооценивает Compute Scalar операторы.
Еще я знаю людей, которые любят использовать SUM вместо COUNT:
Такой вариант примерно равнозначен COUNT. Мы также получим лишний Compute Scalar на плане выполнения:
Теперь более детально затронем вопросы производительности.…
Если использовать запросы выше, то чтобы посчитать количество записей SQL Server необходимо выполнить Full Index Scan (или Full Table Scan если таблица является кучей). В любом случае, эти операции далеко не самые быстрые. Лучше всего для получения количества записей использовать системные представления: sys.dm_db_partition_stats или sys.partitions (есть еще sysindexes, но оставлен для обратной совместимости с SQL Server 2000).
Если сравнить планы выполнения, то доступ к системным представлениям менее затратный:
На AdventureWorks преимущество от применения системных представлений явно не проявляется:
Время выполнения на секционированной таблице с 30 миллионами записей:
В случае если нужно проверить наличие записей в таблице, то использование метаданных как было показано выше не даст особых преимуществ…
И на практике будет даже капельку медленнее, поскольку SQL Server генерирует более сложный план выполнения для выборки из метаданных.
Еще интереснее становиться, когда нужно посчитать количество записей по всем таблицам сразу. На практике встречал несколько вариантов, которые можно обобщить.
Вариант #1 с применением недокументированной процедуры, которая курсором обходит все пользовательские таблицы:
Вариант #2 – динамический SQL которые генерирует запросы SELECT COUNT(*):
Вариант #3 – быстрый вариант на каждый день:
Уж очень много я выдал дифирамбов, что системные представления такие хорошие. Однако, при работе с ними нас могут подстерегать «приятные» неожиданности.
Помнится, был такой веселый баг, когда при миграции с SQL Server 2000 на 2005 некоторые системные представления некорректно обновлялись. Особо везучим людям, в таком случае, из метаданных возвращались неверные значения о количестве записей в таблицах. Лечилось это все командой DBCC UPDATEUSAGE.
Вместе с SQL Server 2005 SP1 этот баг исправили и все бы ничего… Но подобную ситуацию я наблюдал еще один раз, когда восстановил бекап с SQL Server 2005 SP4 на SQL Server 2012 SP2. Воспроизвести проблему на реальном окружении увы не смогу, поэтому немного обманув оптимизатор:
расскажу на простом примере.
Самый безобидный запрос начал выполняться дольше чем обычно:
Посмотрел на план запроса и увидел там явно неадекватное значение Estimated number of rows:
Заглянул в статистику по кластерному индексу:
Но в системных представления о которых мы говорили ранее:
В запросе не было предикатов для фильтрации и оптимизатор выбрал Full Index Scan. При Full Index/Table Scan ожидаемое количество строк оптимизатор не берет из статистики, а обращается к метаданным (точно не уверен всегда ли это происходит).
Не секрет, что на основе Estimated number of rows SQL Server генерирует план выполнения и вычисляет сколько нужно памяти чтобы его выполнить. Если оценка будет неверной, то может быть выделено больше памяти на выполнение запроса, чем нужно на самом деле.
Вот к чему приводит неверная оценка количества строк:
Проблема решилась достаточно просто:
После рекомпиляции запроса все пришло в норму:
Если системные представления уже не кажутся «спасительной палочкой», то какие варианты у нас остаются? Можно делать все по-старинке:
Но при интенсивной вставке в таблицу я бы не доверял результатам. «Волшебный» хинт NOLOCK тем более не гарантирует правильного значения:
По сути, чтобы получить правильное значение количества строк в таблице, нужно выполнять запрос под уровнем изоляции SERIALIZABLE либо используя хинт TABLOCKX:
И что мы получаем в итоге… монопольную блокировку таблицы на период выполнении запроса. И тут каждый должен решать сам, что ему лучше использовать. Мой выбор — метаданные.
Еще интереснее, когда нужно быстро подсчитать число строк по условию:
Если в таблице не происходят частые операции вставки-удаления, то можно создать индексированное представление:
Для этих запросов оптимизатор будет генерировать идентичный план на основе кластерного индекса вьюхи:
План выполнения с индексным представлением и без:
Этим постом я хотел показать, что идеальных решений на все случаи жизни не бывает. И в каждом конкретной ситуации нужно действовать с индивидуальным подходом.
Все тестировалось на SQL Server 2012 SP3 (11.00.6020).
В качестве выводов… Когда нужно подсчитать общее число строк по таблице, то я использую метаданные — это самый быстрый способ. И пусть Вас не пугает ситуация с старым багом, который я привел выше.
Если нужно быстро подсчитать количество строк в разрезе какого-то поля или по условию — то я стараюсь использовать индексированные представления либо фильтрованные индексы. Все зависит от ситуации.
Когда таблица маленькая или вопросы с производительностью не стоят так остро, то проще уж действительно по-старинке написать SELECT COUNT(*)…
Если хотите поделиться этой статьей с англоязычной аудиторией:
What is the fastest way to calculate the record COUNT?
Функция SQL COUNT ()
Функция COUNT ()
Функция SQL COUNT () возвращает количество строк в таблице, удовлетворяющих критериям, указанным в предложении WHERE. Он устанавливает количество строк или ненулевых значений столбцов.
COUNT () возвращает 0, если не было совпадающих строк.
Синтаксис:
Приведенный выше синтаксис является общим стандартным синтаксисом SQL 2003 ANSI. Это помогает понять, как используется функция SQL COUNT (). Но разные поставщики баз данных могут по-разному применять функцию COUNT ().
Ниже вы можете видеть, что MySQL, PostgreSQL и Microsoft SQL Server используют тот же синтаксис, что и приведенный выше. Но DB2 и Oracle немного отличаются.
В целом, вы можете использовать * или ALL или DISTINCT или какое-либо выражение вместе с COUNT, чтобы СЧИТАТЬ число строк по какому-либо условию или по всем строкам, в зависимости от аргументов, которые вы используете вместе с функцией COUNT ().
Поддержка СУБД: функция COUNT ()
| СУБД | команда |
| MySQL | поддержанный |
| PostgreSQL | поддержанный |
| SQL Server | поддержанный |
| оракул | поддержанный |
Синтаксис DB2 и Oracle:
Параметры:
| название | Описание |
|---|---|
| ВСЕ | Относится ко всем значениям. ALL возвращает количество ненулевых значений. |
| DISTINCT | Игнорируемые повторяющиеся значения и COUNT возвращает количество уникальных ненулевых значений. |
| выражение | Выражение состоит из одной константы, переменной, скалярной функции или имени столбца, а также может быть фрагментами запроса SQL, которые сравнивают значения с другими значениями. Выражение любого типа, кроме текста или изображения. Агрегатные функции и подзапросы не допускаются. |
| * | СЧИТЫВАЕТ все строки в целевой таблице независимо от того, содержат ли они значения NULL. |
На последующих страницах мы обсудили, как применять COUNT () с различными предложениями SQL. Для этих приложений мы использовали Oracle 10g Express Edition.
Важная вещь о функции COUNT ():
Когда * используется для COUNT (), все записи (строки) считаются COUNTed, если некоторое содержимое NULL, но COUNT (column_name) не считает COUNT запись, если ее поле имеет значение NULL. Смотрите следующие примеры:
SQL COUNT строки в таблице
В следующем примере используется символ звездочки (*), за которым следует SQL COUNT (), который указывает все строки таблицы, даже если есть какое-либо значение NULL.
Пример таблицы: заказы
Чтобы получить количество строк в таблице ‘orders’, можно использовать следующую инструкцию SQL:
Код SQL:
Иллюстрированная презентация:
Выберите COUNT (*) из нескольких таблиц
Следующий запрос COUNT количество строк из двух разных таблиц (здесь мы используем сотрудников и отделов) с помощью команды COUNT (*).
Код SQL:
SQL COUNT () с именем столбца
В этом примере функция SQL COUNT () исключает значения NULL для определенного столбца, если столбец указан в качестве аргумента в скобках функции COUNT.
Образец таблицы: listofitem
Чтобы получить количество строк в таблице listofitem со следующим условием:
1. COUNT количество строк для столбца «coname»
можно использовать следующий оператор SQL:
Код SQL:
Объясните:
Приведенный выше оператор СЧИТАЕТ те строки для столбца coname, которые не равны NULL.
Строки SQL COUNT с определенным пользователем заголовком столбца
1. результат должен отображаться с заголовком «Количество рядов»,
можно использовать следующий оператор SQL:
Код SQL:
SQL COUNT () с предложением where
Предложение WHERE может использоваться вместе с функцией SQL COUNT (). выбрать конкретные записи из таблицы в соответствии с заданным условием.
Пример:
Пример таблицы: заказы
1. ord_amount против заказа более 1500,
можно использовать следующий оператор SQL:
Применение функции COUNT ()
На последующих страницах мы обсудили, как применять COUNT () с различными предложениями SQL. Для этих приложений мы использовали Oracle 10g Express Edition.
Страница COUNT with DISTINCT обсуждает, как применять функцию COUNT с DISTINCT, а также обсуждает, как применять функцию COUNT с предложением ALL. В отличие от использования *, когда используется ALL, значения NULL не выбираются.
На странице COUNT HAVING рассказывается, как применить функцию COUNT с предложением HAVING, а также с HAVING и GROUP BY.
Страница COUNT с GROUP BY описывает, как применить функцию COUNT с GROUP BY в порядке возрастания и в порядке убывания.
Примечание. Выводы указанного оператора SQL, показанного здесь, взяты с использованием Oracle Database 10g Express Edition.
Вот слайд-презентация всех агрегатных функций.
Упражнения по SQL
Хотите улучшить вышеуказанную статью? Вносите свои заметки / комментарии / примеры через Disqus.
Предыдущая: Агрегатные функции
Следующая: COUNT с отличным
Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite
Базы данных
SQL функция COUNT
В этом учебном материале вы узнаете, как использовать SQL функцию COUNT с синтаксисом и примерами.
Описание
SQL функция COUNT используется для подсчета количества строк, возвращаемых в операторе SELECT.
Синтаксис
Синтаксис для функции COUNT в SQL.
Или синтаксис для функции COUNT при группировке результатов по одному или нескольким столбцам.
Параметры или аргумент
Не все это понимают, но функция COUNT будет подсчитывать только те записи, в которых expressions НЕ равно NULL в COUNT( expressions ). Когда expressions является значением NULL, оно не включается в вычисления COUNT. Давайте рассмотрим это дальше.
В этом примере у нас есть таблица customers со следующими данными:
| customer_id | first_name | last_name | favorite_website |
|---|---|---|---|
| 4000 | Justin | Bieber | google.com |
| 5000 | Selena | Gomez | bing.com |
| 6000 | Mila | Kunis | yahoo.com |
| 7000 | Tom | Cruise | oracle.com |
| 8000 | Johnny | Depp | NULL |
| 9000 | Russell | Crowe | google.com |
Введите следующий запрос SELECT, которая использует функцию COUNT.
Функция Count
Подсчитывает количество записей, возвращенных запросом.
Синтаксис
Аргумент выражение представляет собой строковое выражение, определяющее либо поле с данными, количество которых необходимо подсчитать, либо выражение, в котором производятся вычисления с данными поля. Операндом в выражении может быть имя таблицы или функция (встроенная или определяемая пользователем, но не другая агрегатная функция SQL). Вы можете подсчитать количество записей любого типа, включая текстовые.
Примечания
Совет: В Access 2010 построитель выражений включает функцию IntelliSense, которая указывает требуемые аргументы.
Функцию Count можно использовать для подсчета количества записей в базовом запросе. Например, с помощью функции Count можно подсчитать количество заказов, отправленных в определенную страну.
Хотя в выражении можно проводить вычисления с полем, функция Count просто подсчитывает число записей. Результат не зависит от того, какие именно значения хранятся в записях.
Функция Count не учитывает при подсчете записи, имеющие значение Null, если вместо аргумента выражение не используется подстановочный знак звездочки (*). Если этот знак используется, функция Count подсчитывает общее число записей, включая записи, содержащие поля со значением Null. Вариант Count(* ) работает значительно быстрее, чем Count([ имя_столбца] ). Не следует заключать звездочку в кавычки (‘ ‘). В приведенном ниже примере вычисляется количество записей в таблице Orders.
SELECT Count(*) AS TotalOrders FROM Orders;
Если аргумент выражение определяет несколько полей, как минимум одно из них должно иметь значение, отличное от Null: только тогда функция Count учитывает запись. Если все поля имеют значение Null, запись не учитывается. Имена полей разделяются амперсандом (&). В следующем примере показано, каким образом можно ограничить подсчет записями, в которых либо поле ShippedDate, либо поле Freight имеет значение, отличное от Null.
Функцию Count можно использовать в выражении запроса. Это выражение можно также использовать в свойстве SQL объекта QueryDef или при создании набора записей на основе запроса SQL.

