Что произойдёт в СУБД, строго следующей стандарту SQL, при выполнении запроса SELECT user_id, created_at, COUNT(*) FROM orders GROUP BY user_id;?
AЗапрос выполнится без ошибок, и значение
created_at будет произвольно выбрано из строк группы пользователяBЗапрос завершится ошибкой:
created_at должен быть в GROUP BY или внутри агрегатной функции по стандарту SQLCБудет автоматически добавлен
GROUP BY user_id, created_at, и группировка пройдёт по всей паре столбцов разомDЗначение
created_at во всех итоговых строках будет заменено на NULL, чтобы сделать запрос валиднымПравильный ответ. Все неагрегированные колонки из
SELECT должны входить в GROUP BY.Разбор
В стандартном SQL любая колонка, указанная в списке SELECT и не обёрнутая агрегатной функцией (COUNT, SUM и т.д.), должна быть перечислена в GROUP BY. Иначе запрос считается некорректным и завершается ошибкой. Некоторые СУБД (например, MySQL в нестрогом режиме) могут вернуть произвольное значение из группы, но это нестандартное поведение. Автоматическое добавление колонок в GROUP BY или замена на NULL стандартом не предусмотрены.
Проверь себя · 1/3разбор после ответа
Есть таблица
payments(amount), в части строк amount равно NULL. Какой запрос посчитает количество всех строк в таблице, включая строки с NULL в столбце amount?Ещё вопросы по теме «Агрегация, GROUP BY и HAVING»
- Что делает оператор `DISTINCT` в `SELECT`-запросе?
- Что делает оператор `HAVING` в SQL-запросе с группировкой?
- Есть таблица `orders(user_id, amount)`. Какой запрос посчитает сумму всех заказов по каждому пользователю?
- Нужно посчитать сумму оплаченных заказов по каждому пользователю. В таблице `orders` есть поля `user_id`, `amount`, `status`. Какой запрос корректен и наиболее эффективен?
- В таблице пользователей есть колонка `middle_name`, в которой часто хранится `NULL`. Что вернёт выражение `COUNT(middle_name)`?
- Все вопросы по «Агрегация, GROUP BY и HAVING» →