COUNT: примеры (SQL)
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 с оконной функцией. Подсчет нарастающего итога или количества строк в пределах партиции.
SELECT
EmployeeID,
OrderID,
COUNT(*) OVER(PARTITION BY EmployeeID) AS OrdersPerEmployee
FROM Orders
ORDER BY EmployeeID;Пример 2: Комбинирование COUNT разных типов. Анализ полноты данных в таблице.
SELECT
COUNT(*) AS TotalRows,
COUNT(PhoneNumber) AS RowsWithPhone,
COUNT(DISTINCT City) AS UniqueCities
FROM Customers;TotalRows RowsWithPhone UniqueCities --------- ------------- ------------ 5000 4500 120
Пример 3: Использование в подзапросе для проверки существования записей. Часто используется вместо EXISTS для простых проверок.
IF (SELECT COUNT(*) FROM Orders WHERE ShippedDate IS NULL) > 0
PRINT 'Есть неотгруженные заказы.';Пример 4: COUNT с CASE WHEN. Условный подсчет строк, соответствующих разным критериям.
SELECT
COUNT(CASE WHEN Status = 'Completed' THEN 1 END) AS CompletedOrders,
COUNT(CASE WHEN Status = 'Pending' THEN 1 END) AS PendingOrders
FROM Orders;Пример 5: Подсчет с группировкой по нескольким полям.
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, а в контексте выполнения запросов и особенностях оптимизации.