Студопедия

КАТЕГОРИИ:


Архитектура-(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; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.