Материал: Graber_Martin_-_SQL_dlya_prostykh_smertnykh_-_2014

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Глава 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

Источник: https://studfile.net/preview/16418473/