Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория СУБД Часть 1 Копачев Алексей Геннадьевич, БГУИР (Мет пособие).pdf
Скачиваний:
63
Добавлен:
15.06.2014
Размер:
583 Кб
Скачать
☆

30

2.выражение запросов – выражения, строящиеся на спецификации курсора.

UNION – обязательное условие наличия данного слова

Объединение таблиц должно содержать одинаковое количество столбцов и должно иметь одинаковые типы.

ORDER BY – позволяет устанавливать порядок просмотра результатов выполнения запроса.

<order by clause>::= ORDER BY <sort specification> <sort specification> ::= ASC | OECS

Определение выборки – позволяет получить результат выполнения запроса без привлечения курсора.

SELECT * INFO temp

Табличные выражения.

Табличные выражения – это совокупность последовательности выполнения разделов FROM, WHERE, GROPE BY

<from clause>::= FROM <table reference > [{,<table reference>}…]

<table reference>::=<table name> [<correlation name>]

Раздел WHERE записывается следующим образом: <where clause>::=WHERE <search condition>

<search condition>::=<boolean term >(< search condition > OR <boolean term>)

<boolean term>::=<boolean factor >(<boolean term> AND <boolean factor>)

<boolean factor>::=[NOT] <boolean primary>

<boolean primary>::=< predicate> | (<search condition>)

Пусть R- есть некоторый результат, полученный из раздела FROM, тогда вычислением раздела WHERE будет

Если условие выборки содержит подзапросы, то каждый подзапрос вычисляется для каждого картежа таблицы R.

3VL – трехзначная логика (3 value logic).

3VL – исключительно экстраперабельна (переносима).

31

T AND U = U

(U - unknown)

U AND U = U

(T - true)

T OR U = T

 

U OR U = U

 

NOT U = U

 

Среди предикатов условия поиска предусматривают:

1)предикат сравнения;

2)предикат between;

3)предикат in;

4)предикат like;

5)предикат null;

6)предикат с квантором;

7)предикат exists.

Все предикаты влияют на эффективность запроса. По возможности использовать простые предикаты.

Предикат сравнения.

<comparison predicate>::=<value expression><comp op>

{< value expression >|<subquery>} <comp op>::==|<>|<|>|<=|>=

(Операнды) таблицы, строим из From и др. Операнды должны быть сравнимы по типу.

Если правый операнд является подзапросом, то мощность результирующего выражения должно быть не больше 1.

Если операнды имеют значения U и результат подзапроса U, то результат

– U.

В стандарте SQL’89 неопределённые значения используется как отдельный тип данных или ссылки в разделах DISTINCT, GROUP BY и ORDER BY.

Предикат between.

<between predicate>::=<value expression>::=

[NOT] Between <value expression> AND <value expression>

Предикат in.

<in predicate>::=<value expression> [NOT] in

{<subquery>|(<in value list>)} <in value list>::==<value specification>{,<value specification>}

32

Типы операндов слева и справа должны быть сравнимы. Значение предиката есть True, если значение слева совпадает хотя бы с одним значением, содержащимся в правой части.

Предикат like.

<like predicate>::=<column specification> [NOT] LIKE <pattern> [ESCAPE <escape character>]

<pattern>::=<value specification>

<escape character>::=<value specification>

Операнды слева и справа должны быть типа символьной строки. Значение предиката есть true, если шаблон есть вхождение, подстрока заданного подстолбца. Если раздел Escape отсутствует, то есть специальная интерпретация двух символов в шаблоне:

1)“_” – как любой одиночный символ;

2)“%” – последовательность произвольных символов произвольной длинны.

Если Escape присутствует, например Х, то “х_”, “х%”.

Предикат null.

<null predicate>::=<column specification> is [NOT] NULL

Значение предиката принимает либо True, либо Null. X IS NULL, X = UNKNOWN.

True в том случае, если значение операнда слева неопределённо.

Предикат с квантором.

<quantified predicate>::=<value expression>

<comp op><quantifier><subquery> <quantifier>::=<all>|<some>

<all>::=ALL

<some>::=SOME|ALL

Пусть через Х обозначим результат арифметического выражения в левой части.

S – результат выполнения подзапроса.

Тогда результат Х <comp op> ALL S=T, если S – пустое или Х

<comp op> S=true, для всех s € S.

Х<comp op> ALL S=F хотя бы для одного s Х <comp op> S = false, иначе значение = U.

Х<comp op> SOME S=F, если S – пустое или Х

<comp op> S=false, для всех s € S.

33

Х<comp op> SOME S=T, если Х <comp op> S=true хотя бы для одного s

Х<comp op> S = false, иначе значение = U.

Предикат exists.

<exists predicate>::=EXISTS <subquery>

Значение предиката истина, когда результат выполнения не пуст.

GROUP BY.

<group by clause>::= GROUP BY <column specification> [{,<column specification >}…]

Если представить в качестве R результат выполнения предыдущих разделов, то результатом GROUP BY является разделение R на множество групп строк, состоящего из минимально числа таких групп, что для каждого столбца из списка GROUP BYво всех строках каждой группы значения равны.

Раздел Having.

<having clause>::=HAVING <search condition>

Раздел having осмысленно появляется при наличии раздела group by. Задаётся для поиска строк внутри групп сгруппированной таблицы.

Условие поиска по те же правилам, что и в разделе Where. Но одно отличие, что условие задаётся на группу строк, а не на одну строку.

Результат поиска для каждой таблицы которая даёт True.

Агрегатные функции. (результата запроса)

<set function specification>::= COUNT (*) |<distinct set function> |<all set function>

<distinct set function>::={AVG|MAX|MIN|SUM|COUNT} (DISTINCT<column specification>)

<all set function>::={AVG|MAX|MIN|SUM}([ALL]<value expression>)

Семантика агрегатных функций.

Если T – есть тип значений, то результат функции COUNT совпадает с типом T в соответствии с точностью в конкретной реализации.

Для всех агрегатных функций кроме COUNT порядок вычисления следующий:

1) на основании параметров функции из заданного множества строк формируется список значений