Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Базы Данных - Сибилев, 2007

.pdf
Скачиваний:
290
Добавлен:
11.05.2015
Размер:
1.93 Mб
Скачать

161

Кластер – это набор каталогов. Он является максимальной базой данных конкретного ID и содержит все объекты, доступные ему в конкретном сеансе.

КЛАСТЕР

Каталог 1

 

Каталог k

 

Каталог n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Информационная

 

Схема 1

 

Схема l

 

Схема m

схема

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Домены Таблицы Правила Привилегии ...

Рис. 7.3 Организация данных в SQL-системе

Теперь, имея общее представление об SQL, можно приступить к изу-

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

ние. Излагаемый здесь материал следует рассматривать как краткое введе-

ние в SQL. Для получения более полных представлений о языке читайте предложенную литературу.

7.1.15 Элементы синтаксических диаграмм

Важная особенность операторов SQL состоит в том, что человек в состоянии без особых затруднений интерпретировать их правильными фразами естественного языка. Поэтому конечные пользователи обычно понимают текст SQL, если его автор использует семантически значимые имена таблиц, столбцов и т.п. Однако в отличие от естественного языка каждая фраза SQL имеет единственный смысл и не может быть истолкова-

на двояко, поскольку все синтаксические элементы операторов точно оп-

ределены.

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

162

ном стандартные обозначения формы Бэкуса-Наура (БНФ), но встречаются

идополнения. Ниже приводится полный список обозначений.

Символом ‘::=’ обозначается равенство по определению.

Ключевые слова, составляющие часть оператора, записываются прописными буквами и выделяются полужирным шрифтом. Так же выде-

ляются специальные символы, являющиеся частями операторов.

− Метки-заполнители конкретных значений элементов схемы или переменных записываются курсивом. Они не являются частями операто-

ров и не несут никакой смысловой нагрузки.

− Символ ‘_’ используется в метках-заполнителях вместо пробела.

Слова, соединенные этим символом, образуют метку.

Необязательные элементы оператора заключены в квадратные скобки ‘[’, ‘]’.

Вертикальная черта ‘|’ используется в качестве разделителя в спи-

ске элементов. Она указывает, что любой предшествующий ей элемент может быть заменен любым следующим за ней.

− Фигурные скобки ‘{’, ‘}’ указывают, что всё находящееся внутри рассматривается как единое целое при использовании других специаль-

ных символов.

Символ ‘…’ означает, что предшествующая часть оператора может быть повторена любое число раз без разделителей.

Символ ‘.,..’ указывает, что предшествующая часть оператора может быть повторена любое число раз с разделителем ‘,’. Запятая после последнего повторения не ставится.

Круглые скобки ‘(’, ‘)’ в диаграмме являются частью определяемо-

го оператора.

− Символ ‘;’ есть концевой ограничитель оператора.

Пробелы и символы перевода строки, встречающиеся в определени-

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

Нет необходимости в точности повторять их в собственных программах.

163

Для иллюстрации действия операторов SQL далее используется

«учебная» БД «Поставщик–Деталь–Изделие» (см. приложение А).

7.2 Язык манипулирования данными

7.2.1 Назначение операторов

В состав языка манипулирования данными (DML) входят четыре оператора, предназначенных для извлечения и обновления данных. Эти операторы (таблица 7.3) применяются только к именованным таблицам. Их общая особенность состоит в том, что они описывают конечный результат

обработки данных, а не процедуру обработки. SQL-система сама определя-

ет, где находятся нужные данные, и какие пути доступа к ним существуют,

и сама генерирует эффективные последовательности операций для их по-

лучения (обновления).

Таблица 7.3 – Операторы DML

Название Назначение

SELECT Осуществляет выборку данных из одной или более таблиц, со-

бирая их в неименованную временную таблицу.

INSERT Добавляет новые строки в существующую таблицу.

UPDATE Обновляет значения указанных полей в строках существую-

щей таблицы.

DELETE Удаляет строки существующей таблицы.

Операторы DML являются декларациями, содержащими определе-

ния операций над данными на концептуальном уровне. Они объявляют системе о том, какие действия она должна выполнить, и указывают объ-

екты схемы, которые должны при этом использоваться.

7.2.2 Оператор выборки данных

Оператор SELECT реализует концепции реляционной алгебры и ре-

ляционного исчисления и является наиболее сложной и богатой возможно-

стями командой языка. Результатом действия оператора является неимено-

164

ванная таблица, на которую невозможно сослаться из других команд SQL.

Тем не менее, произведенный оператором SELECT результат может быть использован для управления работой любого другого оператора DML.

Кроме того, оператор SELECT используется в определениях ограничений,

а представления можно трактовать как именованные операторы SELECT.

