Чтение онлайн

на главную - закладки

Жанры

Понимание SQL

Грубер Мартин

Шрифт:

Таблица 6. 7: Удаление групп агрегатных значений

Аргументы в предложении HAVING следуют тем же самым правилам что и в предложении SELECT, состоящей из команд использующих GROUP BY. Они должны иметь одно значение на группу вывода. Следующая команда будет запрещена:

SELECT snum, MAX (amt)

FROM Orders

GROUP BY snum

HAVING odate=10/03/1988;

Поле оdate не может быть вызвано предложением HAVING, потому что оно может иметь (и действительно имеет ) больше чем одно значение на группу вывода. Чтобы избегать такой ситуации, предложение HAVING должно ссылаться только на агрегаты и поля выбранные GROUP BY. Имеется правильный способ сделать вышеупомянутый запрос( вывод показывается в Таблице 6.8 ):

SELECT snum, MAX (amt)

FROM Orders

WHEREodate=10/03/1990

GROUP BY snum;

SQL Execution Log

SELECT snum, odate, MAX (amt)

FROM Orders GROUP BY snum, odate;

snum

1001

767.19

1002

5160.45

1014

1900.10

1007

1098.16

Таблица 6.8: Максимальное значение суммы приобретений у каждого

продавца на 3 Октября

Поскольку поля odate нет, не может быть и выбраных полей, значение этих данных меньше чем в некоторых других примерах. Вывод должен вероятно включать что-нибудь такое что говорит - " это - самые большие порядки на 3 Октября." В Главе 7, мы покажем как вставлять текст в ваш вывод.

Как и говорилось ранее, HAVING может использовать только аргументы которые имеют одно значение на группу вывода. Практически, ссылки на агрегатные функции - наиболее общие, но и поля выбранные с помощью GROUP BY также допустимы. Например, мы хотим увидеть наибольшие порядки для Serres и Rifkin:

SELECT snum, MAX (amt)

FROM Orders

GROUP BY snum

HAVING snum B (1002,1007);

Вывод для этого запроса показывается в Таблице 6.9.

SQL Execution Log

SELECT snum, MAX (amt)| FROM Orders

GROUP BY snum HAVING snum IN (1002, 1007 );

snum

1002

5160.45

1007

1098.16

Таблица 6. 9: Использование HAVING с GROUP BY полями

НЕ ДЕЛАЙТЕ ВЛОЖЕННЫХ АГРЕГАТОВ

В строгой интерпретации ANSI SQL, вы не можете использовать агрегат агрегата. Предположим что вы хотите выяснять, в какой день имелась наибольшая сумма приобретений. Если вы попробуете сделать это, то ваша

SELECT odate, MAX (SUM (amt) )

FROM Orders

GROUP BY odate;

команда будет вероятно отклонена. (Некоторые реализации не предписывают этого ограничения, которое является выгодным, потому что вложенные агрегаты могут быть очень полезны, даже если они и несколько проблематичны.) В вышеупомянутой команде, например, SUM должен применяться к каждой группе поля odate, а MAX ко всем группам, производящим одиночное значение для всех групп. Однако предложение GROUP BY подразумевает что должна иметься одна строка вывода для каждой группы поля odate.

РЕЗЮМЕ

Теперь вы используете запросы несколько по-другому. Способность получать, а не просто размещать значения, очень мощна. Это означает что вы не обязательно должны следить за определенной информацией если вы можете сформулировать запрос так чтобы ее получить. Запрос будет давать вам по-минутные результаты, в то время как таблица общего или среднего значений будет хороша только некоторое время после ее модификации. Это не должно наводить на мысль, что агрегатные функции могут полностью вытеснить потребность в отслеживании информации такой например как эта.

Вы можете применять эти агрегаты для групп значений определенны предложением GROUP BY. Эти группы имеют значение поля в целом, и могут постоянно находиться внутри других групп которые имеют значение поля в целом. В то же время, предикаты еще используются чтобы определять какие строки агрегатной функции применяются.

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

Теперь, когда вы стали знатоком большого количества того как запрос производит значения, мы покажем вам, в Главе 7, некоторые вещи которые вы можете делать со значениями которые он производит.

