Мартин Грубер - Понимание SQL (Мартин Грубер. Понимание SQL), страница 11
Описание файла
PDF-файл из архива "Мартин Грубер. Понимание SQL", который расположен в категории "". Всё это находится в предмете "информационные технологии в материаловедении" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "информационные технологии в материаловедении" в общих файлах.
Просмотр PDF-файла онлайн
Текст 11 страницы из PDF
Следующая команда будет запрещена:SELECT snum, MAX (amt)FROM OrdersGROUP BY snumHAVING odate = 10/03/1988;Поле оdate не может быть вызвано предложением HAVING, потому что оно может иметь (и действительно имеет) больше чем одно значение на группу вывода. Чтобы избегать такой ситуации, предложение HAVING должно ссылаться только наагрегаты и поля выбранные GROUP BY.
Имеется правильный способ сделать вышеупомянутый запрос (вывод показывается в Рисунке 6.8):SELECT snum, MAX (amt)FROM OrdersWHERE odate = 10/03/1990GROUP BY snum;=============== SQL Execution Log ==============| SELECT snum, odate, MAX (amt)|| FROM Orders|| GROUP BY snum, odate;|| =============================================== ||snum|| ------------||1001767.19||10025160.45||10141900.10||10071098.16|=================================================Рисунок 6.8: Максимальное значение суммы приобретений у каждогопродавца на 3 ОктябряПоскольку поля odate нет, не может быть и выбраных полей, значение этих данных меньше чем в некоторых других примерах.
Вывод должен вероятно включать чтонибудь такое, что говорит: "это — самые большие порядки на 3 Октября." В Главе 7,мы покажем как вставлять текст в ваш вывод.Как и говорилось ранее, HAVING может использовать только аргументы которыеимеют одно значение на группу вывода. Практически, ссылки на агрегатные функции— наиболее общие, но и поля выбранные с помощью GROUP BY также допустимы.Например, мы хотим увидеть наибольшие порядки для Serres и Rifkin:SELECT snum, MAX (amt)FROM OrdersGROUP BY snumHAVING snum B (1002,1007);Вывод для этого запроса показывается в Рисунке 6.9.=============== SQL Execution Log ==============| SELECT snum, MAX (amt)|| FROM Orders|| GROUP BY snum|| HAVING snum IN (1002, 1007);|| =============================================== ||snum|| ------------||10025160.45||10071098.16|=================================================Рисунок 6.9: Использование HAVING с GROUP BY полямиНЕ ДЕЛАЙТЕ ВЛОЖЕННЫХ АГРЕГАТОВВ строгой интерпретации ANSI SQL, вы не можете использовать агрегат агрегата.
Предположим что вы хотите выяснять, в какой день имелась наибольшая суммаприобретений. Если вы попробуете сделать это,SELECT odate, MAX ( SUM (amt) )FROM OrdersGROUP BY odate;то ваша команда будет вероятно отклонена. (Некоторые реализации не предписывают этого ограничения, которое является выгодным, потому что вложенные агрегатымогут быть очень полезны, даже если они и несколько проблематичны.) В вышеупомянутой команде, например, SUM должен применяться к каждой группе поля odate, аMAX ко всем группам, производящим одиночное значение для всех групп. Однакопредложение GROUP BY подразумевает что должна иметься одна строка вывода длякаждой группы поля odate.РЕЗЮМЕТеперь вы используете запросы несколько по-другому. Способность получать, ане просто размещать значения, очень мощна. Это означает что вы не обязательнодолжны следить за определенной информацией, если вы можете сформулироватьзапрос так, чтобы ее получить.
Запрос будет давать вам поминутные результаты, в товремя как таблица общего или среднего значений будет хороша только некотороевремя после ее модификации. Это не должно наводить на мысль, что агрегатныефункции могут полностью вытеснить потребность в отслеживании информации такойнапример как эта.Вы можете применять эти агрегаты для групп значений определенных предложением GROUP BY. Эти группы имеют значение поля в целом, и могут постоянно находиться внутри других групп которые имеют значение поля в целом.
В то же время,предикаты еще используются чтобы определять какие строки агрегатной функцииприменяются.Объединенные вместе, эти особенности делают возможным, производить агрегаты основанные на сильно определенных подмножествах значений в поле. Затем выможете определять другое условие для исключения определенных результатов группс предложением HAVING.Теперь, когда вы стали знатоком большого количества того как запрос производит значения, мы покажем вам, в Главе 7, некоторые вещи которые вы можете делатьсо значениями которые он производит.РАБОТА С SQL1. Напишите запрос, который сосчитал бы все суммы приобретений на 3 Октября.2.
Напишите запрос, который сосчитал бы число различных не-NULL значений поляcity в таблице Заказчиков.3. Напишите запрос, который выбрал бы наименьшую сумму для каждого заказчика.4. Напишите запрос, который бы выбирал заказчиков в алфавитном порядке, чьиимена начинаются с буквы G.5.
Напишите запрос, который выбрал бы высшую оценку в каждом городе.6. Напишите запрос, который сосчитал бы число заказчиков, регистрирующих каждыйдень свои порядки. (Если продавец имел более одного порядка в данный день, ондолжен учитываться только один раз.)(См. Приложение A для ответов.)7ФОРМИРОВАНИЕВЫВОДОВ ЗАПРОСОВЭТА ГЛАВА РАСШИРИТ ВАШИ ВОЗМОЖНОСТИ в работе с выводом которыйпроизводит запрос. Вы узнаете как вставлять текст и константы между выбранных полей, как использовать выбранные поля в математических выражениях, чьи результаты затем становятся выводом, и как сделать чтобы ваши значения выводились вопределенном порядке. Эта последняя особенность включена, чтобы упорядочиватьваш вывод по любым столбцам, любым полученным значениям этого столбца, или пообеим.СТРОКИ И ВЫРАЖЕНИЯБольшинство основанных на SQL баз данных предоставляют специальные средства позволяющие Вам совершенствовать вывод ваших запросов.
Конечно, они претерпевают значительные изменения от программы к программе, и их обсуждениездесь не входит в наши задачи, однако, имеются пять особенностей созданых в стандарте SQL которые позволяют вам делать больше чем просто вывод значений полейи агрегатных данных.СКАЛЯРНОЕ ВЫРАЖЕНИЕ С ПОМОЩЬЮ ВЫБРАННЫХ ПОЛЕЙПредположим что вы хотите выполнять простые числовые вычисления данныхчтобы затем помещать их в форму больше соответствующую вашим потребностям.SQL позволяет вам помещать скалярные выражения и константы среди выбраных полей.
Эти выражения могут дополнять или замещать поля в предложениях SELECT, имогут включать в себя одно или более выбранных полей. Например, вы можете пожелать, представить комиссионные вашего продавца в процентном отношении а не какдесятичные числа. Просто достаточно:SELECT snum, sname, city, comm * 100FROM Salespeople;Вывод из этого запроса показывается в Рисунке 7.1.=============== SQL Execution Log ============| SELECT snum, sname, city, comm * 100|| FROM Salespeople;|| ==============================================||snumsnamecity|| -------------- ------------------- ||1001PeelLondon12.000000 ||1002SerresSan Jose13.000000 ||1004MotikaLondon11.000000 ||1007RifkinBarcelona15.000000 ||1003AxelrodNew York10.000000 |===============================================Рисунок 7.1: Помещение выражения в вашем запросеСТОЛБЦЫ ВЫВОДАПоследний столбец предшествующего примера непомечен (т.е.
без наименования), потому что это — столбец вывода. Столбцы вывода — это столбцы данных созданные запросом способом, иным чем просто извлечение их из таблицы. Вы создаетеих всякий раз, когда вы используете агрегатные функции, константы, или выражения впредложении SELECT запроса. Так как имя столбца — один из атрибутов таблицы,столбцы которые приходят не из таблиц не имеют никаких имен. Другими словами не-помеченные, столбцы вывода могут обрабатываться также как и столбцы извлеченные из таблиц, почти во всех ситуациях.ПОМЕЩЕНИЕ ТЕКСТА В ВАШЕМ ВЫВОДЕ ЗАПРОСАСимвол 'A', когда ничего не значит сам по себе, — является константой, такойнапример как число 1.
Вы можете вставлять константы в предложение SELECT запроса, включая и текст. Однако символьные константы, в отличие от числовых констант,не могут использоваться в выражениях. Вы можете иметь выражение 1 + 2 в вашемпредложении SELECT, но вы не можете использовать выражение типа 'A' + 'B'; этоприемлемо только если мы имеем в виду что 'A' и 'B' это просто буквы, а не переменные и не символы.Тем ни менее, возможность вставлять текст в вывод ваших запросов оченьудобная штука.Вы можете усовершенствовать предыдущий пример представив комиссионныекак проценты со знаком процента (%). Это даст вам возможность помещать в выводтакие единицы как символы и комментарии, как например в следующем примере (вывод показывается в Рисунке 7.2)SELECT snum, sname, city, ' % ', comm * 100FROM Salespeople;=============== SQL Execution Log ============| SELECT snum, sname, city, '%', comm * 100|| FROM Salespeople;|| ==============================================||snumsnamecity|| ------ -------- ----------- ---- --------- ||1001PeelLondon%12.000000 ||1002SerresSan Jose%13.000000 ||1004MotikaLondon%11.000000 ||1007RifkinBarcelona%15.000000 ||1003AxelrodNew York%10.000000 |===============================================Рисунок 7.2: Вставка символов в ваш выводОбратите внимание что пробел перед процентом вставляется как часть строки.Эта же самая особенность может использоваться чтобы маркировать вывод вместе свставляемыми комментариями.