Эта особенность часто используется просто для эксплуатации связей встроенных в базу данных. В предыдущем примере, мы установили связь между двумя таблицами в обьединении. Это прекрасно. Но эти таблицы, уже были соединены через snum поле. Эта связь называется состоянием справочной целостности, как мы уже говорили в Главе 1. Используя обьединение можно извлекать данные в терминах этой связи. Например, чтобы показать имена всех заказчиков соответствующих продавцам которые их обслуживают, мы будем использовать такой запрос:
SELECT Customers.cname, Salespeople.sname
FROM Customers, Salespeople
WHERE Salespeople.snum=Customers.snum;
Вывод этого запроса показывается в Таблица 8.2.
Это - пример обьединения, в котором столбцы используются для определения предиката запроса, и в этом случае, snum столбцы из обеих таблиц, удалены из вывода. И это прекрасно. Вывод показывает какие заказчики каким продавцом обслуживаются; значения поля snum которые устанавливают связь - отсутствуют. Однако если вы введете их в вывод, то вы должны или удостовериться что вывод понятен сам по себе или обеспечить коментарий к данным при выводе.
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: Объединение продавцов с их заказчикам
Обьединения которые используют предикаты основанные на равенствах называются - объединениями по равенству. Все наши примеры в этой главе до настоящего времени, относились именно к этой категории, потому что все условия в предложениях WHERE базировались на математических выражениях использующих знак равно (=). Строки 'city='London' и 'Salespeople.snum=Orders.snum ' - примеры таких типов равенств найденных в предикатах. Объединения по равенству - это вероятно наиболее общий вид объединения, но имеются и другие. Вы можете, фактически, использовать любой из реляционных операторов в обьединении. Здесь показан пример другого вида объединения (вывод показывается в Таблице 8.3):
SELECT sname, cname
FROM Salespeople, Customers
WHERE sname < cname
AND rating < 200;
SELECT sname, cname FROM Salespeople, Customers
WHERE sname < cname AND rating < 200;
sname | cname |
Peel | Pereira |
Motika | Pereira |
Axelrod | Hoffman |
Axelrod | Clemens |
Axelrod | Pereira |
Таблица 8.3: Обьединение основанное на неравенстве
Эта команда не часто бывает полезна. Она воспроизводит все комбинации имени продавца и имени заказчика так, что первый предшествует последнему в алфавитном порядке, а последний имеет оценку меньше чем 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;
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 в таблице Порядков ).
Теперь вы больше не ограничиваетесь просмотром одной таблицы в каждый момент времени. Кроме того, вы можете делать сложные сравнения между любыми полями любого числа таблиц и использовать полученные результаты чтобы решать какую информацию вы бы хотели видеть. Фактически, эта методика настолько полезна для построения связей, что она часто используется для создания их внутри одиночной таблицы. Это будет правильным: вы сможете объединить таблицу с собой, а это очень удобная вещь.
Это будет темой Главы 9.
* Напишите запрос который бы вывел список номеров порядков сопровождающихся именем заказчика который создавал эти порядки.