Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
dbbook(2010.04.15).pdf
Скачиваний:
51
Добавлен:
09.06.2015
Размер:
2.14 Mб
Скачать

Таким образом, полнота реляционной алгебры понимается в том смысле, что система запросов, построенная на основе реляционной алгебры (запрос – это выражение реляционной алгебры над множеством отношений базы данных D), приводит к тому же множеству допустимых запросов D+, что и система запросов, построенная на основе исчисления кортежей (запрос – это выражение исчисления кортежей над D).

2.9. Формирование запросов на языке SQL

Оператор select – один из наиболее важных и самых распространенных операторов SQL. Он позволяет производить выборки данных из таблиц и преобразовывать к нужному виду полученные результаты. Будучи очень мощным, он способен выполнять действия, эквивалентные выражениям реляционной алгебры, причем в пределах единственного выполняемого оператора. При его помощи можно реализовать сложные и громоздкие условия отбора данных из различных отношений.

Оператор select – средство, которое полностью абстрагировано от вопросов представления данных, что помогает сконцентрировать внимание на проблемах доступа к данным. Примеры его использования наглядно демонстрируют один из основополагающих принципов промышленных СУБД: средства хранения данных и доступа к ним отделены от средств представления данных. Операции над данными производятся в масштабе наборов данных, а не отдельных записей.

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

Базовая структура оператора select включает следующие фразы и достаточно проста:

select выбрать такие-то атрибуты from из таких-то отношений

where с таким-то условием выборки кортежей

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

2.9.1. Металингвистические символы

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

1){ } – синтаксические конструкции в фигурных скобках представляют обязательные синтаксические единицы;

2)[ ] – синтаксические конструкции в квадратных скобках представляют необязательные синтаксические единицы;

3)| – вертикальная черта читается как «либо»;

4)... – многоточие означает возможность повторения предшествующей синтаксической единицы;

5),.. – запятая и две точки означают возможность повторения предшествующей синтаксической единицы через запятую. Так, например, следующие синтаксические конструкции будут

эквивалентными:

{буква | цифра}[,{буква | цифра}]...

{буква | цифра},..

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

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

2.9.2. Реализация операций реляционной алгебры

Операция выборки

Операция выборки реализуется оператором

select *

from имя_отношения where условие_выборки

Здесь звездочка означает выбор всех атрибутов из схемы отношения. Условие выборки записывается в виде логического выражения со связками not, and, or. Ссылки на атрибуты производятся по их именам. Например, в следующем запросе из отношения Успеваемость выбираются те кортежи,

которые относятся к номеру зачетной книжки 100 и семестру 6 (МнемоП – мнемоническое наименование предмета):

Успеваемость(NЗК, Семестр, МнемоП, Оценка, Дата)

select *

from Успеваемость

where NЗК = 100 and Семестр = 6

Условие выборки может содержать предикаты в следующих формах:

1)выражение {< | <= | = | < > | >= | >} выражение

2)выражение [not] between выражение1 and выражение2

3)выражение is [not] null

4)строковое_выражение [not] like шаблон

[escape 0escape_символ0]

5)выражение [not] in (выражение,..)

6)выражение [not] in (подзапрос)

7)выражение {< | <= | = | < > | >= | >} {all | any} (подзапрос)

8)exists (подзапрос)

Форма 1 предиката применяется для выражений любого типа, за исключением BLOB – крупных двоичных объектов.

Форма 2 предиката с оператором [not] between (между) является сокращением следующего условия:

[not] (выражение1 <= выражение and выражение <= выражение2)

Форма 3 предиката предназначена для тестирования null-значений.

Форма 4 предиката с оператором like (похожий) позволяет отбирать строки по шаблону с использованием следующих символов замещения.

1.% – любая строка из нуля или более символов. Например, конструкция like 0%t%0 соответствует любым строкам, содержащим хотя бы один символ 0t0.

2._ – любой одиночный символ. Например, конструкция like 0a_0 соответствует двухсимвольным строкам, начинающимся с символа 0a0.

3.{[символ-символ] | [символ. . . ]} – любой одиночный символ, содержащийся в указанном диапазоне или последовательности символов. Например, конструкция like 0[b-d]at0, как и like

