Лекции ПрБД, 2 курс 3 семестр (для ИВТ и т.п.) / ПрБД-лк10
.pdfРаздел 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-й, 9-й, 7-й студенты имеют одинаковый средний балл, то в выборке будет не 5, а 7 записей.
Можно использовать ключевое слово PERCENT для того, чтобы включить в выборку определенный процент из верхней или нижней части диапазона, отсортированного в соответствии с директивой ORDER BY.
Выбрать 10 процентов записей выпуска 2012 года из таблицы Студенты:
SELECT TOP 10 PERCENT ФИО, ШифрГруппы
FROM Студенты
WHERE ГодВыпуска = 2012 ORDER BY СреднийБалл DESC;
Вложенные запросы
В части FROM оператора SELECT допустимо применять синонимы (алиасные имена) к именам таблицы, если при формировании запроса требуется более чем один экземпляр некоторого отношения. Синонимы задаются с использованием ключевого слова AS, которое может быть вообще пропущено. Поэтому часть FROM может выглядеть следующим образом:
FROM R1 AS A, R1 AS B
или
FROM R1 A, R1 B
Оба выражения эквивалентны и рассматриваются как применения оператора SELECT к двум экземплярам таблицы R1.
Запрос, содержащий подзапрос, называется сложным. В процессе его выполнения сначала выполняется подзапрос, а затем основной запрос. При создании сложного запроса необходимо следовать следующим правилам:
–подзапросы должны включаться в круглые скобки;
–предложение ORDER BY может быть использовано только в основном запросе;
–подзапросы, возвращающие более одной записи, могут использоваться только с многозначными операторами (например, с оператором EXISTS . EXISTS имеет значение истина, если выборка не пуста).
Даны две таблицы: Товары (КодТовара, Наименование, Цена) и Продажи (Чек, КодТовара, Продано). Из таблицы Товары требуется отобрать товары (указать поля Наименование и Цена), для которых поле Продано превышает 10:
SELECT Наименование, Цена FROM Товары
WHERE (Продано>10) AND (Товары.КодТовара = Продажи.КодТовара);
Выбрать из таблицы Продажи (указать поля Чек и Продано) товары с наименованием «Шоколад Путешествие»:
SELECT Чек, Продано FROM Продажи
WHERE КодТовара = SELECT КодТовара FROM товары
WHERE Наименование = “Шоколад Путешествие”;
Внутренние и внешние объединения
В общем случае синтаксис FROM в стандарте SQL2 выглядит следующим образом:
FROM <список исходных таблиц>| <выражение естественного объединения>| <выражение объединения>| <выражение перекрестного объединения>| <выражение запроса на объединение>
где
−<список исходных таблиц> – это <имя таблицы 1> [имя синонима таблицы 1] […] [,<имя таблицы N> [имя синонима таблицы N]];
−<выражение естественного объединения> – это <имя таблицы 1>
NATURAL {INNER | FULL [OUTER] LEFT [OUTER] |
RIGHT [OUTER]} JOIN <имя таблицы 2>;
−<выражение объединения> – <имя таблицы 1> {INNER | FULL [OUTER] LEFT [OUTER] | RIGHT [OUTER]} JOIN <ON условие | [USING (список столбцов)]}< имя таблицы 2>;
−<выражение перекрестного объединения> – <имя таблицы 1> CROSS JOIN <имя таблицы 2>;
−<выражение запроса на объединение>– <имя таблицы 1> UNION JOIN <имя таблицы 2>.
В этих определениях INNER – означает внутреннее соединение, LEFT – левое объединение, т.е. в результат входят все строки первой таблицы, а части результирующих кортежей, для которых не было соответствующих значений во второй таблице, дополняются значениями NULL (не определено). Ключевое слово RIGHT означает правое внешнее соединение, и в отличие от левого соединения в этом случае в результирующее отношение включаются все строки второй таблицы, а недостающие части из первой таблицы дополняются неопределенными значениями. Ключевое слово FULL определяет полное внешнее объединение: левое и правое. При полном внешнем объединении выполняются и правое, и левое внешние объединения и в результирующее отношение включаются все строки из первой таблицы, дополненные неопределенными значениями, и все строки из второй таблицы, также дополненные неопределенными значениями. Ключевое слово OUTER означает внешнее объединение, но если заданы ключевые слова FULL, LEFT, RIGHT, то объединение всегда считается внешним.
