Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СУБД.doc
Скачиваний:
1
Добавлен:
25.11.2018
Размер:
183.81 Кб
Скачать

Опции order by и union

Order by (список полей) [Asc, Desc]

Поля могут задаваться либо именем, либо порядковым номером в списке выборки. Сортирует результат выборки по значению указанного поля (лексикографически, если их несколько).

Asc ending – по возрастанию (по умолчанию).

Desc ending – по убыванию.

Опция All/Distinct: выбор distinct удаляет из результата выборки полностью совпадающие записи. По умолчанию действует опция all, то есть такое удаление не производится.

Опция Union – объединение выборок.

(команда select) union [all] (команда select)

Обычно интерпретируется как подопция команды select. Легче интерпретировать как операцию над двумя выборками, а именно – объединения двух таблиц, то есть именованных отношений.

Для того, чтобы гарантировать, что результат объединения снова будет таблицей, типы таблиц должны быть согласованы по числу и типу полей (не по именам). Число и типы полей должны совпадать. Размерность – снова тёмное место языка.

Довольно неожиданно применение union убирает по умолчанию все записи-дубликаты из результата. Чтобы избежать этого, используется опция [all]. В отличие от этого, в варианте select all/distinct, оставляющем в единичной выборке либо все записи, включая дубликаты (опция [all]), либо только различные (опция [distinct]). По умолчанию действует опция [all].

Замечание. Union запрещается использовать в подзапросах. При использовании опции union, опция order by может использоваться лишь однократно после последней выборки. В этом случае упорядочивается не последняя выборка, а всё объединение.

Пример. Вывести фамилии покупателей и продавцов в лексикографическом порядке.

select name from Customer

union

select name from Employee

order by 1;

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

Многие версии языка включают опцию [into] (преемник выборки), позволяющую сохранять результат либо в реальной таблице (в файле), либо в курсоре (CurSOR).

CurSOR – Current Set Of Record – текущее множество записей во временном файле, доступном в текущем сеансе работы, но исчезающим по завершении работы.

Представления дают удобный способ сослаться на результаты выборки, не прибегая к их сохранению.

Предикаты, использующие выборку Вложенные подзапросы

Предикаты – условия на запись, - используемые в опции where (как в командах модификации, так и в самой команде select), в свою очередь могут содержать ссылку на выборку. К таким предикатам относятся:

1) r c all (команда select), где r – выражение над записью, c – знак сравнения.

Предикат истинен, если сравнение выполняется для значения выражения r и всех значений, выбранных командой select. При этом предполагается, что select выдаёт некий список значений list, то есть, формально, таблицу с единственным полем, совместимым по типу с типом выражения r.

  llist (r c l)

Если выборка пуста, значение предиката true.

2) r c [anysome] (команда select)

При тех же условиях на select эквивалентно предикату:

 llist (r c l)

3) r [not] in (команда select)

При тех же условиях на select: rlist.

4) [not] exists (команда select)

В данном случае на select не накладывается никаких ограничений. Предикат истинен, если выборка не пуста:  r: rselect

Пример. Молодые покупатели_1.

select name, Id

from Customer

where birthday>(select avg(birthday) from Employee);

Молодые покупатели_2.

select name, Id

from Customer

where birthday>(select avg(birthday) from Customer);

Коллизии имён нет, по умолчанию каждое имя поля ссылается на таблицы из ближайшего from. Синтаксис SQL не запрещает именам полей внутренней выборки ссылаться на таблицы внешней выборки. Такие подзапросы называются соотнесёнными.

Молодые покупатели_3.

select name, Id

from Customer, Cust1

where birthday>(select avg( birthday) from Customer, Cust2

where Cust1.city=Cust2.city);

Синтаксически соотнесённые и не соотнесенные запросы выглядят схоже. Реализация кардинально различна. В случае не соотнесённого запроса выборка осуществляется последовательно: сначала вложенный запрос, затем внешний. В случае соотнесённого запроса внутренний select выполняется для каждой записи внешнего. Это вложенный цикл – с точки зрения реализации, а с точки зрения логики – декартово произведение.