Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 3000259.doc
Скачиваний:
27
Добавлен:
30.04.2022
Размер:
1.27 Mб
Скачать

3.5.6. Раздел order by и ключевое слово top

Раздел определяет порядок сортировки записей, включенных в выборку:

…ORDER BY поле1 [ASC / DESC]

[, поле2 [ASC / DESC] [,…]]

Особенности:

- раздел не является обязательным, однако он обязательно используется с предикатом TOP;

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

- порядок перечисления полей задает иерархию уровней сортировки;

- ORDER BY – последняя директива в запросе.

Примеры.

Отсортировать записи по полю ФИО в алфавитном порядке:

SELECT R1.*

FROM R1

ORDER BY ФИО;

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

SELECT R1.*

FROM R1

ORDER BY Оценка DESC;

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

Например, выбрать из таблицы Студенты (Номер_зачетки, Шифр_группы, ФИО, Год_выпуска, Средний_балл) 5 лучших студентов выпуска 2012 года:

SELECT TOP 5 ФИО, Шифр_группы

FROM Студенты

WHERE Год_выпуска = 2012

ORDER BY Средний_балл DESC;

Число, используемое в предикате TOP, должно быть целым без знака. Без директивы ORDER BY в выборку попали бы любые 5 студентов выпуска 2012 года. Предикат TOP не разделяет записи, имеющие одинаковые значения при упорядочивании. Это значит, если 5-й, 6-й, 7-й студенты имеют одинаковый средний балл, то в выборке будет не 5, а 7 записей.

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

Например, выбрать десять процентов записей выпуска 2012 года из таблицы Студенты:

SELECT TOP 10 PERCENT ФИО, Шифр_группы

FROM Студенты

WHERE Год_выпуска = 2012

ORDER BY Средний_балл DESC;

3.5.7. Вложенные запросы

С помощью SQL можно вкладывать запросы внутрь друг друга. Обычно внутренний запрос генерирует значение, которое проверяется в предикате внешнего запроса (в предложении WHERE или HAVING), определяющего, верно оно или нет. Совместно с подзапросом можно использовать предикат EXISTS, который возвращает истину, если вывод подзапроса не пуст.

В части FROM оператора SELECT допустимо применять синонимы (алиасные имена) к именам таблицы, если при формировании запроса требуется более чем один экземпляр некоторого отношения. Синонимы задаются с использованием ключевого слова AS, которое может быть вообще опущено. Поэтому часть FROM может выглядеть следующим образом:

FROM R1 AS A, R1 AS B

Или

FROM R1 A, R1 B

Оба выражения эквивалентны и рассматриваются как применения оператора SELECT к двум экземплярам таблицы R1.

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

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

- предложение Order by может быть использовано только в основном запросе;

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

Рассмотрим примеры вложенных запросов.

Пример 1. Даны две таблицы: Товары (Код товара, Наименование, Цена) и Продажи (Чек, Код товара, Дата, Продано). Из таблицы Товары требуется отобрать товары (указать поля Наименование и Цена), для которых поле Продано превышает 10.

SELECT Наименование, Цена FROM Товары

WHERE EXISTS (SELECT [Код товара] FROM Продажи

WHERE (Продано > 10) AND (Товары.[Код товара]=

Продажи.[Код товара]);

Пример 2. Выбрать из таблицы Продажи (указать поля Чек и Продано) товары с наименование «Шоколад Путешествие».

SELECT Чек, Продано FROM Продажи

WHERE [Код товара] = (SELECT [Код товара] FROM Товары WHERE Наименование = “Шоколад Путешествие”);

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