Программирование >>  Хронологические базы данных 

1 ... 83 84 85 [ 86 ] 87 88 89 ... 348


Начнем с предварительного замечания о том, что язык SQL фактически поддерживает оператор переименования реляционной алгебры RENAME после введения в стандарт SQL/92 необязательной спецификации AS <имя стол6ца> в предложении SELECT. Следовательно, можно быть уверенным, что все имена столбцов в таблицах правильны и, в частности, что операнды операций произведения, объединения и вычитания удовлетворяют требованиям реляционной алгебры (в нашей версии) в отношении именования столбцов. Более того, указанные требования к именованию столбцов операндов действительно удовлетворяются: правила вывода имен столбцов в языке SQL фактически совпадают с аналогичными правилами реляционной алгебры (в нашей версии), что было показано в главе 6.

Вот выражения языка SQL, соответствующие пяти примитивным операциям алгебры.

Алгебра Язык SQL

А WHERE р SELECT * FROM А WHERE р

А {X, у,..., Z} SELECT DISTINCT X, у,...,2 FROM А

А TIMES В А CROSS JOIN В

А UNION В SELECT * FROM А UNION SELECT * FROM В

A MINUS В SELECT * FROM A EXCEPT SELECT * FROM В

Обратившись к грамматике табличных выражений языка SQL, которая описывается в приложении А, можно увидеть, что переменные А и В в приведенных выше SQL-выражениях по сути являются значениями параметра <ссылка на та6лицу>. Можно убедиться еще и в том, что если заключить каждое из пяти показанных SQL-выражений в скобки, то оно также станет допустимым значением этого же параметра. Отсюда следует, что язык SQL на самом деле является реляционно полным.

Замечание. В действительности во всем вышесказанном есть один недостаток: язык SQL не поддерживает проекций по нулевому количеству столбцов (поскольку он не поддерживает пустых предложений SELECT). Как следствие язык SQL не поддерживает таблиц TABLE DEE и TABLE DUM [5.5].

7.10. Язык SQL поддерживает операцию EXTEND, но не SUMMARIZE (по крайней мере, не непосредственно). Что касается операции EXTEND, то выражение реляционной алгебры

EXTEND А ADD ехр AS Z

в языке SQL может быть представлено так.

SELECT А.*, ехр AS Z FROM ( А ) AS А

Выражение ехр в предложении SELECT является SQL-аналогом операнда ехр в выражении EXTEND. Заключенная в скобки ссылка на переменную А представляет собой значение параметра <ссылка на та6лицу> произвольной сложности

Здесь мы игнорируем тот факт, что в языке SQL параметр <ССЫЛКа на таблицу> в действительности требует включения в свое значение определения переменной кортежа с пустой областью значений (см. приложение А).



(соответствующую операнду А оператора EXTEND). Вторая ссылка А в предложении FROM - имя переменной кортежа.

Что касается операции SUMMARIZE, основная проблема состоит в том, что выражение реляционной алгебры

SUMMARIZE А PER В ...

возвращает результат, кардинальность которого равна кардинальности операнда В, в то время как эквивалентное этой функции SQL-выражение

SELECT ... FROM А GROUP BY С ;

возвращает результат с кардинальностью, равной кардинальности проекции таблицы А по атрибуту С.

7.11. Язык SQL не поддерживает реляционных сравнений непосредственно. Однако подобные операции можно смоделировать, хотя и в виде очень громоздких выражений. Например, реляционное сравнение А = В (где А и В - отношения) можно успешно смоделировать с помощью следующего SQL-выражения.

NOT EXISTS ( SELECT * FROM A

WHERE NOT EXISTS ( SELECT * FROM В

WHERE к-строка = В-строка ) )

Здесь операнды к-строка и В-строка- это значения параметра <конструктор строки> (приложение А), представляющие соответственно всю строку таблицы А и всю строку таблицы В.

7.12. Вот несколько таких формулировок. Заметьте, что этот список далеко не исчерпывающий [4.18]. Обратите внимание также на простоту каждого запроса!

SELECT DISTINCT S.SNAME FROM S WHERE S.St IN

( SELECT SP.St FROM SP

WHERE SP.Pt = P2 ) ;

SELECT DISTINCT T.SNAME

FROM ( S NATURAL JOIN SP ) AS T

WHERE T.Pt = P2 ;

SELECT DISTINCT T.SNAME

FROM ( S JOIN SP ON S.St = SP.Pt AND SP.Pt = P2 ) AS T ;

SELECT DISTINCT T.SNAME

FROM ( S JOIN SP USING St ) AS T

WHERE T.Pt = P2 ;



SELECT DISTINCT S.SNAME FROM S WHERE EXISTS ( SELECT * FROM SP

WHERE SP.St = S.St AND SP.Pt = P2 ) ;

SELECT DISTINCT S.SNAME FROM S, SP WHERE S.St = SP.St AND SP.Pt = P2 ;

SELECT DISTINCT S.SNAME FROM S WHERE 0 <

( SELECT COUNT(*) FROM SP

WHERE SP.St = S.St AND SP.Pt = P2 ) ;

SELECT DISTINCT S.SNAME FROM S WHERE P2 IN

( SELECT SP.Pt FROM SP

WHERE SP.St = S.St ) ; SELECT S.SNAME FROM S, SP WHERE S.St = SP.St AND SP.Pt = P2 GROUP BY S.SNAME ;

Дополнительный вопрос. Каков смысл всех приведенных выше запросов?

7.13. Мы перенумеровали решения для этого пункта как 1.\Ъ.п, где п - номер исходного упражнения в главе 6, т.е. упр. в.п. Подразумевается, что переменные SX, SY, РХ, PY, JX, JY, SPJX, SPJY и т.д. - это переменные кортежей, изменяюшихся на отношениях S, Р, J и SPJ соответственно. Определение этих переменных кортежей в ответах не показано.

7.13.13.JX

7.13.14.JX WHERE JX.CITY = London 7.13.15.SPJX.St WHERE SPJX.Jt = Jt ( Jl ) 7.13.16.SPJX WHERE SPJX.QTY > QTY ( 300 ) AND SPJX.QTY < QTY ( 750 )

7.13.17. ( PX.COLOR, PX.CITY )



1 ... 83 84 85 [ 86 ] 87 88 89 ... 348

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика