Подсчёт значений
Вместо звёздочки в скобках COUNT можно написать столбец. COUNT(column) считает не строки, а значения: строки, в которых столбец не равен NULL. У двух клиентов магазина нет города, поэтому эти два числа различаются:
SELECT COUNT(*) AS all_customers,
COUNT(city) AS with_city
FROM customers;| all_customers | with_city |
|---|---|
| 14 | 12 |
COUNT(*) считает все 14 строк, а COUNT(city) — только 12, в которых есть город. NULL означает, что значения нет, а где нет значения, там нечего считать. Столбец, который никогда не бывает NULL, например id, даёт то же число, что и COUNT(*).
Чтобы считать каждое значение только один раз, напишите в скобках DISTINCT перед столбцом. В скольких разных городах живут клиенты?
SELECT COUNT(DISTINCT city) AS cities
FROM customers;| cities |
|---|
| 4 |
В четырёх. SELECT DISTINCT city FROM customers; показал бы пять строк, потому что NULL — одна из них, но COUNT(DISTINCT city) пропускает NULL, как и COUNT(city).
Типичная ошибка: COUNT(column), когда нужно посчитать строки. SELECT COUNT(released) FROM games; говорит 18, хотя в магазине 20 игр: Robot Rebellion и Mystery Manor ещё не вышли, поэтому у них released равен NULL. Чтобы посчитать строки, пишите COUNT(*), а столбец в скобках ставьте только тогда, когда хотите исключить строки, где он равен NULL.
Задание
- 1
Сколько всего отзывов и у скольких из них есть комментарий? Покажите оба числа в одном запросе, в столбцах
review_countиwith_comment:review_count with_comment 25 15 - 2
Ниже посчитайте, сколько разных клиентов сделали заказ (столбец
customer_idтаблицыorders), в столбцеordering_customers:ordering_customers 12 - 3
А в одном запросе посчитайте строки таблицы
order_itemsв столбцеitem_countи разные игры в них в столбцеdifferent_games:item_count different_games 42 17