РАБОТА С SQL

* Напишите запрос который сосчитал бы все суммы приобретений на 3 Октября.

* Напишите запрос который сосчитал бы число различных не-NULL значений поля city в таблице Заказчиков.

* Напишите запрос который выбрал бы нименьшую сумму для каждого заказчика.

* Напишите запрос который бы выбирал заказчиков в алфавитном порядке, чьи имена начинаются с буквы G.

* Напишите запрос который выбрал бы высшую оценку в каждом городе.

* Напишите запрос который сосчитал бы число заказчиков регистрирующих каждый день свои порядки. (Если продавец имел более одного порядка в данный день, он должен учитываться только один раз.)

Глава 7. ФОРМИРОВАНИЕ ВЫВОДОВ ЗАПРОСОВ

ЭТА ГЛАВА РАСШИРИТ ВАШИ ВОЗМОЖНОСТИ в работе с выводом который производит запрос. Вы узнаете как вставлять текст и константы между выбранных полей, как использовать выбранные поля в математических выражениях, чьи результаты затем становятся выводом, и как сделать чтобы ваши значения выводились в определенном порядке. Эта последняя особенность включена, чтобы упорядочивать ваш вывод по любым столбцам, любым полученным значениям этого столбца, или по обеим.

СТРОКИ И ВЫРАЖЕНИЯ

Большинство основанных на SQL баз данных предоставляют специальные средства позволяющие Вам совершенствовать вывод ваших запросов. Конечно, они претерпевают значительные изменения от программы к программе, и их обсуждение здесь не входит в наши задачи, однако, имеются пять особенностей созданых в стандарте SQL которые позволяют вам делать больше чем просто вывод значений полей и агрегатных данных.

СКАЛЯРНОЕ ВЫРАЖЕНИЕ С ПОМОЩЬЮ ВЫБРАННЫХ ПОЛЕЙ
Поделиться:
Популярные книги

Железная маска (сборник)

Дюма-отец Александр
Приключения:
исторические приключения
5.00
рейтинг книги
Железная маска (сборник)

Я царь. Книга XXVIII

Дрейк Сириус
28. Дорогой барон!
Фантастика:
боевая фантастика
аниме
попаданцы
5.60
рейтинг книги
Я царь. Книга XXVIII

Судьба

Буджолд Лоис Макмастер
Мастера фантазии
Фантастика:
научная фантастика
космическая фантастика
5.00
рейтинг книги
Судьба

Ранчо

Стил Даниэла
Любовные романы:
современные любовные романы
7.71
рейтинг книги
Ранчо

Боярин

Гончаров Олег
3. Ночь Сварога
Приключения:
исторические приключения
8.58
рейтинг книги
Боярин

Сиротка

Дюпюи Мари-Бернадетт
1. Сиротка
Проза:
историческая проза
8.76
рейтинг книги
Сиротка

Архимаг. Пробуждение. Трилогия

Рудазов Александр
56. В одном томе
Фантастика:
научная фантастика
9.32
рейтинг книги
Архимаг. Пробуждение. Трилогия

Шайтан Иван

Тен Эдуард
1. Шайтан Иван
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.25
рейтинг книги
Шайтан Иван

Золотое руно (сборник)

Сойер Роберт Джеймс
Шедевры фантастики
Фантастика:
научная фантастика
5.00
рейтинг книги
Золотое руно (сборник)

Спецоперации

Судоплатов Павел Анатольевич
Документальная литература:
биографии и мемуары
8.10
рейтинг книги
Спецоперации

Аристократ из прошлого тысячелетия

Еслер Андрей
3. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.25
рейтинг книги
Аристократ из прошлого тысячелетия

Ключник

Зайцев Сергей Григорьевич
2. Викс
Фантастика:
фэнтези
рпг
попаданцы
9.25
рейтинг книги
Ключник

iOS. Приемы программирования

Нахавандипур Вандад
Компьютеры и Интернет:
программирование
5.00
рейтинг книги
iOS. Приемы программирования

Я снова царь. Книга XXXIII

Дрейк Сириус
33. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я снова царь. Книга XXXIII