КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Средства языка SQL
Примеры для исчисления кортежей Кванторы Существует два квантора: EXISTS и FORALL. Квантор EXISTS является квантором существования, а FORALL – квантором всеобщности. Если выражение p – логическое выражение, в которой переменная V свободна, то выражения EXISTS V(p) и FORALL V(p) также являются допустимыми логическими выражениями, но переменная V в них обеих будет связанная. Первая формула означает: «Существует, по крайней мере, одно значение переменной V, такое, что вычисление выражения p дает для него значение истина». Второе выражение означает: «Для всех значений переменной V вычисление выражения p дает для него значение истина». Пример 3.9. Рассмотрим следующий квантор существования: EXISTS SPX (SPX.S#=SX.S# AND SPX.P#=’P2’) Данное выражение может быть прочитано следующим образом: В текущем значении переменной-отношения SP существует, по крайней мере, один кортеж (скажем, SPX), такой, для которого значение атрибута S# в этом кортеже равно значению атрибута SX.S# (какое бы оно ни было), а значение атрибута P# в кортеже SPX равно ‘P2’.
Представим несколько примеров использования реляционного исчисления кортежей для формулирования запросов. 1. Определить номера поставщиков из Твери со статусом, большим 20. (SX.S#, SX.STATUS) WHERE SX.CITY = ‘Тверь’ AND SX.STATUS > 20 2. Определить имена поставщиков детали с номером ‘P2’. SX.SNAME WHERE EXISTS SPX(SPX.S#=SX.S# AND SPX.P#=’P2’) 3. Определить имена поставщиков по крайней мере одной красной детали. SX.SNAME WHERE EXISTS SPX (SX.S#=SPX.S# AND EXISTS PX (PX.P# = SPX.P# AND PX.COLOR = ‘Красный’)) 4. Найти имена поставщиков по крайней мере одной детали, поставляемой поставщиком с номером ‘П2’. SX.SNAME WHERE EXISTS SPX (EXISTS SPY(SX.S# = SPX.S# AND SPX.P# = SPY.P# AND SPY.S# = ‘П2’)) 5. Выбрать имена поставщиков всех типов деталей. SX.SNAME WHERE FORALL PX (EXISTS SPX (SPX.S# = SX.S# AND SPX.P# = PX.P#)) 6. Определить имена поставщиков, которые не поставляют деталь с номером ‘P2’. SX.SNAME WHERE NOT EXISTS SPX (SPX.S# = SX.S# AND SPX.P# = ‘P2’)
Как отмечалось, в основу реляционного языка может быть положена как реляционная алгебра, так и реляционное исчисление. Язык SQL имеет элементы как одного, так и другого, но полностью не реализует ни то, ни другое. Когда язык SQL разрабатывался, предполагалось, что он будет отличаться как от реляционной алгебры, так и от реляционного исчисления. Язык в настоящем своем виде похож и на реляционную алгебру, и на реляционное исчисление. Запросы в языке SQL формулируются в виде табличных выражений, которые потенциально могут иметь очень высокую степень сложности. Рассмотрение возможностей языка предлагается осуществить путем представления нескольких примеров. В качестве основы для примеров взяты определения SQL-таблиц для базы данных поставщиков и деталей (см. лекцию № 2). 1. Указать цвета и названия городов, в которых находятся детали «не из Твери» c весом, превышающим 10 кг. SELECT PX.COLOR, PX.CITY FROM P AS PX WHERE PX.CITY <> ‘Тверь’ AND PX.WEIGHT > 10 Необходимо отметить внимание на: § Поддержку скалярных операторов сравнения: =, <,>,<=,>=,<>. § Имеется возможность введения переменной кортежа, областью значений которой является таблица P. § В языке SQL допускается неявное обращение к переменным кортежей (без P AS PX). Если этого явно не указано, то в качестве переменной кортежа принимается одноименная переменная с именем таблицы. § Можно обходиться без спецификаторов доступа (P.), там, где не возникает неоднозначности. § Может присутствовать предложение ORDER BY для сортировки значений результата запроса. § Вместо перечисления всех имен столбцов таблицы может употребляться символ ‘*’ для сокращения записи в предложении SELECT. § Запрос может вернуть таблицу с одинаковыми строками, так как SQL не предполагает удаления излишних дублирующихся строк из результата, пока пользователь явно не потребует этого при помощи оператора DISTINCT (SELECT DISTINCT …). В результате можно заключить, что фундаментальным объектом данных в языке SQL является не отношение, а таблица. SQL-таблицы содержат не множества, а мультимножества строк (допускают повторение элементов). 2. Для всех деталей указать номер и вес в фунтах SELECT P.P#, P.WEIGHT / 0.454 AS WF FROM P Спецификация AS WF вводит имя результирующего столбца. 3. Выбрать информацию обо всех парах поставщиков и деталей, находящихся в одном городе SELECT S.*, P.P#, P.PNAME, P.COLOR, P.WEIGHT FROM S, P WHERE S.CITY = P.CITY Сначала в предложении FROM мы получаем декартово произведение S TIMES P. Затем в предложении WHERE осуществляется выборка, результат которой – естественное соединение S и P по атрибуту CITY. В конце осуществляется проекция выборки по столбцам в предложении SELECT. 4. Определить общее количество поставщиков SELECT COUNT(*) AS N FROM S Результатом будет таблица с одним столбцом, которому присвоено имя N, и одной строкой, содержащей в качестве значения атрибута число поставщиков. Язык SQL поддерживает набор обобщающих функций: COUNT, AVG, SUM, MAX, MIN. Важно указание ключевого слова DISTINCT. Функция COUNT не допускает использования ключевого слова DISTINCT. 5. Для каждой поставляемой детали указать номер и общий объем поставки в штуках SELECT SP.P#, SUM(SP.QTY) AS TOTQTY FROM SP GROUP BY SP.P# В данном запросе идет группировка по значению в столбце P# и внутри группы идет суммирование. Выражение в предложении SELECT должно быть однозначным для группы. 6. Указать номера всех типов деталей, поставляемых более чем одним поставщиком SELECT SP.P# FROM SP GROUP BY SP.P# HAVING COUNT(SP.S#) > 1; Предложение HAVING в отношении групп является тем же, что и предложение WHERE для отдельных строк, т.е. используется для исключения групп аналогично тому, как предложение WHERE используется для исключения отдельных строк. Выражение в предложении HAVING должно быть однозначным для заданной группы. 7. Определить имена поставщиков детали с номером ‘P2’ SELECT DISTINCT S.SNAME FROM S WHERE S.S# IN (SELECT SP.S# FROM SP WHERE SP.P# = ‘P2’); В этом примере используется подзапрос – выражение из предложений SELECT-FROM-WHERE-GROUP BY-HAVING, которое вложено в другое такое же выражение. Подзапрос чаще всего используется для представления множества значений, поиск которых осуществляется с помощью предложения IN-условия. 8. Определить имена поставщиков, по крайней мере, одной красной детали SELECT DISTINCT S.SNAME FROM S WHERE S.S# IN (SELECT SP.S# FROM SP WHERE SP.P# IN (SELECT P.P# FROM P WHERE P.COLOR=’Красный’)); Подзапросы могут иметь произвольную глубину вложения. 9. Указать имена поставщиков, статус которых меньше текущего максимального статуса в таблице S SELECT S.S# FROM S WHERE S.STATUS < (SELECT MAX(S.STATUS) FROM S) 10. Выбрать имена поставщиков, которые не поставляют деталь с номером ‘P2’ SELECT DISTINCT S.SNAME FROM S WHERE NOT EXISTS (SELECT * FROM SP WHERE SP.S#=S.S# AND SP.P#=’P2’) SQL-выражение EXISTS будет иметь значение истина тогда и только тогда, когда результат вычисления внутреннего выражения SELECT … FROM … будет непустым. Это аналог квантора существования в реляционном исчислении. Однако нет поддержки квантора всеобщности, для чего используются отрицания кванторов существования, что продемонстрировано в следующем примере. 11. Определить имена поставщиков все типов деталей SELECT DISTINCT S.SNAME FROM S WHERE NOT EXISTS (SELECT * FROM P WHERE NOT EXISTS (SELECT * FROM SP WHERE SP.S#=S.S# AND SP.P#=P.P#) Этот запрос можно описать следующим образом: «Выбрать всех поставщиков, для которых не существует детали, которая бы не поставлялась данным поставщиком». Также имеются операции UNION, INTERSECT и EXCEPT (аналог MINUS).
Дата добавления: 2015-05-09; Просмотров: 1373; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |