ПРЕДСТАВЛЕНИЯ И ОБЬЕДИНЕНИЯ
Представления не требуют
чтобы их вывод осуществлялся из одной базовой таблицы. Так как почти любой допустимый запрос
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';
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 - это первичный
ключ таблицы
Продавцов, и следовательно должен по определению быть уникальным.
onum |
amt |
snum |
sname |
cname |
3001 |
18.69 |
1007 |
Rifkin |
Cisneros |
3006 |
1098.16 |
1007 |
Rifkin |
Cisneros |
Рисунок 20. 4: Обьединение основной таблицы с представлением
Если бы там например было два Axelrodf, вариант с именем, будет объединять вместе их данные.
Более
предпочтительный вариант - использовать поле snum чтобы хранить его отдельно.