Группировка. Часть 2
Часть раздела Основы путешествия по SQL на Coddy — урок 37 из 72.
Ключевое слово WHERE применяет условие к каждой записи отдельно. Например:
SELECT * FROM table1
WHERE col1 > col2col1 > col2 будет применено к каждой записи и проверено, выполняется ли оно.
Но что, если мы хотим отфильтровать агрегированные результаты? Например:
SELECT category, AVG(price) FROM table1
WHERE AVG(price) > 40
GROUP BY categoryЭто не сработает, потому что WHERE не может проверять агрегации. Для этого у нас есть ключевое слово HAVING. Оно фильтрует данные по условию агрегации.
SELECT category, AVG(price) FROM table1
GROUP BY category
HAVING AVG(price) > 40Это отфильтрует все категории, для которых средняя цена больше 40.
Если мы хотим объединить HAVING и клаузу WHERE, мы напишем:
SELECT category, AVG(price) FROM table1
WHERE price > 25
GROUP BY category
HAVING AVG(price) > 40Это сначала пройдётся по записям одну за другой и отфильтрует все записи, для которых цена больше 25, а только после этого выполнит клаузу GROUP BY и отфильтрует каждую категорию, для которой средняя цена больше 40.
Задание
СреднеДоступные таблицы и столбцы:
<strong>earthquakes</strong>:<strong>location</strong>,<strong>amplitude</strong>,<strong>period</strong>
Шкала Рихтера — это логарифмическая шкала, используемая для измерения магнитуды землетрясений.
Нам нужно вернуть среднюю магнитуду для каждого местоположения всех крупных землетрясений
Крупное землетрясение определяется как:
- Амплитуда больше или равна 1
- Период волн больше или равен 1 минуте
Для этого вызова мы будем использовать другую формулу: M = (A/T)<sup>2</sup> / T, которая эквивалентна M = ((A/T)*(A/T)) / T.
Верните местоположение и среднюю магнитуду для каждого местоположения, включая только крупные землетрясения (назовите столбец avg_magnitude). Включите в результат только местоположения, где avg_magnitude больше 1
Округлите результаты до 2 знаков после запятой
Шпаргалка
Ключевое слово WHERE фильтрует отдельные записи, в то время как HAVING фильтрует агрегированные результаты после группировки:
SELECT category, AVG(price) FROM table1
GROUP BY category
HAVING AVG(price) > 40Чтобы комбинировать оба предложения:
SELECT category, AVG(price) FROM table1
WHERE price > 25
GROUP BY category
HAVING AVG(price) > 40WHERE сначала фильтрует записи, затем GROUP BY группирует оставшиеся данные, и наконец HAVING фильтрует сгруппированные результаты.
Попробуйте сами
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
4Больше ключевых слов
Ключевое слово INКлючевое слово BETWEENКлючевое слово LIKEКлючевое слово ASПовторение - Модели мобильных телефонов2Условия
Основы условийКлючевое слово ANDКлючевое слово ORКлючевое слово NOTКомбинирование нескольких условийСкобкиБулевы значения5Арифметические операции
Математические операторыМатематические столбцыОперация moduloФункция ROUND()3Специальный формат возврата
Значения NULLСортировка результатов, часть 1Сортировка результатов, часть 2Повторение - Фирма по кибербезопасностиОграничение количества записейПовторение - Автозавод6Вводные вызовы
Повторение - Парламентские выборыПовторение - Арест преступника полициейПовторение - Ёмкость для напитков в бареПовторение - Создание новых столбцов