Вопросы по теме «Агрегация, GROUP BY и HAVING»
GROUP BY, HAVING, COUNT, SUM, AVG — агрегатные функции встречаются практически в каждой SQL-задаче на собеседовании. Интервьюеры проверяют, понимаете ли вы разницу между WHERE и HAVING, умеете ли группировать по нескольким полям и фильтровать по результатам агрегации. Без уверенного владения этим блоком невозможно решить ни одну аналитическую задачу на SQL.
Всего в этом разделе 32 вопросов. Каждый — с правильным ответом и кратким разбором теории. Разбито на 7 частей по 5 вопросов.
Вопросы 1–5 из 32
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`.
4Что делает `HAVING`?
AФильтрует строки до группировки
BФильтрует группы после `GROUP BY`
CСортирует результаты
DСчитает агрегаты
Ответ: `HAVING` фильтрует уже агрегированные группы.
`WHERE` — до агрегации; `HAVING` — после. Пример: `... GROUP BY dept HAVING COUNT(*) > 5;`
5Что делает оператор `DISTINCT`?
AСортирует строки
BУбирает `NULL`
CУбирает дубликаты
DГруппирует значения
Ответ: `DISTINCT` убирает дубликаты из результата.
`DISTINCT` применяется ко всем выбранным колонкам. Часто эквивалентен `GROUP BY` по тем же колонкам, если не используются агрегаты.
Хотите тренировать интерактивно?
В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.
Тренировать в Telegram