Сейчас на сайте
Сейчас на сайте 0 пользователей и 0 гостей.

Представления и объединения

Представления не требуют, чтобы их вывод осуществлялся из одной базовой таблицы. Так как почти любой допустимый запрос SQL может быть использован в представлении, он может выводить информацию из любого числа базовых таблиц, или из других представлений. Мы можем, например, создать представление, которое показывало бы, порядки продавца и заказчика по имени:

CREATE VIEW Nameorders AS SELECT onum, amt, a.snum, sname, cname FROM Orders a, Customers b, Salespeople c WHERE a.cnum = b.cnum AND a.snum = c.snum;

Теперь вы можете выбрать (SELECT) все порядки заказчика или продавца ( * ), или можете увидеть эту информацию для любого порядка. Например, чтобы увидеть все порядки продавца Rifkin, вы должны ввести следующий запрос ( вывод показан в 20.3 Рисунке ):

SELECT * FROM Nameorders WHERE sname = 'Rifkin';

SQL Execution Log

SELECT *

FROM Nameorders

WHERE sname = 'Rifkin';

onum amt snum sname cname
3001 18.69 1007 Rifkin Cisneros
3006 1098.16 1007 Rifkin Cisneros

Рисунок 20.3: Порядки Rifkin, показанные в Nameorders Вы можете также объединять представления с другими таблицами, или базовыми таблицами или представлениями, поэтому вы можете увидеть все порядки Axelrodа и значения его комиссионных в каждом порядке:

SELECT a.sname, cname, amt comm FROM Nameorders a, Salespeople b WHERE a.sname = 'Axelrod' AND b.snum = a.snum;

Вывод для этого запроса показывается в Рисунке 20.4.

В предикате, мы могли бы написать - " WHERE a.sname = 'Axelrod' AND b.sname = 'Axelrod' " , но предикат который мы использовали здесь более общеупотребительный. Кроме того поле snum - это первичный ключ таблицы Продавцов, и следовательно должен по определению быть уникальным.

SQL Execution Log

SELECT a.sname, cname, amt * comm FROM Nameorders a, Salespeople b WHERE a.sname = 'Axelrod'

AND b.snum = a.snum;

onum amt snum sname cname
3001 18.69 1007 Rifkin Cisneros
3006 1098.16 1007 Rifkin Cisneros

Рисунок 20. 4: Объединение основной таблицы с представлением

Если бы там например было два Axelrodf, вариант с именем, будет объединять вместе их данные. Более предпочтительный вариант - использовать поле snum, чтобы хранить его отдельно.