Глава 7. Форматированиерезультатов запросов
мися в таблице, что, в свою очередь, позволяет помечать или комментировать выход ные данные различными способами.
Вы научились управлять порядком вывода результатов запроса. Несмотря на то, что сама таблица базы данных остается неупорядоченной, предложение ORDER ВУ
позволяет управлять порядком вывода строк выходных данных конкретного запроса.
Порядок представления выходных данных запроса может быть возрастающим или убывающим, и столбцы можно упорядочить один внутри другого.
Вэтой главе введено понятие выходных столбцов, которые можно применять для упорядочения результатов запроса, но эти столбцы не поименованы, поэтому для ссылки на них в предложении ORDER ВУ используется порядковый номер выходного столбца из предложения SELECТ.
Вглаве 8 будут рассмотрены более сложные запросы. Вы узнаете, как объединить
водной единственной команде запросы к множеству таблиц базы данных, установив
между ними связи.
72
·· -- · - ·· ------
Работаем на SQL
l.Предположим, каждый продавец имеет 12% комиссионных. Запишите запрос к
таблиuе Orders, который выдает номер заявки (order number), номер продавца (salesperson number) и общее значение комиссионных продавца (amount of salesperson's commission). Выходные данные упорядочите по значениям послед него столбца.
2.Запишите запрос к таблице Customers, который находит максимальный рейтинг
для каждого города. Представьте выходные данные в таком виде:
For the city (city), the highest rating is: (rating).
(Для города (city) максимальный рейтинг составляет: (rating).)
3.Запишите запрос, который выдает список покупателей (customers) в порядке убывания рейтинга (rating). Поле rating в выходных данных должно быть пер вым, за ним следуют имя покупателя (customer's name) и номер покупателя
(customer's number).
4.Запишите запрос, который подводит итоги по заказам на каждый день и пред ставляет результаты в убывающем порядке.
(Ответы на вопросы см. в прило:жении А.)
73
Использование
мноJ1Сества таблиц в одном запросе
Глава 8. Использование множества таблиц в одном запросе
До сих пор каждый рассматриваемый запрос базировался на единственной таб
лице. После изучения этой главы вы сможете формулировать запросы с помощью од ной команды для любого (произвольного) количества таблиц. Это исключительно мощная процедура, поскольку осуществляется не только комбинирование выходных данных из множества таблиц, но и устанавливаются связи между ними. Вы познако митесь с различными видами таких связей, узнаете, как они определяются и исполь
зуются.
Соединение таблиц
Одна из наиболее важных черт запросов SQL состоит в их способности определять связи между множеством таблиц и отображать содержащуюся в них информацию в
терминах этих связей в рамках единственной команды. Операция такого рода называ
ется соединение« (join) и является одной из самых мощных операций для реляцион ных баз данных. Как уже говорилось в главе 1, преимущество реляционного подхода заключается в связях (relationships), которые можно установить между элементами данных в таблице. С помощью соединений непосредственно связывается информа ция, содержащаяся в таблицах, независимо от их чис.1а, а также между отдельными частями любой таблицы.
При операции соединения таблицы перечисляются в пред~южении запроса FROM; имена таблиц разделяются запятыми. Предикат запроса может ссылаться на любой столбец любой из соединяемых таблиц и, следовательно, может использоваться для установления связей между ними. Обычно предикат сравнивает значения в столбцах различных таблиц для того, чтобы определить, удовлетворяется ли условие WHERE.
Имена таблиц и столбцов
Полное имя столбца состоит из имени таблицы, непосредственно за которым стоит точка, а за ней - имя столбца. Приведем несколько примеров:
Salespeople.snum
Customers.city
Orders.odate
В приводимых ранее примерах имена таблиц можно было опускать, поскольку за просы адресовались только к одной таблице, и SQL выполнял подстановку имени соот ветствующей таблицы в качестве префикса. Даже при формулировке запроса к множеству таблиц их имена можно опустить, если все столбцы этих таблиц различны. Однако так бывает далеко не всегда.Например, есть две простые таблицы с одинаковы ми именами столбцов-сitу. Если для них необходимо выполнить операцию соединения,
76
Соедииение таблиц
то следует указать Salespeople.city или Customers.city, что дает возможность SQL одно значно определить, о каком столбце идет речь.
Выполнение операции соединения (joiп)
Предположим, нужно установить связь между продавцами (Salespeople) и поку пателями (Customers) в соответствии с местом их проживания, чтобы получить все возможные комбинации продавцов и покупателей из одного города. Для этого не обходимо взять продавца из таблицы Salespeople и выполнить по таблице Customes поиск всех покупателей, имеющих то же значение в столбце city. Это можно сде лать, введя следующую команду (выходные данные представлены на рис. 8.1 ):
SELECT Customers.cname, Salespeople.sname, Salespeople.city
FROM Salespeople, Customers
WHERE Salespeople.city = Customers.city;
Поскольку поле city присутствует в каждой из таблиц Salespeople и Customers, име на таблиц используются перед именем city в качестве префиксов. Это необходимо в том случае, когда два или более поля имеют одинаковые имена, но для ясности и пол ноты картины полезно включать в соединения имя таблицы. В дальнейшем имена таб лиц будут использоваться там, где это необходимо, чтобы было понятно, rде они
нужны, а где нет.
Выполняя операцию соединения, необходимо генерировать все возможные сочета ния строк для двух или более таблиц и проверять истинность предиката на каждом та ком сочетании. В предыдущем примере SQL берет строку, соответствующую
rг |
SQL |
Execution Log~~~~~~~~~~~~ |
fSElfCT Customers cname. Salespeople.sname, |
||
!1Salespeople.c1ty |
|
|
'FROM |
Salespeople. Customcrs |
|
WHERE |
Salespeople c1ty |
Customers c1ty: |
1 |
|
|
srыme
Peel
Peel Serres
Рис. 8.1. Соединение двух таблиц
77