Неагрегатное поле — это просто поле в условии SELECT, которое вызывается без агрегатной функции.
Практическое задание
• Сколько городов, где были выставлены счета, начинаются с буквы
В последнем примере мы добавили критерии в неагрегатное поле. Может возникнуть необходимость использовать критерии для агрегированных полей, например AVG(Total). Скажем, когда нам надо найти все средние значения, меньшие 20. Мы могли бы попытаться ответить на этот вопрос с помощью условия WHERE, но существует одна проблема.
Внимание
Следующий оператор SQL содержит ошибку. Но важно видеть, что критерии, созданные в условии WHERE, не работают с агрегатными данными.
SELECT
BillingCity,
AVG(Total)
FROM
Invoices
WHERE
AVG(Total) > 5
GROUP BY
BillingCity
ORDER BY
BillingCity
При выполнении запроса возникнет следующее сообщение об ошибке:
Misuse of aggregate: AVG():
(Неправильное использование агрегата: AVG())
Это сообщение об ошибке информирует нас, что для создания условия на основе агрегатной функции (по крайней мере, в данном случае) мы не можем использовать условие WHERE. В данном случае условие WHERE может указывать только, какую информацию извлекать из полей, указанных в условии SELECT. Если необходима дополнительная фильтрация на основе агрегатных функций, необходимо включить вторичную фильтрацию, известную как условие HAVING.
Условие HAVING всегда следует после условия GROUPBY. Измененный запрос теперь выглядит следующим образом:
SELECT
BillingCity,
AVG(Total)
FROM
invoices
GROUP BY
BillingCity
HAVING
AVG(Total) > 5
ORDER BY
BillingCity
Рис. 109
Примечание
Условие HAVING позволяет фильтровать результат группировки, сделанной с помощью команды GROUP BY. Условие HAVING фильтрует агрегированные данные. Если вы попытаетесь использовать HAVING без условия GROUP BY, то получите сообщение об ошибке.
Условия WHERE и HAVING
Если кратко, то разница между условиями WHERE и HAVING заключается в том, что WHERE предназначено для фильтрации неагрегатных данных, а HAVING — для фильтрации результатов, содержащих агрегаты. Если более подробно, то два типа фильтрации возникают, когда в запрос включены как условие WHERE, так и условие HAVING. Условие WHERE указывает запросу, какую информацию следует исключить из таблицы, а затем, после фильтрации данных и применения к полям агрегатных функций, условие HAVING действует как дополнительный фильтр для агрегатных данных. Давайте повторим предыдущий запрос, но на этот раз выберем только города, начинающиеся с буквы
SELECT
BillingCity,
AVG(Total)
FROM
invoices
WHERE
BillingCity LIKE 'B%'
GROUP BY
BillingCity
HAVING
AVG(Total) > 5
ORDER BY
BillingCity
В запросе мы выполнили ту же задачу, но на этот раз добавили условие WHERE для фильтрации результатов только по городам, начинающимся с буквы
Рис. 110
Группировка по нескольким столбцам
В условиях GROUPBY можно одновременно указывать столько столбцов, сколько вам требуется. Предположим, необходимо получить более подробную разбивку средних значений счетов. Мы можем написать запрос так, чтобы агрегированные данные были сначала сгруппированы по странам, а затем по городам. В приведенном ниже примере мы добавим в условие GROUPBY еще одно поле, BillingCountry. Давайте посмотрим, как работает запрос.
SELECT
BillingCountry,
BillingCity,
AVG(Total)
FROM
invoices
GROUP BY
BillingCountry, BillingCity
ORDER BY
BillingCountry
На рис. 111 мы видим, что у нас имеется несколько записей для одной страны выставления счета, а отдельные города указаны в соседнем столбце. Группировка по нескольким столбцам может быть очень полезна, когда необходимо получить более детальную информацию.
НАПОМИНАНИЕ
Файлы базы данных могут содержать орфографические и/или ошибки, связанные с регистром.
Рис. 111
Несколько заключительных слов о функциях
Цель этой главы — познакомить вас с функциями. Мы описали возможности некоторых функций, их способность превращать данные в информацию и решать практические задачи. Если бы пришлось рассматривать все функции в SQLite и иллюстрировать работу каждой из них, то эту книгу мне никогда не удалось бы закончить. К счастью, в интернете можно найти массу информации о функциях SQL и их использовании. Я всегда рекомендую студентам поискать информацию о функциях в интернете, чтобы увидеть разные примеры их использования. Надеюсь, что вы продолжите обучение самостоятельно и узнаете еще больше о том, как использовать эти мощные инструменты.
Контрольные вопросы
1. Создайте однострочный список рассылки для всех клиентов из США, включая полные имена, написанные заглавными буквами, и полные адреса с пятизначными почтовыми индексами, в следующем формате: