СОЗДАНИЕ ОБЪЕДИНЕНИЯ
 
 
Предположим что вы хотите поставить в соответствии вашему продавцу 
ваших заказчиков в городе в котором они живут, поэтому вы увидите все 
комбинации продавцов и заказчиков для этого города. Вы будете должны 
брать каждого продавца и искать в таблице Заказчиков всех заказчиков 
того же самого города. Вы могли бы сделать это, введя следующую коман- 
ду ( вывод показывается в Рисунке 8.1 ): 
 
 SELECT Customers.cname, Salespeople.sname, 
 Salespeople.city 
 FROM Salespeople, Customers 
 WHERE Salespeople.city = Customers.city; 
 
 
 =============== SQL Execution Log ============ 
 | SELECT Customers.cname, Salespeople.sname, | 
 | Salespeople.city | 
 | FROM Salespeople, Customers | 
 | WHERE Salespeople.city = Customers.city | 
 | ============================================= | 
 | cname cname city | 
 | ------- -------- ---- | 
 | Hoffman Peel London | 
 | Hoffman Peel London | 
 | Liu Serres San Jose | 
 | Cisneros Serres San Jose | 
 | Hoffman Motika London | 
 | Clemens Motika London | 
 ============================================= 
 
Рисунок 8.1: Объединение двух таблиц 
 
 Так как это поле city имеется и в таблице Продавцов и таблице 
Заказчиков, имена таблиц должны использоваться как префиксы. Хотя 
это необходимо только когда два или более полей имеют одно и то же 
им, в любом случае это хороша идея включать имя таблицы в объединение 
для лучшего понимания и непротиворечивости. Несмотря на это, 
мы будем, в наших примерах далее, использовать имена таблицы только 
когда необходимо, так что будет ясно, когда они необходимы а когда нет. 
 Что SQL в основном делает в объединении - так это исследует 
каждую комбинацию строк двух или более возможных таблиц, и 
проверяет эти комбинации по их предикатам. В предыдущем примере, 
требовалась строка продавца Peel из таблицы Продавцов и объединение 
ее с каждой строкой таблицы Пользователей, по одной в каждый момент 
времени. 
Если комбинация производит значение которое делает предикат верным, 
и если поле city из строк таблиц Заказчика равно London, то Peel - это 
то запрашиваемое значение которое комбинация выберет для вывода. То же 
самое будет затем выполнено для каждого продавца в таблице Продавцов 
( у некоторых из которых не было никаких заказчиков в этих городах). 
 
ОБЪЕДИНЕНИЕ ТАБЛИЦ ЧЕРЕЗ СПРАВОЧНУЮ ЦЕЛОСТНОСТЬ
 
 
Эта особенность часто используется просто для эксплуатации связей 
встроенных в базу данных. В предыдущем примере, мы установили 
связь между двум таблицами в объединении. Это прекрасно. 
Но эти таблицы, уже были соединены через snum поле. Эта связь 
называется состоянием справочной целостности, как мы уже говорили 
в Главе 1. Используя объединение можно извлекать данные в терминах 
этой связи. Например, чтобы показать имена всех заказчиков соответст- 
вующих продавцам которые их обслуживают, мы будем использовать 
такой запрос: 
 
 SELECT Customers.cname, Salespeople.sname 
 FROM Customers, Salespeople 
 WHERE Salespeople.snum = Customers.snum; 
 
Вывод этого запроса показывается в Рисунке 8.2. 
 
Это - пример объединения, в котором столбцы используются для определения 
предиката запроса, и в этом случае, snum столбцы из обеих таблиц, 
удалены из вывода. И это прекрасно. 
Вывод показывает какие заказчики каким продавцом обслуживаются; 
значения пол snum которые устанавливают связь - отсутствуют. Однако если 
вы введете их в вывод, то вы должны или удостовериться что вывод понятен 
сам по себе или обеспечить комментарий к данным при выводе. 
 
 
 =============== SQL Execution Log ============ 
 | SELECT Customers.cname, Salespeople.sname, | 
 | FROM Salespeople, Customers | 
 | WHERE Salespeople.snum = Customers.snum | 
 | ============================================= | 
 | cname sname | 
 | ------- -------- | 
 | Hoffman Peel | 
 | Giovanni Axelrod | 
 | Liu Serres | 
 | Grass Serres | 
 | Clemens Peel | 
 | Cisneros Rifkin | 
 | Pereira Motika | 
 ============================================= 
 
Рисунок 8.2: Объединение продавцов с их заказчикам 
ОБЪЕДИНЕНИЕ БОЛЕЕ ДВУХ ТАБЛИЦ
 
 
Вы можете также создавать запросы объединяющие более двух таблиц. 
Предположим что мы хотим найти все порядки заказчиков не находящихся 
в тех городах где находятся их продавцы. Для этого необходимо связать 
все три наши типовые таблицы ( вывод показывается в Рисунке 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; 
 
 
 =============== SQL Execution Log ============== 
 | | 
 | 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; | 
 | =============================================== | 
 | onum cname cnum snum | 
 | ------ ------- ----- ----- | 
 | 3001 Cisneros 2008 1007 | 
 | 3002 Pereira 2007 1004 | 
 | 3006 Cisneros 2008 1007 | 
 | 3009 Giovanni 2002 1003 | 
 | 3007 Grass 2004 1002 | 
 | 3010 Grass 2004 1002 | 
 =============================================== 
 
Рисунок 8. 4: Объединение трех таблиц 
 
Хотя эта команда выглядит скорее как комплексна, вы можете следовать 
за логикой, просто проверяя - что заказчики не размещены в тех городах 
где размещены их продавцы ( совпадение двух snum полей ), и что пере- 
численные порядки - выполнены с помощью этих заказчиков( совпадение 
порядков с полями cnum и snum в таблице Порядков ).