Работаем на SQL
l.Запишите запрос, который подсчитывает все заявки за 3 октября 1990 года.
2.Запишите запрос, который подсчитывает количество различных городов (не
NULL) в таблице Customers.
3. Запишите запрос, который выбирает наименьшую заявку для каждого покупате
ля.
4.Запишите запрос, который выбирает первого в алфавитном порядке покупателя, имя которого начинается с 'G'.
5.Запишите запрос, который выбирает максимальный рейтинг (rating) для каждого
города.
6.Запишите запрос, который подсчитывает количество продавцов, получающих заказы каждый день. (Продавца, имеющего более одного заказа в день, следует
включить в пересчет только один раз.)
(Ответы см. в приложении А.)
62
Форматирование
результатов запросов
Глава 7. Форматированиерезультатов запросов
Назначение этой главы - расширить возможности обработки результатов за
просов. Вы узнаете, как вставить текст и константы в выбранные поля, как использо
вать последние в математических выражениях, результаты вычисления которых
станут выходными данными и, наконец, как представить выходные данные в задан
ной последовательности. Последнее предполагает возможность упорядочить выход ные данные по любому столбцу или по любым значениям, полученным на основе данных, содержащихся в столбце.
Строки и выражения
Во многих базах данных, использующих SQL, имеются специальные средства, по зволяющие оформлять результаты запросов. Естественно, в разных программных про дуктах они кардинально отличаются, но эти различия здесь не обсуждаются. Однако и стандартная версия SQL имеет ряд характерных свойств, позволяющих сделать нечто большее, чем просто вывести значения полей и функций агрегирования. О них и пой
дет речь в данной главе.
Скалярные выражения с выбранными полями. Предположим, необходимо выполнить простые числовые операции с данными для представления их в более удобном виде. SQL позволяет вносить скалярные выражения и константы в выбран ные поля. Эти выражения могут дополнять или заменять поля в предложениях SELECT и могут содержать множество выбранных полей. Например, если вам удоб
нее представить комиссионные продавцов в виде процентов, а не десятичных чисел,
достаточно указать:
Рис. 7.1. Использование выражения в запросе
64
Строки и выражения
SELECT snum, sname, city, comm • 100
FROM Salespeople;
Выходные данные для этого запроса представлены на рис. 7.1.
Выходные столбцы. Последний столбец в предыдущем примере не имеет имени, поскольку является выходным столбцом. Выходные столбцы - это столбцы, кото
рые создаются с помощью запроса (в тех случаях, когда в предложении запроса
SELECT используются агрегатные функции, константы или выражения), а не извле каются непосредственно из таблицы. Поскольку имена столбцов являются атрибута ми таблицы, столбцы, не переходящие из таблицы в выходные данные, не имеют имен. Почти во всех ситуациях выходные столбцы отличаются от столбцов, извле каемых из таблицы тем, что они не поименованы.
Внесение текста в выходные данные запроса. Буква 'А', не обозначающая ничего кроме самой себя, является константой, как и число 1. Константы, а также текст, можно включать в предложение запроса SELECT. Однако, буквенные констан ты, в отличие от числовых, нельзя использовать в выражениях. В SЕLЕСТ предложение можно включить 1+2, но не 'А'+ 'В', поскольку 'А' и 'В' здесь просто буквы, а не переменные или символы, используемые для обозначения чего-либо от личного от них самих. Тем не менее, возможность вставить текст в выходные данные
запроса вполне реальна.
Можно изменить предыдущий пример, пометив комиссионные, выраженные в про центах, символом "процент"(%), что позволяет представить их в выходных данных в
виде символов и комментариев, например:
SELECT snum, sname, city, ·х·, comm • 100
FROM Salespeople;
-~SOL Execut1on Log-- -- |
--- --- ; |
||||||
SELfCT snum, sname. c1ty, |
'%'comm. |
* 1"1'1 |
|
|
|||
1 FROM Salespeople, |
|
|
|
|
|
||
|
|
ЧIF!Ш- |
London••• |
|
|
|
|
|
|
|
|
|
|||
|
.,.."".1001 Peel |
|
12.00000 |
|
|||
|
1002 |
Serres |
San Jose |
% |
13.00000 |
|
|
|
1004 |
Mot.ika |
london |
% |
11. 00000 |
|
|
|
1007 |
Rifkin |
Barcelona |
% |
1 . 00001/J |
|
|
|
1l/Jl/J3 |
|
New |
Vork |
'5% |
|
|
|
|
Д)(elrod |
|
|
10.00000 |
|
|
|
|
|
|
|
|
|
|
Рис. 7.1. Включение символов в выходные данные
65
Глава 7. Форматированиерезультатов запросов
Выходные данные для этого запроса представлены на рис. 7.2.
Аналогичный прием можно применить для того, чтобы пометить выходные дан ные, включив в них некоторый комментарий. Однако нужно помнить, что один и тот же комментарий будет печататься не один раз для всей таблицы, а в каждой строке вы ходных данных. Предположим, генерируются выходные данные для отчета, в котором фиксируется количество заказов на каждый день. Выходные данные можно пометить (см. рис. 7.3), оформив запрос следующим образом:
SELECT "Fог·, odate, ·, there аге·,
COUNT (DISTINCT onum), 'orders..
FROM Orders
GROUP ВУ odate;
Грамматическую ошибку в выходных данных на 10/05/1990 можно исправить, но запрос при этом сильно усложнится. (Для этого пришлось бы использовать два запро са и операцию объединения UNION, которая будет рассмотрена в главе 14.) Вам мо жет быть полезен единственный неизменный комментарий для каждой строки таблицы, но он ограничен. Иногда более элегантное и полезное решение состоит в том, чтобы выдать один и тот же комментарий для всех выходных данных в целом или
разные комментарии для различных строк.
Многие программные продукты, использующие SQL, часто предоставляют пользо
вателям генераторы отчетов, которые применяются для форматирования и улучшения формы выходных данных. Встроенный SQL тоже может употреблять средства формати рования того языка, в который он встроен. SQL предназначен прежде всего для обработ ки данных. Его выходными данными является информация, а программа,
Рис. 7.3. Комбинирование текста, значений полей и агрегатов
66