Применение фильтра к расчётным значениям, having

Разберём один из предыдущих примеров по нахождению минимальной оценки. Как быть, если нам требуется информация только по средним оценкам, значения которых меньше пяти? Первая идея — применить условия WHERE, но в этом случае мы получим ошибку:

sqlite> SELECT student_id, MIN(grade) AS min_grade FROM grades GROUP BY student_id WHERE min_grade < 5; Error: near "WHERE": syntax error sqlite>

 

Определить условие через WHERE мы можем только для данных, которые уже есть в таблице. В рассмотренном примере значение min_grade рассчитывается посредством функции, то есть получаем результат во время выполнения запроса. Мы получили ошибку, потому что условие WHERE нельзя применять для рассчитываемых значений.

Для определения условия в таких случаях вместо WHERE применяется ключевое слово HAVING, которое имеет тот же смысл — определяет фильтр для вывода результата:

sqlite> SELECT student_id, MIN(grade) AS min_grade FROM grades GROUP BY student_id HAVING min_grade < 5; student_id min_grade ---------- ---------- 1      4.9     sqlite>  

 

На основе приёмов, рассмотренных в этом занятии, получится сформировать более сложные запросы, которые решат реальные практические задачи. Например, найдём, сколько в программе курсов, которые относятся к языку программирования Python, сгруппированных по количеству уроков, а также выведем в отчёте текущий год:

SELECT SUBSTR(DATE(), 1, 4) AS year, lessons_amount, COUNT(*) AS courses_amount FROM courses WHERE name LIKE '%Python%' GROUP BY lessons_amount;

 

Обратите внимание, что в этом случае мы используем переносы строки и табуляцию для представления более сложной логики запроса в наглядном виде.

Выполним запрос и проверим результат:

sqlite> SELECT ...> SUBSTR(DATE(), 1, 4) AS year, ...> lessons_amount, ...> COUNT(*) AS courses_amount ...> FROM courses ...> WHERE name LIKE '%Python%' ...> GROUP BY lessons_amount; year   lessons_amount courses_amount ---------- -------------- -------------- 2021   8           1             sqlite>

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: