Что такое count в sql

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_idfirst_namelast_namefavorite_website
4000JustinBiebergoogle.com
5000SelenaGomezbing.com
6000MilaKunisyahoo.com
7000TomCruiseoracle.com
8000JohnnyDeppNULL
9000RussellCrowegoogle.com

Введите следующий запрос SELECT, которая использует функцию COUNT.

Источник

COUNT(*)

Что такое count в sql. Смотреть фото Что такое count в sql. Смотреть картинку Что такое count в sql. Картинка про Что такое count в sql. Фото Что такое count в sql

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

Давайте начнем с простого… Эти запросы отличаются чем-то друг от друга с точки зрения конечного результата?

Большинство отвечали: «Нет».

Реже старались долее детально формировать ответ: «Запросы вернут идентичный результат, но COUNT вернет значение типа INT, а COUNT_BIG – тип BIGINT».

Если проанализировать план выполнения, то можно заметить различия, которые многие упускают из вида. При использовании COUNT на плане будет операция Compute Scalar:

Что такое count в sql. Смотреть фото Что такое count в sql. Смотреть картинку Что такое count в sql. Картинка про Что такое count в sql. Фото Что такое count в sql

Если посмотреть в свойства оператора, то мы увидим там:

Это происходит потому, что при вызове 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).

Если сравнить планы выполнения, то доступ к системным представлениям менее затратный:

Что такое count в sql. Смотреть фото Что такое count в sql. Смотреть картинку Что такое count в sql. Картинка про Что такое count в sql. Фото Что такое count в sql

На AdventureWorks преимущество от применения системных представлений явно не проявляется:

Время выполнения на секционированной таблице с 30 миллионами записей:

В случае если нужно проверить наличие записей в таблице, то использование метаданных как было показано выше не даст особых преимуществ…

И на практике будет даже капельку медленнее, поскольку SQL Server генерирует более сложный план выполнения для выборки из метаданных.

Что такое count в sql. Смотреть фото Что такое count в sql. Смотреть картинку Что такое count в sql. Картинка про Что такое count в sql. Фото Что такое count в sql

Еще интереснее становиться, когда нужно посчитать количество записей по всем таблицам сразу. На практике встречал несколько вариантов, которые можно обобщить.

Вариант #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:

Что такое count в sql. Смотреть фото Что такое count в sql. Смотреть картинку Что такое count в sql. Картинка про Что такое count в sql. Фото Что такое count в sql

Заглянул в статистику по кластерному индексу:

Что такое count в sql. Смотреть фото Что такое count в sql. Смотреть картинку Что такое count в sql. Картинка про Что такое count в sql. Фото Что такое count в sql

Но в системных представления о которых мы говорили ранее:

Что такое count в sql. Смотреть фото Что такое count в sql. Смотреть картинку Что такое count в sql. Картинка про Что такое count в sql. Фото Что такое count в sql

В запросе не было предикатов для фильтрации и оптимизатор выбрал Full Index Scan. При Full Index/Table Scan ожидаемое количество строк оптимизатор не берет из статистики, а обращается к метаданным (точно не уверен всегда ли это происходит).

Не секрет, что на основе Estimated number of rows SQL Server генерирует план выполнения и вычисляет сколько нужно памяти чтобы его выполнить. Если оценка будет неверной, то может быть выделено больше памяти на выполнение запроса, чем нужно на самом деле.

Вот к чему приводит неверная оценка количества строк:

Проблема решилась достаточно просто:

После рекомпиляции запроса все пришло в норму:

Что такое count в sql. Смотреть фото Что такое count в sql. Смотреть картинку Что такое count в sql. Картинка про Что такое count в sql. Фото Что такое count в sql

Если системные представления уже не кажутся «спасительной палочкой», то какие варианты у нас остаются? Можно делать все по-старинке:

Но при интенсивной вставке в таблицу я бы не доверял результатам. «Волшебный» хинт NOLOCK тем более не гарантирует правильного значения:

По сути, чтобы получить правильное значение количества строк в таблице, нужно выполнять запрос под уровнем изоляции SERIALIZABLE либо используя хинт TABLOCKX:

И что мы получаем в итоге… монопольную блокировку таблицы на период выполнении запроса. И тут каждый должен решать сам, что ему лучше использовать. Мой выбор — метаданные.

Еще интереснее, когда нужно быстро подсчитать число строк по условию:

Если в таблице не происходят частые операции вставки-удаления, то можно создать индексированное представление:

Для этих запросов оптимизатор будет генерировать идентичный план на основе кластерного индекса вьюхи:

План выполнения с индексным представлением и без:

Что такое count в sql. Смотреть фото Что такое count в sql. Смотреть картинку Что такое count в sql. Картинка про Что такое count в sql. Фото Что такое count в sql

Этим постом я хотел показать, что идеальных решений на все случаи жизни не бывает. И в каждом конкретной ситуации нужно действовать с индивидуальным подходом.

Все тестировалось на SQL Server 2012 SP3 (11.00.6020).

В качестве выводов… Когда нужно подсчитать общее число строк по таблице, то я использую метаданные — это самый быстрый способ. И пусть Вас не пугает ситуация с старым багом, который я привел выше.

Если нужно быстро подсчитать количество строк в разрезе какого-то поля или по условию — то я стараюсь использовать индексированные представления либо фильтрованные индексы. Все зависит от ситуации.

Когда таблица маленькая или вопросы с производительностью не стоят так остро, то проще уж действительно по-старинке написать SELECT COUNT(*)

Если хотите поделиться этой статьей с англоязычной аудиторией:
What is the fastest way to calculate the record COUNT?

Источник

Функция COUNT (Transact-SQL)

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