Оператор SELECT часто используется в предикатах SQL в качестве переменной в простом операторе сравнения или в качестве определения множества допустимых значений переменной в специальных предикатах.

Это обеспечивает возможность вложения команд выборки данных, благо-

даря чему запрос любой сложности может быть сформулирован в виде од-

ного оператора SELECT, содержащего несколько подзапросов – вложен-

ных команд SELECT.

Многие основные и вспомогательные конструкции SQL созданы для описания понятий, связанных с выборкой данных. Поэтому мы начнем знакомство с языком именно с оператора SELECT, являющегося фунда-

ментальным средством. Далее предполагается, что читатель владеет ос-

новными понятиями реляционной алгебры и реляционного исчисления.

Синтаксическая диаграмма оператора имеет вид:

SELECT [ DISTINCT ] {элемент_целевого_списка.,..} | [спецификатор.]*

FROM {{имя_таблицы [[AS] псевдоним [(имя_столбца.,..)] ]} |{подзапрос [AS] псевдоним [(имя_столбца.,..)] }

| соединение }.,.. [WHERE предикат]

[ GROUP BY { [спецификатор.]имя_столбца }.,..] [ HAVING предикат ]

[ ORDER BY {{ имя_целевого_столбца [ ASC | DESC ]}.,..} | {{ положительное_целое [ ASC | DESC ]}.,..}];

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

11 Здесь и далее предложением называется часть оператора, следующая за ключевым словом.

165

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

ложения SELECT) и из каких таблиц (список таблиц в предложении FROM).

Остальные четыре предложения (WHERE, GROUP BY, HAVING, ORDER BY)

определяют условия, которым должны удовлетворять выходные данные.

Порядок следования предложений в любом реальном операторе

SELECT должен соответствовать указаному в диаграмме.

Прежде чем познакомиться с деталями синтаксических конструкций,

рассмотрим с концептуальной точки зрения процесс исполнения оператора

вцелом.

7.2.3Обработка оператора SELECT

Последовательность обработки предложений в операторе

SELECT (рис. 7.4) не вполне соответствует порядку их следования в син-

таксической диаграмме.

FROM WHERE GROUP BY HAVING SELECT ORDER BY

Рис. 7.4 Порядок обработки предложений оператора SELECT

Первым всегда обрабатывается предложение FROM. Оно описывает

источник данных – набор таблиц, содержащих запрашиваемые данные. В

результате обработки в рабочем буфере системы создается неименованная временная таблица, которую мы будем называть далее F-таблицей. С кон-

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

Необязательные предложения WHERE, GROUP BY, HAVING, если они использованы в команде, обрабатываются в указанном порядке после пред-

12 Не следует думать, что реальная SQL-система действительно создает в своем рабочем буфере расширенное прямое произведение.

166

ложения FROM. В результате обработки в рабочих буферах системы созда-

ются неименованные временные таблицы, которые мы будем называть W- , G- и H-таблицами соответственно. Каждая из них является преобразова-

нием таблицы предыдущего уровня.

W-таблица содержит только те строки F-таблицы, на которых пре-

дикат предложения WHERE принял значение TRUE.

G-таблица представляет собой F- или W-таблицу, строки которой собраны в группы с одинаковыми наборами значений в столбцах, указан-

ных после ключевого слова GROUP BY.

H-таблица включает только такие группы строк из G-таблицы13, на которых предикат предложения HAVING принял значение TRUE.

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

жения SELECT. В простейшем случае её можно представлять себе как ре-

ляционную проекцию F-, W-, G- или H-таблицы на столбцы, указанные после ключевого слова. На самом деле это неточно, так как элементами целевого списка запроса могут быть не только имена столбцов источника,

но и выражения, агрегатные функции и т.п.

Предложение ORDER BY всегда обрабатывается после предложе-

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

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

В процессе обработки оператора SELECT никаких изменений в фи-

зической базе данных не происходит. Система манипулирует копиями ба-

зовых таблиц в своих рабочих буферах.

На основании изложенного выше можно сформулировать следую-

щий алгоритм исполнения оператора SELECT.

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

13 Строго говоря, стандарт не запрещает использование HAVING без GROUP BY, но на практике эта возможность используется чрезвычайно редко.

167

2. Если в состав оператора включено предложение WHERE, то для каждой строки F-таблицы вычислить значение предиката, указанного по-

сле ключевого слова. Вычислить и поместить в рабочий буфер W-таблицу,

составленную из строк F-таблицы, на которых предикат принял значение

TRUE.

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

4.Если в составе оператора присутствует ключевое слово HAVING,

то для каждой группы строк G-таблицы вычислить значение предиката,

указанного после ключевого слова. Вычислить и поместить в рабочий бу-

фер H-таблицу, составленную из строк G-таблицы, на которых предикат принял значение TRUE.

