Вы хотите вывести только те категории товаров, где суммарные продажи больше 10000. Таблица sales с колонками category, amount. Какой запрос корректен?
GROUP BY, HAVING, COUNT, SUM, AVG — агрегатные функции встречаются практически в каждой SQL-задаче на собеседовании. Интервьюеры проверяют, понимаете ли вы разницу между WHERE и HAVING, умеете ли группировать по нескольким полям и фильтровать по результатам агрегации. Без уверенного владения этим блоком невозможно решить ни одну аналитическую задачу на SQL.
Всего в этом разделе 32 вопросов. Каждый — с правильным ответом и кратким разбором теории. Разбито на 7 частей по 5 вопросов.
1В таблице `users` есть колонка `middle_name`, в которой часто хранится `NULL`. Что вернёт выражение `COUNT(middle_name)`?
AЧисло всех строк в таблице, включая строки с `NULL`.
BЧисло строк, где `middle_name` не `NULL`.
C`NULL`, если есть хотя бы одно значение `NULL`.
DВсегда 0, если есть хотя бы одно значение `NULL`.
Ответ: `COUNT(колонка)` считает только не-`NULL` значения.
Агрегат `COUNT(колонка)` игнорирует строки, где значение колонки равно `NULL`. Чтобы посчитать все строки, используют `COUNT(*)`, а чтобы посчитать только заполненные значения — `COUNT(middle_name)`.
2Есть таблица `payments(amount)`, в части строк `amount` равно `NULL`. Какой запрос посчитает количество всех строк в таблице, включая строки с `NULL` в `amount`?
A`SELECT COUNT(amount) FROM payments;`
B`SELECT COUNT(*) FROM payments;`
C`SELECT COUNT(amount) FROM payments WHERE amount IS NOT NULL;`
D`SELECT COUNT(*) FROM payments WHERE amount IS NOT NULL;`
Ответ: `COUNT(*)` считает все строки, а `COUNT(колонка)` — только строки, где колонка не `NULL`.
Выражение `COUNT(*)` не зависит от значений конкретных колонок и считает все строки, включая строки с `NULL` в любых полях. В отличие от него `COUNT(amount)` игнорирует строки, где `amount` равно `NULL`.
3Что вернёт запрос `SELECT AVG(salary) FROM employees;`?
AОдну строку на каждого сотрудника с его зарплатой.
BОдну строку с одной колонкой — среднее значение `salary` по всей таблице.
CОдну строку на каждый отдел компании.
DЗапрос вернет ошибку, так как нет `GROUP BY`.
Ответ: Агрегат без `GROUP BY` возвращает одну строку по всей выборке.
Если в запросе используется агрегатная функция, например `AVG(salary)`, и нет `GROUP BY`, то результатом будет одна строка с агрегированным значением по всем выбранным строкам. В примере это средняя зарплата по всем сотрудникам в таблице `employees`.