Что такое count в sql. Смотреть фото Что такое count в sql. Смотреть картинку Что такое count в sql. Картинка про Что такое count в sql. Фото Что такое count в sqlСинтаксические обозначения в Transact-SQL

Синтаксис

Ссылки на описание синтаксиса 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 (Transact-SQL)

This function returns the number of items found in a group. COUNT operates like the COUNT_BIG function. These functions differ only in the data types of their return values. COUNT always returns an int data type value. COUNT_BIG always returns a bigint data type value.

Что такое count в sql. Смотреть фото Что такое count в sql. Смотреть картинку Что такое count в sql. Картинка про Что такое count в sql. Фото Что такое count в sqlTransact-SQL Syntax Conventions

Syntax

To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.

Arguments

ALL
Applies the aggregate function to all values. ALL serves as the default.

DISTINCT
Specifies that COUNT returns the number of unique nonnull values.

expression
An expression of any type, except image, ntext, or text. Note that COUNT does not support aggregate functions or subqueries in an expression.

*
Specifies that COUNT should count all rows to determine the total table row count to return. COUNT(*) takes no parameters and does not support the use of DISTINCT. COUNT(*) does not require an expression parameter because by definition, it does not use information about any particular column. COUNT(*) returns the number of rows in a specified table, and it preserves duplicate rows. It counts each row separately. This includes rows that contain null values.

OVER ( [ partition_by_clause ] [ order_by_clause ] [ ROW_or_RANGE_clause ] )
The partition_by_clause divides the result set produced by the FROM clause into partitions to which the COUNT function is applied. If not specified, the function treats all rows of the query result set as a single group. The order_by_clause determines the logical order of the operation. See OVER Clause (Transact-SQL) for more information.

Return types

Remarks

COUNT(*) returns the number of items in a group. This includes NULL values and duplicates.

COUNT(ALL expression) evaluates expression for each row in a group, and returns the number of nonnull values.

COUNT(DISTINCT expression) evaluates expression for each row in a group, and returns the number of unique, nonnull values.

For return values exceeding 2^31-1, COUNT returns an error. For these cases, use COUNT_BIG instead.

COUNT is a deterministic function when used without the OVER and ORDER BY clauses. It is nondeterministic when used with the OVER and ORDER BY clauses. See Deterministic and Nondeterministic Functions for more information.

Examples

A. Using COUNT and DISTINCT

This example returns the number of different titles that an Adventure Works Cycles employee can hold.

Here is the result set.

B. Using COUNT(*)

This example returns the total number of Adventure Works Cycles employees.

Here is the result set.

C. Using COUNT(*) with other aggregates

This example shows that COUNT(*) works with other aggregate functions in the SELECT list. The example uses the AdventureWorks2012 database.

Here is the result set.

D. Using the OVER clause

Here is the result set.

Examples: Azure Synapse Analytics and Analytics Platform System (PDW)

E. Using COUNT and DISTINCT

This example returns the number of different titles that an employee of a specific company can hold.

Here is the result set.

F. Using COUNT(*)

This example returns the total number of rows in the dbo.DimEmployee table.

Here is the result set.

G. Using COUNT(*) with other aggregates

Here is the result set.

H. Using COUNT with HAVING

This example uses COUNT with the HAVING clause to return the departments of a company, each of which has more than 15 employees.

Here is the result set.

I. Using COUNT with OVER

This example uses COUNT with the OVER clause, to return the number of products contained in each of the specified sales orders.

Источник

Группировка

Агрегатные функции

Агрегатные функции выполняют вычисления над значениями в наборе строк. В T-SQL имеются следующие агрегатные функции:

AVG : находит среднее значение

SUM : находит сумму значений

MIN : находит наименьшее значение

MAX : находит наибольшее значение

COUNT : находит количество строк в запросе

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

Все агрегатные функции за исключением COUNT(*) игнорируют значения NULL.

Функция Avg возвращает среднее значение на диапазоне значений столбца таблицы.

Пусть в базе данных у нас есть таблица товаров Products, которая описывается следующими выражениями:

Найдем среднюю цену товаров из базы данных:

Для поиска среднего значения в качестве выражения в функцию передается столбец Price. Для получаемого значения устанавливается псевдоним Average_Price, хотя можно его и не устанавливать.

Что такое count в sql. Смотреть фото Что такое count в sql. Смотреть картинку Что такое count в sql. Картинка про Что такое count в sql. Фото Что такое count в sql

Также мы можем применить фильтрацию. Например, найти среднюю цену для товаров какого-то определенного производителя:

И, кроме того, мы можем находить среднее значение для более сложных выражений. Например, найдем среднюю сумму всех товаров, учитывая их количество:

Count

Функция Count вычисляет количество строк в выборке. Есть две формы этой функции. Первая форма COUNT(*) подсчитывает число строк в выборке:

Что такое count в sql. Смотреть фото Что такое count в sql. Смотреть картинку Что такое count в sql. Картинка про Что такое count в sql. Фото Что такое count в sql

Вторая форма функции вычисляет количество строк по определенному столбцу, при этом строки со значениями NULL игнорируются:

Min и Max

Функции Min и Max возвращают соответственно минимальное и максимальное значение по столбцу. Например, найдем минимальную цену среди товаров:

Поиск максимальной цены:

Данные функции также игнорируют значения NULL и не учитывают их при подсчете.

Функция Sum вычисляет сумму значений столбца. Например, подсчитаем общее количество товаров:

Что такое count в sql. Смотреть фото Что такое count в sql. Смотреть картинку Что такое count в sql. Картинка про Что такое count в sql. Фото Что такое count в sql

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

All и Distinct

Так как этот оператор неявно подразумевается при отсутствии DISTINCT, то его можно не указывать.

Источник

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

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