Лекция 15. Язык SQL. Средства манипулирования данными
Для того, чтобы можно было более
или менее точно рассказать про
структуру запросов в стандарте SQL/89,
необходимо начать со сводки
синтаксических правил:
<cursor specification> ::=
<query expression> [<order by clause>]
<query expression> ::=
<query term>
| <query expression> UNION [ALL] <query term>
<query term> ::=
<query specification>
| (<query expression>)
<query specification> ::=
(SELECT [ALL | DISTINCT] <select list> <table expression>)
<select statement> ::=
SELECT [ALL | DISTINCT] <select list>
INTO <select target list> <table expression>
<subquery> ::=
(SELECT [ALL | DISTINCT] <result specification>
<table expression>
<table expression> ::=
<from clause>
[<where clause>]
[<group by clause>]
[<having clause>]
Язык допускает три типа
синтаксических конструкций,
начинающихся с ключевого слова SELECT:
спецификация курсора (cursor specification),
оператор выборки (select statement) и
подзапрос (subquery). Основой всех них
является синтаксическая
конструкция "табличное
выражение (table expression)". Семантика
табличного выражения состоит в том,
что на основе последовательного
применения разделов from, where, group by и
having из заданных в разделе from таблиц
строится некоторая новая
результирующая таблица, порядок
следования строк которой не
определен и среди строк которой
могут находиться дубликаты (т.е. в
общем случае таблица-результат
табличного выражения является
мультимножеством строк). На самом
деле именно структура табличного
выражения наибольшим образом
характеризует структуру запросов
языка SQL/89. Мы рассмотрим ниже
структуру и смысл разделов
табличного выражения ниже, но до
этого немного подробнее обсудим
три упомянутые конструкции,
включающие табличные выражения.
Наиболее общей является
конструкция "спецификация
курсора". Курсор - это понятие
языка SQL, позволяющее с помощью
набора специальных операторов
получить построчный доступ к
результату запроса к БД. К
табличным выражениям, участвующим
в спецификации курсора, не
предъявляются какие-либо
ограничения. Как видно из сводки
синтаксических правил, при
определении спецификации курсора
используются три дополнительных
конструкции: спецификация запроса,
выражение запросов и раздел ORDER BY.
Спецификация запроса
В спецификации запроса задается
список выборки (список
арифметических выражений над
значениями столбцов результата
табличного выражения и констант). В
результате применения списка
выборки к результату табличного
выражения производится построение
новой таблицы, содержащей то же
число строк, но вообще говоря
другое число столбцов, содержащих
результаты вычисления
соответствующих арифметических
выражений из списка выборки. Кроме
того, в спецификации запроса могут
содержаться ключевые слова ALL или
DISTINCT. При наличии ключевого слова
DISTINCT из таблицы, полученной
применением списка выборки к
результату табличного выражения,
удаляются строки-дубликаты; при
указании ALL (или просто при
отсутствии DISTINCT) удаление
строк-дубликатов не производится.
Выражение запросов
Выражение запросов - это
выражение, строящееся по указанным
синтаксическим правилам на основе
спецификаций запросов.
Единственной операцией, которую
разрешается использовать в
выражениях запросов, является
операция UNION (объединение таблиц) с
возможной разновидностью UNION ALL. К
таблицам-операндам выражения
запросов предъявляется то
требование, что все они должны
содержать одно и то же число
столбцов, и соответствующие
столбцы всех операндов должны быть
одного и того же типа. Выражение
запросов вычисляется слева направо
с учетом скобок. При выполнении
операции UNION производится обычное
теоретико-множественное
объединение операндов, т.е. из
результирующей таблицы удаляются
дубликаты. При выполнении операции
UNION ALL образуется результирующая
таблица, в которой могут
содержаться строки-дубликаты.
Раздел ORDER BY
Наконец, раздел ORDER BY позволяет
установить желаемый порядок
просмотра результата выражения
запросов. Синтаксис ORDER BY следующий:
<order by clause> ::=
ORDER BY <sort specification>
[{,<sort specification>}...]
<sort specification> ::=
{<unsigned integer> | <column specification>}
[ASC | DESC]
Как видно из этих синтаксических
правил, фактически задается список
столбцов результата выражения
запросов, и для каждого столбца
указывается порядок просмотра
строк результата в зависимости от
значений этого столбца (ASC - по
возрастанию (умолчание), DESC - по
убыванию). Столбцы можно задавать
их именами в том и только в том
случае, когда (1) выражение запросов
не содержит операций UNION или UNION ALL и
(2) в списке выборки спецификации
запроса этому столбцу
соответствует арифметическое
выражение, состоящее только из
имени столбца. Во всех остальных
случаях в разделе ORDER BY должен
указываться порядковый номер
столбца в таблице-результате
выражения запросов.
Оператор выборки - это отдельный
оператор языка SQL/89, позволяющий
получить результат запроса в
прикладной программе без
привлечения курсора. Поэтому
оператор выборки имеет синтаксис,
отличающийся от синтаксиса
спецификации курсора, и при его
выполнении возникают ограничения
на результат табличного выражения.
Фактически, и то, и другое диктуется
спецификой оператора выборки как
одиночного оператора SQL: при его
выполнении результат должен быть
помещен в переменные прикладной
программы. Поэтому в операторе
появляется раздел INTO, содержащий
список переменных прикладной
программы, и возникает то
ограничение, что результирующая
таблица должна содержать не более
одной строки. Соответственно,
результат базового табличного
выражения должен содержать не
более одной строки, если оператор
выборки не содержит спецификации
DISTINCT, и таблица, полученная
применением списка выборки к
результату табличного выражения,
не должна содержать более одной
несовпадающих строк, если
спецификация DISTINCT задана.
Замечание: В диалекте SQL СУБД Oracle
поддерживается расширенный
вариант оператора выборки,
результатом которого не
обязательно является таблица из
одной строки. Такое расширение не
поддерживается ни в SQL/89, ни в SQL/92.
Наконец, последняя конструкция
SQL/89, которая может содержать
табличные выражения, - это
подзапрос, т.е. запрос, который
может входить в предикат условия
выборки оператора SQL. В SQL/89 к
подзапросам применяется то
ограничение, что результирующая
таблица должна содержать в
точности один столбец. Поэтому в
синтаксических правилах,
определяющих подзапрос, вместо
списка выборки указано
"выражение, вычисляющее
значение", т.е. арифметическое
выражение. Заметим еще, что
поскольку подзапрос всегда вложен
в некоторый другой оператор SQL, то в
качестве констант в арифметическом
выражении выборки и логических
выражениях разделов WHERE и HAVING можно
использовать значения столбцов
текущих строк таблиц, участвующих в
(под)запросах более внешнего
уровня. Более подробно об этом см.
ниже, при описании семантики
табличных выражений.
Предыдущая
глава || Оглавление
|| Следующая глава
|