Подсчёт строк
До сих пор каждый запрос показывал строки: по одной строке результата для каждой найденной строки таблицы. Но часто нужно одно число. Сколько клиентов у магазина? Сколько игр он продал? Сколько заработал? Для таких вопросов в SQL есть агрегатные функции. Агрегатная функция берёт много строк и превращает их в одно значение.
Самая простая из них — COUNT(*). Она считает строки:
SELECT COUNT(*)
FROM customers;| COUNT(*) |
|---|
| 14 |
В результате одна строка и один столбец, названный так, как вы написали, — COUNT(*). С помощью AS ему можно дать название получше, как вы делали с вычислениями в уроке 2:
SELECT COUNT(*) AS customer_count
FROM customers;| customer_count |
|---|
| 14 |
COUNT(*) работает вместе с WHERE: база данных сначала находит строки, удовлетворяющие условию, а потом считает только их. Вот сколько клиентов живёт в городе London:
SELECT COUNT(*) AS london_customers
FROM customers
WHERE city = 'London';| london_customers |
|---|
| 4 |
Запрос с агрегатной функцией даёт одну строку, даже если ни одна строка не подошла под условие. В магазине нет клиентов из города Paris, поэтому COUNT(*) возвращает 0:
SELECT COUNT(*) AS paris_customers
FROM customers
WHERE city = 'Paris';| paris_customers |
|---|
| 0 |
Звёздочка в COUNT(*) означает строки целиком: функция считает их, что бы в них ни было. В следующем упражнении вы увидите, что будет, если вместо неё поставить в скобках столбец. А кроме подсчёта, агрегатные функции умеют складывать, находить среднее, наименьшее и наибольшее значения; все они встретятся вам в этом уроке.
Типичная ошибка: столбец рядом с COUNT(*). В результате SELECT name, COUNT(*) FROM customers; одна строка, так какое из 14 имён показать? Большинство баз данных сообщают об ошибке. SQLite — нет; он показывает имя одного из клиентов:
| name | COUNT(*) |
|---|---|
| Emma Clark | 14 |
Похоже, будто у Emma Clark 14 чего-то, а это бессмыслица. Пока что просите либо строки, либо количество, но не то и другое в одном запросе. Позже в этом уроке вы узнаете, как посчитать, например, клиентов каждого города.
Задание
- 1
Посчитайте все заказы в таблице
orders. Назовите столбецorder_count:order_count 30 - 2
Ниже посчитайте только возвращённые заказы, то есть те, у которых
statusравен'refunded'. Назовите столбецrefunded_orders:refunded_orders 2 - 3
И посчитайте игры, вышедшие в 2025 году, в столбце
released_2025:released_2025 4