Представления не требуют, чтобы их вывод осуществлялся из одной базовой таблицы. Так как почти любой допустимый запрос 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;
Теперь вы можете выбрать все Заказы заказчика или продавца, или можете увидеть эту информацию для любого Заказа.
Например, чтобы увидеть все Заказы продавца Rifkin, вы должны ввести следующий запрос (вывод показан в 20.3 Рисунке):
Рисунок 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. Объединение основной таблицы с представлением
Если бы там, например, было два Axelrod, вариант с именем будет объединять вместе их данные. Более предпочтительный вариант — использовать поле snum, чтобы хранить его отдельно.