Файл: Практика - Элементы языка SQL.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 03.04.2021

Просмотров: 410

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

(

Выражение для вычисления значения

.,..)} 

Пример 36

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

Пример 37

P.PNUM IN (1, 2, 3, 5) 

Предикат  like

  ::=

Выражение  для  вычисления  значения  строки-поиска

  [

NOT

LIKE

Выражение для вычисления значения строки-шаблона

 [

ESCAPE

Символ

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

 

Символ подчеркивания "_" может использоваться вместо любого единичного символа 

в строке-поиска, 

 

Символ процента "%" может заменять набор любых символов в строке-поиска (число 

символов в наборе может быть от 0 и более). 

Предикат null

 ::=

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

IS

 [

NOT

NULL

 

Замечание.  Предикат  NULL  применяется  специально  для  проверки,  не  равно  ли 
проверяемое выражение null-значению. 

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

 ::=

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

 {= | < | > | <= | 

>= | <>}

{

ANY

 | 

SOME

 | 

ALL

} (

Select-выражение

Замечание.  Кванторы  ANY  и  SOME  являются  синонимами  и  полностью 
взаимозаменяемы. 

Замечание. Если указан один из кванторов ANY и SOME, то предикат количественного 
сравнения  возвращает  TRUE,  если  сравниваемое  значение  совпадает 

хотя  бы  с  одним 

значением, возвращаемом в подзапросе (select-выражении). 

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

с  каждым 

значением, 

возвращаемом в подзапросе (select-выражении). 

Пример 38

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

Предикат exist

 ::=

EXIST

 (

Select-выражение

Замечание.  Предикат  EXIST  возвращает  значение  TRUE,  если  результат  подзапроса 
(select-выражения) не пуст. 

Предикат unique

 ::=

UNIQUE

 (

Select-выражение

Замечание.  Предикат  UNIQUE  возвращает  TRUE,  если  в  результате  подзапроса  (select-


background image

выражения) нет совпадающих строк. 

Предикат  match

  ::=

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

MATCH

  [

UNIQUE

]

[

PARTIAL

  | 

FULL

] (

Select-выражение

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

Предикат  overlaps

  ::=

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

OVERLAPS 

Конструктор 

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

 

Замечание.  Предикат  OVERLAPS,  является  специализированным  предикатом, 
позволяющем  определить,  будет  ли  указанный  период  времени  перекрывать  другой 
период времени. 

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

Для  того  чтобы  понять,  как  получается  результат  выполнения  оператора  SELECT, 
рассмотрим  концептуальную  схему  его  выполнения.  Эта  схема  является  именно 
концептуальной,  т.к.  гарантируется,  что  результат  будет  таким,  как  если  бы  он 
выполнялся  шаг  за  шагом  в  соответствии  с  этой  схемой.  На  самом  деле,  реально 
результат получается более изощренными алгоритмами, которыми "владеет" конкретная 
СУБД. 

Стадия 1. Выполнение одиночного оператора SELECT 

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

Шаг 1 (FROM)

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

обязательном разделе FROM. В результате шага 1 получаем таблицу A. 

Шаг  2  (WHERE)

.  Если  в  операторе  SELECT  присутствует  раздел  WHERE,  то 

сканируется  таблица  A,  полученная  при  выполнении  шага  1.  При  этом  для  каждой 
строки из таблицы A вычисляется условное выражение, приведенное в разделе WHERE. 
Только  те  строки,  для  которых  условное  выражение  возвращает  значение  TRUE, 
включаются  в  результат.  Если  раздел  WHERE  опущен,  то  сразу  переходим  к  шагу  3. 
Если  в  условном  выражении  участвуют  вложенные  подзапросы,  то  они  вычисляются  в 
соответствии с данной концептуальной схемой. В результате шага 2 получаем таблицу B. 

Шаг  3  (GROUP  BY)

.  Если  в  операторе  SELECT  присутствует  раздел  GROUP  BY,  то 

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


background image

Шаг 4 (HAVING)

. Если в операторе SELECT присутствует раздел HAVING, то группы, 

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

Шаг  5  (SELECT)

.  Каждая  группа,  полученная  на  шаге  4,  генерирует  одну  строку 

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

Стадия 2. Выполнение операций UNION, EXCEPT, INTERSECT 

Если  в  операторе  SELECT  присутствовали  ключевые  слова  UNION,  EXCEPT  и 
INTERSECT,  то  таблицы,  полученные  в  результате  выполнения  1-й  стадии, 
объединяются, вычитаются или пересекаются. 

Стадия 3. Упорядочение результата 

Если  в  операторе  SELECT  присутствует  раздел  ORDER  BY,  то  строки  полученной  на 
предыдущих шагах таблицы упорядочиваются в соответствии со списком упорядочения, 
приведенном в разделе ORDER BY. 

Как на самом деле выполняется оператор SELECT 

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

На  самом  деле  в  РСУБД  имеется 

оптимизатор

,  функцией  которого  является 

нахождение такого 

оптимального алгоритма 

выполнения запроса, который гарантирует 

получение правильного результата. 

Схематично  работу  оптимизатора  можно  представить  в  виде  последовательности 
нескольких шагов: 

Шаг  1  (Синтаксический  анализ)

.  Поступивший  запрос  подвергается  синтаксическому 

анализу.  На  этом  шаге  определяется,  правильно  ли  вообще  (с  точки  зрения  синтаксиса 


background image

SQL) сформулирован запрос. В ходе синтаксического анализа вырабатывается некоторое 
внутренне представление запроса, используемое на последующих шагах. 

Шаг  2  (Преобразование  в  каноническую  форму)

.  Запрос  во  внутреннем  представлении 

подвергается преобразованию в некоторую каноническую форму. При преобразовании к 
канонической  форме  используются  как  синтаксические,  так  и  семантические 
преобразования.  Синтаксические  преобразования  (например,  приведения  логических 
выражений к конъюнктивной или дизъюнктивной нормальной форме, замена выражений 
"x AND NOT x" на "FALSE", и т.п.) позволяют получить новое внутренне представление 
запроса, синтаксически 

эквивалентное 

исходному, но стандартное в некотором смысле. 

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

не  эквивалентный 

исходному,  но 

дающий 

тот же самый результат

Шаг  3  (Генерация  планов  выполнения  запроса  и  выбор  оптимального  плана)

.  На  этом 

шаге  оптимизатор  генерирует  множество  возможных  планов  выполнения  запроса. 
Каждый план строится как комбинация низкоуровневых процедур  доступа к данным из 
таблиц, методам соединения таблиц. Из всех сгенерированных планов выбирается план, 
обладающий  минимальной  стоимостью.  При  этом  анализируются  данные  о  наличии 
индексов у таблиц, статистических данных о распределении значений в таблицах, и т.п. 
Стоимость  плана  это,  как  правило,  сумма  стоимостей  выполнения  отдельных 
низкоуровневых  процедур,  которые  используются  для  его  выполнения.  В  стоимость 
выполнения  отдельной  процедуры  могут  входить  оценки  количества  обращений  к 
дискам, степень загруженности процессора и другие параметры. 

Шаг  4.  (Выполнение  плана  запроса)

.  На  этом  шаге  план,  выбранный  на  предыдущем 

шаге, передается на реальное выполнение. 

Во  многом  качество  конкретной  СУБД  определяется  качеством  ее  оптимизатора. 
Хороший  оптимизатор  может  повысить  скорость  выполнения  запроса  на  несколько 
порядков.  Качество  оптимизатора  определяется  тем,  какие  методы  преобразований  он 
может  использовать,  какой  статистической  и  иной  информацией  о  таблицах  он 
располагает, какие методы для оценки стоимости выполнения плана он знает. 

Реализация реляционной алгебры средствами оператора SELECT 
(Реляционная полнота SQL) 

Для того, чтобы показать, что язык SQL является реляционно полным, нужно показать, 
что любой реляционный оператор может быть выражен средствами SQL. На самом деле 
достаточно  показать,  что  средствами  SQL  можно  выразить  любой  из 

примитивных 

реляционных операторов. 

Оператор декартового произведения 

Реляционная алгебра: 

 


background image

Оператор SQL: 

SELECT A.

Поле

1, A.

Поле

2, …, B.

Поле

1, B.

Поле

2, … 

    FROM A, B; 

или 

SELECT A.

Поле

1, A.

Поле

2, …, B.

Поле

1, B.

Поле

2, … 

    FROM A CROSS JOIN B; 

Оператор проекции 

Реляционная алгебра: 

 

Оператор SQL: 

SELECT DISTINCT X, Y, …, Z 
    FROM A; 

Оператор выборки 

Реляционная алгебра: 

Оператор SQL: 

SELECT * 
    FROM A 
    WHERE c; 

Оператор объединения 

Реляционная алгебра: 

 

Оператор SQL: 

SELECT * 
    FROM A 
    UNION 
    SELECT * 
        FROM B; 

Оператор вычитания 

Реляционная алгебра: 

 

Оператор

 SQL: 

SELECT * 
    FROM A 
    EXCEPT 
    SELECT *