Язык SQL, также известный как язык структурированных запросов, считается одним из самых широко используемых инструментов для управления информацией в реляционных базах данных, предоставляет множество функций и инструментов для анализа и организации информации. Одной из полезных, но часто недооцененных возможностей SQL является использование счетчика. В роли счетчика выступает функция COUNT(). Она предоставляет возможность подсчитать число строк в таблице или вычислить количество уникальных значений в определенном столбце. Несмотря на свою кажущуюся простоту, COUNT() может привести к потенциальным трудностям, особенно, если вы сталкиваетесь с большим объемом данных или их непривычной структурой.
В данной статье мы разберем применение функции COUNT() в SQL в качестве счетчика строк и на практических примерах узнаем, как, используя данную функцию, можно существенно упростить анализ баз данных. Освоив представленный материал, вы сможете максимально эффективно использовать функцию COUNT() в SQL для анализа и обработки данных.
Миграция в облако
безопасно и с гарантией результата.
Предоставим грант до 1 000 000 ₽ на облачную
инфраструктуру и возьмем на себя весь процесс.
Функция COUNT()
Счетчик в SQL таблице или «счетчик строк» — это функциональность, которая позволяет подсчитывать количество строк в таблице, удовлетворяющих определенному условию. Это может быть полезно во множестве ситуаций, начиная от определения количества записей в таблице до сложных аналитических запросов на подсчет числа уникальных записей, соответствующих определенным критериям.
Один из самых распространенных примеров использования счетчика строк в SQL — это функция COUNT(). Эта встроенная функция оценивает количество строк в таблице или количество уникальных значений в столбце. Она может быть применена к одному столбцу или ко всей таблице.
Синтаксис команды COUNT() в SQL имеет следующий вид:
-
column_name— это имя столбца, строки которого вы хотите подсчитать; -
table_name— это имя таблицы, откуда берутся данные; -
condition— это необязательное условие, позволяющее фильтровать строки перед подсчетом.
Если ваша цель — подсчитать все строки в таблице, не обращая внимания на их конкретные значения, вы можете применить символ * вместо указания имени колонки, как показано ниже:
Примеры использования
Рассмотрим несколько примеров использования оператора COUNT() в SQL.
В данном руководстве для работы с таблицами мы будем использовать систему управления базами данных (СУБД) SQLite. Вы можете скачать с официального сайта Обозреватель для SQLite — бесплатую программу с открытым исходным кодом, предназначенную для создания и редактирования баз данных SQLite.
Запустите DB Browser for SQLite и перейдите на вкладку SQL, где мы будем писать запросы для создания таблиц и подсчета строк.
Подсчет общего числа записей в таблице
Предположим, у вас есть таблица «Purchases», которая содержит информацию о заказах:
|
PurchaseID |
BuyerID |
Product |
|
1 |
101 |
Apple |
|
2 |
102 |
Banana |
|
3 |
103 |
Cherry |
|
4 |
101 |
Banana |
|
5 |
104 |
Cherry |
Для создания такой таблицы используйте следующий запрос:
После запуска SQL-запроса перейдите на вкладку «Структура БД» и убедитесь, что таблица успешно создалась:
Теперь нам надо заполнить нашу таблицу данными, для этого запустите следующий запрос:
На вкладке «Данные» отображается наша заполненная таблица:
Теперь, если вы хотите узнать общее количество заказов, можно использовать простой COUNT с символом *:
Это подсчитает и вернет общее число записей в таблице «Purchases». Результатом выполнения это запроса будет 5.
Подсчет общего числа уникальных записей в столбце
Допустим, у вас есть таблица «Buyers» и вы хотите узнать, сколько уникальных стран представлено среди адресов ваших клиентов:
|
BuyerID |
FirstName |
BuyerCountry |
|
101 |
Ivan |
Russia |
|
102 |
Alice |
USA |
|
103 |
Bob |
USA |
|
104 |
John |
Canada |
|
105 |
Petr |
Russia |
Аналогично тому, как мы создавали таблицу «Purchases», создадим таблицу «Buyers»:
И заполним ее данными:
В таблице видно, что колонка BuyerCountry включает в себя несколько стран, но некоторые страны повторяются (например, Russia).
Если вы хотите подсчитать количество уникальных стран, то есть исключить повторяющиеся значения, вы можете использовать COUNT с ключевым словом DISTINCT:
Это подсчитает и вернет число уникальных стран в столбце BuyerCountry таблицы «Buyers». В результате выполнения этого запроса будет выведено 3.
Подсчет с условием (фильтрацией данных)
Иногда вы хотите посчитать только строки, соответствующие определенному условию. Заказы в этой таблице сделаны клиентами из разных стран:
|
PurchaseID |
BuyerID |
Product |
BuyerCountry |
|
1 |
101 |
Apple |
Russia |
|
2 |
102 |
Banana |
USA |
|
3 |
103 |
Cherry |
USA |
|
4 |
101 |
Banana |
Russia |
|
5 |
104 |
Cherry |
Russia |
У нас уже создана такая таблица «Purchases», но в ней отсутствует столбец BuyerCountry, добавим его:
И заполним данными:
Предположим, вы хотите узнать, сколько заказов было сделано клиентами из России. Вы можете использовать COUNT с условием WHERE:
Этот SQL-запрос со счетчиком подсчитает и вернет только те заказы, которые были сделаны клиентами из России. Результатом выполнения этого запроса будет 3.
Подсчет с группировкой данных (GROUP BY)
Когда нужно подсчитать количество записей в определенной группе, используется функция GROUP BY.
|
PurchaseID |
BuyerID |
Product |
|
1 |
101 |
Apple |
|
2 |
102 |
Banana |
|
3 |
103 |
Cherry |
|
4 |
101 |
Banana |
|
5 |
104 |
Cherry |
|
6 |
101 |
Apple |
Изменим нашу имеющуюся таблицу «Purchases», добавим новую строку:
Например, вы хотите узнать, сколько заказов было сделано каждым клиентом:
Это запрос сначала группирует заказы по BuyerID, а дальше подсчитывает количество заказов для каждого клиента. В результате выполнения этого запроса будет выведено:
|
BuyerID |
COUNT(*) |
|
101 |
3 |
|
102 |
1 |
|
103 |
1 |
|
104 |
1 |
Совместное использование функции COUNT и AVG
Предположим, у вас есть таблица «Ratings», которая содержит оценки товаров пользователями:
|
RatingID |
ProductID |
UserID |
Rating |
|
1 |
101 |
1 |
4.0 |
|
2 |
102 |
2 |
3.5 |
|
3 |
101 |
3 |
4.5 |
|
4 |
103 |
1 |
5.0 |
|
5 |
101 |
2 |
3.0 |
|
6 |
102 |
3 |
4.5 |
Создадим таблицу:
В этой таблице каждая строка представляет оценку конкретного товара отдельным пользователем.
Теперь вы хотите узнать, сколько всего оценок было поставлено каждому товару и какова их средняя оценка. Вы можете использовать следующий запрос для этого:
В результате выполнения этого запроса будет выведено:
|
ProductID |
COUNT(*) |
AVG(Rating) |
|
101 |
3 |
3.83 |
|
102 |
2 |
4.0 |
|
103 |
1 |
5.0 |
Таким образом, вы видите, что товар с ID 101 был оценен 3 раза и его средняя оценка 3.83, товар с ID 102 был оценен 2 раза со средней оценкой 4.0, и товар с ID 103 был оценен 1 раз со средней оценкой 5.0.
Использование COUNT c HAVING
Иногда нужно отфильтровать результаты подсчета. Представим, что у нас есть таблица, где содержатся оценки пользователей для различных товаров.
|
RatingID |
ProductID |
UserID |
Rating |
|
1 |
101 |
1 |
4.0 |
|
2 |
101 |
2 |
3.5 |
|
… |
… |
… |
… |
|
101 |
101 |
101 |
4.5 |
|
102 |
102 |
102 |
5.0 |
|
… |
… |
… |
… |
|
300 |
102 |
300 |
4.8 |
|
301 |
103 |
101 |
3.9 |
В этой таблице мы видим, что каждый отзыв представлен в отдельной строке с уникальным RatingID и каждому ProductID соответствуют разные Rating.
Если предположить, что мы хотим проверить, какие продукты получили больше 100 оценок от пользователей, то мы можем использовать следующий запрос:
В нашем случае результат будет равен 0, так как в нашей текущей таблице «Ratings» нет ни одного продукта, который получил бы более 100 оценок. Но, если ваша таблица содержит большой объем данных и вы хотите узнать, какие товары получили больше 100 оценок от пользователей, то вышеприведенный запрос предоставит вам ответ.
Важно отметить, что HAVING применяется после GROUP BY, а не перед, как в случае с WHERE.
Использование COUNT в сочетании с JOIN
У нас есть две таблицы: «Orders» и «Customers».
Таблица «Orders»:
|
OrderID |
ProductID |
CustomerID |
|
1 |
201 |
1 |
|
2 |
202 |
1 |
|
3 |
203 |
2 |
|
4 |
204 |
3 |
Запрос для создания таблицы «Orders»:
Таблица «Customers»:
|
CustomerID |
FirstName |
CustomerCountry |
|
1 |
Ivan |
Russia |
|
2 |
Jack |
USA |
|
3 |
John |
Canada |
Запрос для создания таблицы «Customers»:
Нас интересует присоединение (JOIN) двух таблиц и подсчет (COUNT) числа строк, соответствующих определенному условию:
В запросе используется LEFT JOIN для объединения таблиц по полю CustomerID. Смысл LEFT JOIN состоит в том, что в итоговую таблицу будут включены все строки из левой таблицы (Orders), даже если для них не найдется соответствия в правой таблице (Customers).
Тем не менее, за счет условия WHERE в итоговый отчет попадут только такие строки, для которых в поле Country стоит Russia. То есть, будут учтены только заказы, сделанные клиентами из России.
Таким образом, этот запрос позволяет получить общее число заказов, выполненных клиентами из России, с использованием данных об этих заказах и клиентах из двух разных таблиц.
Сортировка данных с использованием функции ORDER BY
Представим, у вас есть таблица «Employess» с информацией о сотрудниках:
|
EmployeeID |
FirstName |
LastName |
Salary |
|
1 |
Ivan |
Petrov |
55000 |
|
2 |
Petr |
Sidorov |
75000 |
|
3 |
Alexey |
Ivanov |
70000 |
|
4 |
Dmitry |
Sidorov |
80000 |
|
5 |
Sergey |
Petrov |
90000 |
Запрос для создания таблицы:
Мы хотим узнать, сколько сотрудников в представленной таблице получают зарплату более 60000, а также отобразить это количество для каждой отдельной зарплаты в порядке убывания зарплаты. Для достижения этой цели мы можем написать следующий запрос:
Этот запрос подсчитает количество сотрудников для каждой отдельной зарплаты, которая выше 60000, и отобразит эти зарплаты в порядке убывания. Количество сотрудников для каждого значения будет показано рядом с соответствующим значением зарплаты:
|
Salary |
COUNT(*) |
|
90000 |
1 |
|
80000 |
1 |
|
75000 |
1 |
|
70000 |
1 |
Подсчет с использованием двух условий (AND и OR)
Допустим, у вас есть таблица «Sales», которая содержит информацию о продажах:
|
SaleID |
Product |
Price |
Quantity |
|
1 |
Apple |
20 |
5 |
|
2 |
Banana |
15 |
10 |
|
3 |
Cherry |
10 |
15 |
|
4 |
Apple |
20 |
20 |
|
5 |
Banana |
15 |
25 |
Запрос для создания таблицы:
Мы хотим узнать, сколько раз продукт Apple был продан в количестве меньше 10 или продукт Banana в количестве больше 20. Для этого можем использовать COUNT в сочетании с условиями AND и OR:
Этот запрос подсчитает количество продаж по указанным условиям. Результатом выполнения этого запроса будет 2.
Особенности использования
После изучения представленных практических примеров у вас не должно возникнуть вопроса: как сделать счетчик в SQL? В завершение обсудим некоторые особенности применения функции COUNT(), чтобы вы могли свободно и без препятствий использовать ее в своей работе:
-
Работа с
NULL-значениями: функцияCOUNT(column_name)в подсчет не включает строки сNULL-значениями. Если вам нужно учесть эти строки, следует использоватьCOUNT(*). -
Использование с
DISTINCT: еслиCOUNT()используется в сочетании сDISTINCT, это приводит к подсчету только уникальных значений в выбранной колонке. -
Применение с
GROUP BY:COUNT()часто используют с операторомGROUP BY, чтобы подсчитывать количество строк в каждой группе. -
Целочисленный результат: независимо от типа данных аргумента, функция
COUNT()всегда возвращает целочисленное значение. -
Использование в подзапросах:
COUNT()может быть использован в подзапросах для получения количества строк, которые соответствуют определенным критериям. -
Использование в триггерах:
COUNT()может быть использован в триггерах SQL для подсчета количества измененных строк. -
Работа с большими таблицами: когда используется
COUNT()на большом объеме данных, запрос может занять значительное время. В таких случаях следует подумать о проведении оптимизации запросов. -
Работа с совместными (
JOIN) таблицами: когда используются запросы с запутанными связями между таблицами, подсчет может стать сложной задачей. Выполнение таких запросов требует от вас понимания структуры базы данных.
Подготовили для вас выгодные тарифы на DBaaS
447 ₽/мес
711 ₽/мес
Заключение
В процессе нашего обзора мы рассмотрели основные особенности функции COUNT() и на практике прошлись по использованию счетчика в SQL. Теперь, вооружившись полученными знаниями, вы сможете эффективно обрабатывать и анализировать данные, независимо от их объема или сложности структуры.
