|
Программирование >> Хронологические базы данных
Начнем с предварительного замечания о том, что язык 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 )
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |