Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции 2002.doc
Скачиваний:
44
Добавлен:
15.06.2014
Размер:
335.36 Кб
Скачать

Синтаксис условных выражений (из раздела where)

Условное выражение::=

[(][NOT]

{предикат сравнения | предикат between | предикат in |

| предикат like | предикат null | предикат количественного сравнения | предикат exist | предикат unique |

| предикат match | предикат overlaps}

[{AND | OR} условное выражение][)]

[IS [NOT] {TRUE | FALSE | UNKNOWN}];

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

Конструктор значений строки {= | < | > | <= | >= | <>}

Конструктор значений строки;

Например:

P.PNUM <= 50;

(P.NUM, P.NAME) = (50, ‘Video’)

по-другому это можно записать так:

…WHERE P.NUM = 50 AND P.NAME = ‘Video’;

Предикат between::=

Конструктор значений строки [NOT] BETWEEN

Конструктор значений строки AND

Конструктор значений строки;

Например:

P.PRICE BETWEEN 20 AND 50

Предикат in::=

Конструктор значений строки [NOT] IN

{(Select выражение) | (Выражение, …)};

Например:

P.NUM IN (SELECT PD.NUM FROM PD WHERE PD.PNUM = 2)

Или так:

P.NUM IN (1, 2, 3);

Предикат like ::=

Выражение [NOT] LIKE # ~ ^

Выражение [ESCAPE символ];

Предикат LIKE производит поиск выражения в строке–шаблоне. В строке–шаблоне разрешается использовать различные трафаретные символы.

Например:

EMPLOYEE.EMAIL LIKE ‘%@%’ ( % * ? [ ] )

EMPLOYEE.NAME LIKE ‘[Y..Z]%’

Предикат NULL::=

Конструктор значений строки IS [NOT] NULL

Предикат NULL проверяет не равно ли выражение NULL–значению.

Предикат количественного сравнения::=

Конструктор значений строки {= | < | > | <= | >= | <>}

{ANY | SOME | ALL}{Select–выражение}

Кванторы ANY и SOME являются синонимами.

Если указан один из кванторов ANY или SOME, то предикат количественного сравнения возвращает TRUE, если сравниваемое значение совпадает хотя бы с одним значением, возвращаемым в подзапросе Select–выражением.

Например:

P.NUM = SOME (SELECT PD.NUM FROM PD WHERE PD.PNUM = 2)

Если указан квантор ALL, то предикат количественного сравнения возвращает TRUE, если сравниваемое значение совпадает с каждым значением, возвращаемым в подзапросе Select–выражением.

Предикат EXIST::=

EXIST (Select–выражение)

Предикат EXIST возвращает значение TRUE, если результат выполнения подзапроса Select–выражения не пуст.

Предикат UNIQUE::=

UNIQUE (Select–выражение);

Предикат UNIQUE возвращает TRUE , если в результате выполнения подзапроса нет совпадающих строк.

Предикат MATCH::=

Конструктор значений строки MATCH

[UNIQUE] [PARTIAL | FULL] (Select–выражение)

Предикат MATCH проверяет, будет ли значение, определенное в конструкторе значений строки, частично или полностью совпадать с результатом подзапроса Select-выражения.

Предикат OVERLAPS::=

Конструктор значений строки OVERLAPS

Конструктор значений строки;

Предикат OVERLAPS определяет, будет ли первое выражение накрывать промежуток времени, занимаемый другим выражением.

Порядок выполнения оператора select

Теоретически оператор SELECT должен выполняться так:

Если в операторе присутствуют ключевые слова UNION, EXCEPT, INTERSECT, то запрос разбивается на несколько независимых запросов, каждый из которых вычисляется отдельно, по шагам. Шаги:

  1. FROM

Вычисляется декартово произведение всех таблиц, указанных в обязательном разделе FROM. В результате шага 1 получаем таблицу А.

  1. WHERE

Если в операторе Select присутствует раздел WHERE, то сканируется таблица А, полученная на первом шаге, при этом для каждой строки из таблицы А вычисляется условное выражение, приведенное в разделе WHERE. В результирующем отношении будут присутствовать только те строки, которые удовлетворяют разделу WHERE. Результатом шага 2 является таблица В.

  1. GROUP BY

Если в разделе Select присутствует раздел GROUP BY, то строки таблицы В, полученной на втором шаге, группируются в соответствии со списком группировки, приведенным в разделе GROUP BY. В результате получим таблицу С.

  1. HAVING

Если в операторе Select присутствует раздел HAVING, то группы, не удовлетворяющие условному выражению, приведенному в этом разделе, исключаются. В результате получим таблицу D.

  1. SELECT

Выполняется сам оператор SELECT. Каждая группа, полученная на шаге 4, генерирует одну строку результата следующим образом:

  • Вычисляются все скалярные выражения, используемые в разделе SELECT. По правилам использования раздела GROUP BY такие скалярные выражения должны быть одинаковыми для всех строк внутри каждой группы.

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

После всего этого выполняются операции UNION, EXCEPT, INTERSECT.

Это был теоретический план выполнения оператора SELECT. Но этот алгоритм не является оптимальным. На самом деле это происходит приблизительно по такому алгоритму:

  1. анализ синтаксиса

  2. преобразование запроса в некоторую эквивалентную каноническую форму

  3. анализ семантики (X AND NOT X = FALSE) и анализ ограничений целостности.

  4. генерация планов выполнения запроса

  5. выбор оптимального плана и его выполнение.