5. Если в рабочем буфере находится F-таблица или W-таблица, то для каждой строки рабочего буфера вычислить значения столбцов, указан-

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

Иначе, если в рабочем буфере находится G-таблица или H-таблица,

то для каждой группы строк рабочего буфера вычислить значения столб-

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

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

Ни одна реляционная СУБД не реализует этот алгоритм вслед-

ствие его сугубой неэффективности. Его следует считать алгоритмиче-

ским определением оператора SELECT.

Рассмотрим теперь синтаксические конструкции оператора более де-

тально.

168

7.2.4 Предложение SELECT

Предложение SELECT описывает целевой список – заголовок вы-

ходной таблицы запроса.

Список может задаваться посредством перечисления элементов.

элемент_целевого_списка ::=

{

{

{[спецификатор.]имя_столбца} | выражение

| агрегатная_функция

}

[ AS имя_целевого_столбца ]

}

| символьная_константа

спецификатор – имя или псевдоним источника данных;

имя_столбца – имя столбца источника данных;

выражение – допустимое выражение для вычисления значения;

агрегатная_функция – функция множества значений (столбца), воз-

вращающая скалярное значение;

имя_целевого_столбца – имя столбца выходной таблицы; обычно используется для именования столбцов, содержащих значения выражений или агрегатных функций;

символьная_константа – любая последовательность допустимых символов.

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

проса задаётся явно, а типы и длины значений столбцов наследуются от соответствующих столбцов базовых таблиц.

Если для определения целевого списка используется конструкция

[спецификатор.]*, то в заголовок выходной таблицы войдут (в соответст-

вующем порядке) все столбцы указанного источника данных.

Примеры допустимых предложений SELECT приведены ниже.

169

7.2.5 Предложение FROM

Предложение FROM определяет исходные данные для запроса – ис-

точник данных. Обычно источниками данных являются именованные таб-

лицы.

имя_таблицы – имя базовой таблицы или представления.

[AS] псевдоним[(имя_столбца.,..)] – необязательная конструкция,

определяющая новое имя таблицы и, возможно, новые имена её столбцов.

Ключевое слово AS смысловой нагрузки не несёт. Псевдоним использует-

ся для ссылок в последующих предложениях команды и действителен

только внутри того оператора SELECT, в котором определён. Обычно именованным таблицам назначают псевдонимы для того, чтобы облегчить понимание запроса человеком. Однако в ряде случаев псевдонимы необхо-

димы для разрешения конфликтов имён.

Стандарт SQL1 допускал в предложении FROM только ссылки на имена базовых таблиц и представлений. В отличие от этого, SQL2 разре-

шает использовать в качестве источников данных неименованные таблицы

– результаты запросов или явно заданных реляционных операций соедине-

ния.

Конструкция

подзапрос [AS] псевдоним [(имя_столбца.,..)]

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

Здесь подзапрос – заключённый в круглые скобки оператор SELECT про-

извольной сложности. В этом случае псевдоним обязателен. Он использу-

ется как локальное имя неименованной таблицы, произведённой подзапро-

сом.

Рассмотрим здесь несколько запросов на выборку данных к нашей

«учебной» БД (см. приложение А). В примерах используются только обя-

зательные предложения оператора SELECT. Реализации источников дан-

ных приведены в приложении А.

Пример 1. Получить имена и статусы всех поставщиков.

170

SELECT S.Snam, S.St

FROM S;

Этот оператор произведёт следующую таблицу:

Snam

St

Иван

100

Николай

50

Григорий

80

Петр

20

Константин

100

 

 

Иван

100

Сергей

90

Владимир

30

 

 

Егор

100

Процедура её постороения может (концептуально!) состоять из пе-

речисленных ниже шагов.

Шаг 1. Выделить в рабочем буфере пространство для таблицы S и

форматировать его в соответствии с определением этой таблицы, храня-

щимся в системном каталоге.

Шаг 2. Скопировать в рабочий буфер базовую таблицу S. Тем самым будет создана F-таблица, эквивалентная S.

Шаг 3. Выделить в рабочем буфере пространство для выходной таб-

лицы запроса и форматировать его в соответствии с определениями столб-

цов S.Snam, S.St.

Шаг 4. Скопировать в выделенное пространство содержимое столб-

цов Snam, St временной таблицы, созданной на шаге 2.

Временная таблица, созданная на шаге 4, и есть выходная таблица запроса. Она может содержать дубликаты строк, т.е., строго говоря, не яв-

ляется реляционной проекцией таблицы S на столбцы Snam, St. В даль-

нейшем мы будем называть эту операцию SQL-проекцией. Действительно,

первая и последняя строки приведённой выше таблицы дублируют друг друга. Для того чтобы получить «чистую» проекцию, следует записать оператор так14:

14 Квалификаторы имён опущены за ненадобностью.