Глава 8. Использование множества таблиц в одном за11росе
продавцу Рее! из таблицы Salespeople, и комбинирует ее с каждой строкой таблицы Customers, выбирая по одной строке из этой таблицы. Если на данной комбинации строк предикат имеет значение "истинно", т.е. поле city строки таблицы Customers со держит значение London такое же, как и у Рее!, то указанные в предложении SELECT поля из комбинации этих строк являются выходными данными. Те же действия пред принимаются относительно каждого продавца из таблицы Salespeople (некоторые из них не имеют покупателей, находящихся в том же городе).
Операция соединения таблиц посредством ссылочной
целостности
Эrа операция применяется для использования связей, встроенных в базу данных. В предыдущем примере связь между таблицами была установлена с помощью операции со
единения. Но эти таблиць1 уже связаны по значениям полем snum. Такая связь называется
состоянием ссьuючной целостности, о которой упоминалось в главе 1. Стандартное при менение операции соединения состоит в извлечении данных в терминах этой связи. Что бы показать соответствие имен покупателей именам продавцов, обслуживающих этих
покупателей, используется следующий запрос:
SELECT Customers.cname, Salespeople.sname
FROM Customers, Salespeople
WHERE Salespeople.snum = Customers.snum;
Выходные данные для этого запроса представлены на рис. 8.2.
МЭ1@IШ
Hof f man Giovanni
Liu
Grass Clemens
Рис. 8.2. Соединение двух продавцов с их покупателями
78
Соединение таблиц
Это также пример соединения, в котором столбцы, используемые в формулировке предиката запроса, - в данном случае это столбцы snum в обеих таблицах - опуще ны из выходных данных. Выходные данные показывают, какие покупатели обслужи ваются какими продавцами. Значения snum, на основании которых устанавливается
связь, в данном случае не представлены, поскольку здесь они не являются существен
ными. Однако, действуя таким образом, нужно .1ибо иметь уверенность в том, что вы ходные данные сами по себе ясны, либо дать им какие-то объяснения.
Эквисоединение и другие виды соединений
Соединение, испопьзующее предикаты, основанные на равенствах, называется эк
висоединением. Рассмотренные в данной главе примеры относятся именно к этой кате
гории, поскольку все условия в предложении WHERE базируются на математических выражениях, использующих символ равенства. "City=='London'" и "Sa\espeop\e.snum==Orders.snum" - примеры применения символа равенства в преди катах. Эквисоединение является, по-видимому, наиболее распространенным типом соединения, но существуют и другие. Фактически в соединении можно использовать любой оператор сравнения. Вот пример соединения другого рода (выходные данные
для него представлены на рис. 8.3 ):
SELECT sname, cname
FROM Salespeople, Customers WHERE sname < cname
AND rating < 200;
Эта команда полезна далеко не всегда. Она генерирует все комбинации имен про давцов и покупателей так, что первые предшествуют последним в алфавитном поряд-
Рис. 8.3. Соединение, основанное на неравенстве
79
Глава 8. Использование множества таблиц в одном запросе
ке, а последние имеют рейтинг меньше чем 200. Обычно такие сложные связи нет необходимости конструировать, и поэтому вам полезно знать также и о других воз
можностях.
Соединение более чем двух таблиц
Можно конструировать запросы путем соединения более чем двух таблиц. Предпо
ложим, нужно найти все заявки покупателей, не находящихся в том же городе, что и
их продавец. Для этого потребуется связать все три рассматриваемые таблицы (выход
ные данные представлены на рис. 8.4):
SELECT onum, cname, Orders.cnum, Orders.snum
FROM Salespeople, Customers, Orders
WHERE Customers.city <> Salespeople.city
AND Orders.cnum Customers.cnum
AND Orders.snum Salespeople.snum;
Хотя команда выглядит достаточно сложно, следуя ее логике, легко убедиться, что
ввыходных данных перечислены покупатели и продавцы, расположенные в разных
городах (они сравниваются по полю snum), и что указанные заказы сделаны именно этими покупателями (подбор заказов устанавливается в соответствие с полями cnum и
snum таблицы Orders).
Рис. 8.4. Соединение трех таблиц
80
Итоги
Итоги
Теперь вы можете не ограничиваться рассмотрением лишь одной таблицы в неко торый момент времени, а умеете сравнивать любые поля произвольного числа таблиц и применять полученные результаты для поиска нужной информации. Эта техника на столько полезна для установления связей, что используется и для их конструирования внутри единственной таблицы. В следующей главе будет рассмотрена эффективная процедура соединения двух копий одной таблицы.
81
Работаем па SQL
Запишите запрос, который выдает каждый номер заказа, и следующее за ним имя
покупателя, сделавшего этот заказ.
2.Запишите запрос, который для каждого заказа выдает после его номера имена
продавцов и покупателей.
3.Запишите запрос, который выдает имена всех покупателей, обслуживаемых про давцами, имеющими комиссионные более 12%. Выходными данными должны быть имя покупателя, имя продавца и комиссионные продавца.
4.Запишите запрос, который вычисляет размер комиссионных продавца для каж
дого заказа покупателя с рейтингом, превышающим 100.
(Ответы см. в приложении А.)
82