COUNT: примеры (SQL)

Руководство по функции COUNT в Microsoft SQL Server
Раздел: Агрегатные функции, Агрегатные
COUNT(expression or *): int

Функция COUNT в MS SQL Server

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

Функция используется с предложением SELECT, часто в сочетании с GROUP BY или OVER. Основное назначение — определение количества элементов.

Возможные аргументы:
1. COUNT(*) — подсчитывает общее количество строк в таблице, включая те, которые содержат значения NULL.
2. COUNT(ALL выражение) — подсчитывает количество непустых значений в указанном столбце или выражении. ALL применяется по умолчанию.
3. COUNT(DISTINCT выражение) — подсчитывает количество уникальных непустых значений в столбце или выражении. Исключает дубликаты.

Возвращаемое значение: Функция возвращает целочисленное значение (тип int) — количество подсчитанных строк или значений. Если результирующий набор пуст, возвращается 0.

Примеры использования COUNT

Пример 1: COUNT(*) — Подсчет всех записей в таблице.

SELECT COUNT(*) AS TotalEmployees FROM Employees;
TotalEmployees
----------------
250

Пример 2: COUNT(столбец) — Подсчет непустых значений в столбце.

SELECT COUNT(ManagerID) AS EmployeesWithManager FROM Employees;
EmployeesWithManager
---------------------
230

Пример 3: COUNT(DISTINCT столбец) — Подсчет уникальных значений.

SELECT COUNT(DISTINCT DepartmentID) AS UniqueDepartments FROM Employees;
UniqueDepartments
------------------
15

Пример 4: COUNT с условием WHERE.

SELECT COUNT(*) AS ActiveEmployees FROM Employees WHERE IsActive = 1;
ActiveEmployees
----------------
200

Альтернативные агрегатные функции в MS SQL

Для работы с наборами данных в Transact-SQL существует несколько других агрегатных функций, решающих смежные задачи.

1. SUM() — вычисляет сумму значений в столбце. Используется для числовых данных. Предпочтительнее COUNT, когда требуется получить не количество, а общую сумму.

2. AVG() — вычисляет среднее арифметическое значений. Применима к числовым типам.

3. APPROX_COUNT_DISTINCT() — начиная с SQL Server 2019, предоставляет приблизительное количество уникальных значений. Используется для больших наборов данных, где производительность важнее абсолютной точности.

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

Типичные ошибки при использовании

Ошибка 1: Непонимание разницы между COUNT(*) и COUNT(столбец). Первый вариант считает все строки, второй игнорирует NULL.

SELECT COUNT(*) as Total, COUNT(EndDate) as NotNullDates FROM Projects;
Total  NotNullDates
-----  ------------
100    85

В результате NotNullDates покажет только проекты с указанной датой завершения.

Ошибка 2: Использование DISTINCT с несколькими столбцами. Считает уникальные комбинации.

SELECT COUNT(DISTINCT LastName, FirstName) FROM Employees; -- Ошибка синтаксиса в MS SQL
SELECT COUNT(DISTINCT CONCAT(LastName, '|', FirstName)) FROM Employees; -- Верный подход

Ошибка 3: Попытка использовать COUNT в выражении WHERE. Для фильтрации по результату агрегации нужно использовать HAVING.

-- Неверно:
SELECT DepartmentID FROM Employees WHERE COUNT(*) > 10 GROUP BY DepartmentID;
-- Верно:
SELECT DepartmentID FROM Employees GROUP BY DepartmentID HAVING COUNT(*) > 10;

Изменения в последних версиях SQL Server

В SQL Server 2019 появилась новая функция APPROX_COUNT_DISTINCT, которая может рассматриваться как дополнение к классическому COUNT(DISTINCT). Она предназначена для сценариев, где требуется высокая производительность на очень больших наборах данных, а незначительная погрешность в результатах допустима.

Для самой функции COUNT существенных изменений в синтаксисе или поведении в последних основных версиях SQL Server (2016, 2017, 2019, 2022) не вносилось. Основные улучшения касаются оптимизатора запросов, который может эффективнее выполнять операции агрегации, включая COUNT.

Расширенные примеры применения

Пример 1: COUNT с оконной функцией. Подсчет нарастающего итога или количества строк в пределах партиции.

Пример sql
SELECT
    EmployeeID,
    OrderID,
    COUNT(*) OVER(PARTITION BY EmployeeID) AS OrdersPerEmployee
FROM Orders
ORDER BY EmployeeID;

Пример 2: Комбинирование COUNT разных типов. Анализ полноты данных в таблице.

Пример sql
SELECT
    COUNT(*) AS TotalRows,
    COUNT(PhoneNumber) AS RowsWithPhone,
    COUNT(DISTINCT City) AS UniqueCities
FROM Customers;
TotalRows  RowsWithPhone  UniqueCities
---------  -------------  ------------
5000       4500           120

Пример 3: Использование в подзапросе для проверки существования записей. Часто используется вместо EXISTS для простых проверок.

Пример sql
IF (SELECT COUNT(*) FROM Orders WHERE ShippedDate IS NULL) > 0
    PRINT 'Есть неотгруженные заказы.';

Пример 4: COUNT с CASE WHEN. Условный подсчет строк, соответствующих разным критериям.

Пример sql
SELECT
    COUNT(CASE WHEN Status = 'Completed' THEN 1 END) AS CompletedOrders,
    COUNT(CASE WHEN Status = 'Pending' THEN 1 END) AS PendingOrders
FROM Orders;

Пример 5: Подсчет с группировкой по нескольким полям.

Пример sql
SELECT
    Country,
    Region,
    COUNT(CustomerID) AS CustomerCount
FROM Customers
GROUP BY Country, Region
HAVING COUNT(CustomerID) > 5
ORDER BY Country, Region;

Аналоги функции в других СУБД

Концепция функции COUNT универсальна, но в некоторых системах управления базами данных существуют особенности.

MySQL: Синтаксис идентичен. MySQL также поддерживает COUNT(DISTINCT).

SELECT COUNT(*) FROM `users`;

PostgreSQL: Поведение аналогично. В PostgreSQL часто используют с оконными функциями.

SELECT COUNT(*) OVER (PARTITION BY department) FROM employees;

Oracle: Функция COUNT работает схожим образом. В Oracle дополнительно существует функция COUNT(expr) с игнорированием NULL.

SELECT COUNT(employee_id) FROM hr.employees;

SQLite: Поддерживает стандартный синтаксис COUNT(*) и COUNT(столбец).

Основное отличие для всех перечисленных СУБД заключается не в синтаксисе COUNT, а в контексте выполнения запросов и особенностях оптимизации.

MS SQL COUNT function comments

En
COUNT Returns the number of items in a group