0[bcd]at0, соответствует строкам 0bat0, 0cat0, 0dat0. Конструкция like 0[ [ ]0 соответствует символу 0[0.

4. {[bсимвол-символ] | [bсимвол. . . ]} – любой одиночный символ, не содержащийся в указанном

диапазоне или последовательности символов. Например, конструкция like 0[ b0-9]%0 соответствует любым строкам, первый символ которых не является цифрой.

Если символ замещения 0%0 или 0_0 необходимо сам по себе включить в шаблон, то следует или заключить его в квадратные скобки, или определить escape-символ (то есть символ перехода) и использовать его перед символом замещения. Например, следующие конструкции соответствуют

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

like 0

[_]_0

 

 

like

0

/_ _0

escape

0/0

like

0

!_ _0

escape

0!0

Форма 5 предиката соответствует предикату принадлежности элемента списку.

Форма 6 предиката отличается от формы 5 тем, что вместо списка задается подзапрос, возвращающий один столбец (но не одну строку, так как требуется однотипность данных). Например, следующий запрос выводит список студентов, получивших к моменту запроса хотя бы одну оценку отлично:

Студенты(NЗК, Ф, И, О) Сессия(NЗК, МнемоП, Оценка)

select * from Студенты

where NЗК in (select NЗК from Сессия where Оценка = 5)

Здесь в результирующем запросе поля из таблицы Сессия не используются и поэтому можно использовать подзапрос, а не соединение.

Форма 7 предиката позволяет сравнивать выражения со всеми (all) или некоторыми (any) значениями, возвращаемыми в подзапросе. В частности, следующие предикаты эквивалентны:

выражение in (подзапрос)

выражение = any (подзапрос)

Форма 8 предиката проверяет подзапрос на пустоту. С помощью этого предиката последний пример может быть записан в виде

Студенты(NЗК, Ф, И, О) Сессия(NЗК, МнемоП, Оценка)

select * from Студенты

where exists(select * from Сессия

where NЗК = Студенты.NЗК and Оценка = 5)

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

Указывать конкретные столбцы в подзапросе предиката exists смысла не имеет.

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

Операция проекции реализуется оператором

select [distinct] список_имен_атрибутов from имя_отношения

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

из соображений производительности опцию distinct лучше не указывать, например:

Успеваемость(NЗК, Семестр, МнемоП, Оценка, Дата)

select NЗК, Семестр, МнемоП, Оценка from Успеваемость

Здесь первые три возвращаемые атрибута образуют ключ отношения. Поэтому опция distinct становится излишней. Запрос возвращает исходное отношение Успеваемость, в котором опущен атрибут Дата.

Операция переименования атрибутов

Операция переименования атрибутов заключается в добавлении ключевого слова as и нового имени атрибута после исходного имени атрибута в списке имен атрибутов фразы select, например

Успеваемость(NЗК, Семестр, МнемоП, Оценка, Дата)

select NЗК as [№ зачетки], Семестр, МнемоП as МнемоПредмета, Оценка, Дата

from Успеваемость

Имена атрибутов, содержащие не буквенно-цифровые символы, в частности пробелы, заключаются в квадратные скобки (в некоторых СУБД).

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

Операция объединения реализуется с помощью операции union, применяемой к базовым операторам select:

select список_имен_атрибутов_отношения_1 from имя_отношения_1

union [all]

select список_имен_атрибутов_отношения_2 from имя_отношения_2

Списки имен атрибутов объединяемых отношений должны ссылаться на атрибуты совместимых типов и быть перечислены в согласованном порядке. Имена атрибутов в отношениях могут быть различными. Результирующему отношению приписываются имена атрибутов, указанные в первом операторе select. Операция объединения может иметь форму union all с опцией all (все). В этом случае из результирующего отношения дубликаты кортежей не удаляются (что является более предпочтительным с точки зрения производительности).

Операция пересечения

Операция пересечения проще всего реализуется с использованием ключей отношений:

R1(Ключ, A, B, C), R2(Ключ, A, B, C)

select * from R1

where Ключ in (select Ключ from R2)

Здесь R1 и R2 – имена отношений. Оператор select в скобках является так называемым подзапросом. Он возвращает список значений ключа отношения R2. Согласно условию выборки в результирующее отношение выбираются те кортежи отношения R1, ключ которых содержится в списке ключей отношения R2. Имена ключей отношений могли бы быть и различными. Сами отношения могли бы иметь различные наборы дополнительных атрибутов.

Операция разности

Операция разности реализуется аналогично операции пересечения с заменой ключевого слова in на not in:

R1(Ключ, A, B, C), R2(Ключ, A, B, C)

select * from R1

where Ключ not in (select Ключ from R2)

В результирующее отношение выбираются те кортежи отношения R1, ключ которых не содержится в списке ключей отношения R2.

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

Операция декартова произведения реализуется с помощью операции перекрестного соединения cross join:

select *

from R1 cross join R2

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

R1(A, B), R2(B, C)

select A, R1.B as B1, R2.B as B2, C from R1 cross join R2

Здесь ссылки на атрибуты B отношений R1 и R2 производятся по их уточненным именам R1.B и R2.B соответственно.

Операция естественного соединения

Операция естественного соединения является частным случаем операции внутреннего соединения inner join по условию равенства кортежей на пересечении схем отношений, например:

R1(A, B, C), R2(B, C, D)

select A, R1.B, R1.C, D

from R1 inner join R2 on R1.B = R2.B and R1.C = R2.C

Здесь ссылаться на общие атрибуты B и C просто по именам нельзя, так как будет неясно, к какому отношению они относятся. Использованная формулировка условия соединения (после ключевого слова on) предполагает, что общие атрибуты соединяемых отношений null-значений не допускают.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]