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

5.Вложенные и связанные подзапросы. Операторы any, all, come

Операторы ANY, ALL, COME используют в качестве аргументов подзапросы, но в отличие от EXIST, подзапросы используются как аргументы в операциях отношения.

Выражение имя_поля операция_отношения ANY(подзапрос), считается истинным, если оно истинно хотя бы для одного значения результат подзапроса. Если подзапрос не генерирует выходных данных, то выражение с ANY принимает значение ложь, независимо от операции отношения.

Пример: получить фамилии дипломников для преподавателей определенной кафедры.

Sname

Sgrp

С-1

Г-1

С-2

Г-2

С-3

Г-2

SELECT sname, sgrp FROM студент

WHERE spdp = ANY

(SELECT pnum FROM преподаватель

WHERE pcaf = “K-1”);

В данном примере конструкция WHERE spdp=ANY, равносильна конструкции WHERE spdp IN. Разница между ANY и IN, заключается в возможности использовать в ANY любую операцию сравнения.

Пример: Получить оценки студента с кодом 002 больше чем какая-либо оценка у студента с кодом 003.

Odate

Ocen

11/01/01

4

SELECT odate, ocen FROM оценка

WHERE osnum = “002” AND ocen> ANY

(SELECT ocen FROM оценка

WHERE osnum= “003”);

Выражение имя_поля операция_отношения ALL(подзапрос), считается истинным, если каждое значение результата подзапроса удовлетворяет условию:

<>всем; …>всех и т.д.

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

Пример: получить для преподавателя с кодом 001 все оценки студентов, которые не являются его дипломниками.

osnum

Ocen

003

3

SELECT osnum, ocen FROMоценка

WHERE opnum= ”001” AND osnum <>ALL

(SELECT snum FROM студент

WHERE spdp = “001”);

Этот подзапрос можно было бы сформулировать иначе, заменив osnum<>ALL на osnum NOT IN. Такой запрос является более эффективным, т.к. требует просмотра всего отношения.

Существуют различия в использовании ANY, ALL, EXIST при обработке NULL-значений.

Пример: получит оценки студента с кодом 001 большие, чем все оценки студента с кодом 003.

Odate

Ocen

10/01/01

5

15/01/01

5

SELECT odate, ocen FROM оценка

WHERE osnum= “001” AND ocen <>ALL

(SELECT ocen FROM оценка

WHERE osnum = “003”);

Этот же запрос с EXISTS имеет следующий вид:

SELECT odate, ocen FROM оценка01

WHERE osnum=”001” AND NOT EXISTS

(Select ocen FROM оценка02

WHERE osnum =”003” AND

02.ocen >=01.ocen);

Тема 8.

1. Форматирование выходных данных запросов.

1. Форматирование выходных данных запросов.

Результаты выполнения нескольких запросов могут быть объединены путём использования предложения UNION.

Получить общий список руководителей дипломов и дипломников.

001

П-1

002

П-2

001

С-1

002

С-2

003

С-3

SELECT pnum, pname FROMпреподаватель

WHERE pnum IN

(SELECT DISTINCT spdp FROM студент)

UNION

SELECT snum, sname FROM студент

WHERE spdp IS NOT NULL;

Использование DISTINCT не обязательно, он используется только для оптимизации запроса. Только последний запрос кончается точкой с запятой. Если она отсутствует, то SQL решит, что идет еще один запрос и выдаст ошибку.

Столбцы результата не имеют имени, т.к. принадлежат разным таблицам. При необходимости ссылки на эти столбцы могут быть выполнены по номерам столбца. Некоторые системы, в том числе Microsoft Access, принимают в качестве имен столбцов имена первого предложения SELECT.

Предложение UNION реализует операцию объединения реляционной алгебры.

Для того, чтобы 2 или более запросов можно было бы объединить, их столбцы выходных данных должны быть совместимы по объединению.

Обычно, для большинства реализаций SQL, это означает совпадение типов и длин полей объединяемых столбцов различных таблиц.

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

Можно вставлять константы и выражения в предложение SELECT, использующее UNION. Это не соответствует стандарту SQL, но часто и оправданно применяется, при этом применяемые константы и выражения должны быть совместимы по объединению.

Пример: Получить максимальные и минимальные оценки каждого студента.

001

5

MIN

002

4

MIN

003

2

MIN

001

5

MAX

002

4

MAX

003

4

MAX

SELECT osnum, MIN(ocen); MIN FROMоценка

GROUP BY osnum

UNION

SELECT osnum, MAX(ocen), “MAX” FROM оценка

GROUP BY osnum;

В приведенном примере минимальная и максимальная оценка студентов с кодом 001 и 002 – совпадают, но строки представлены дважды, т.к. различаются за счет комментариев.

В приводимых примерах данные результата приводились в порядке записи запроса. Однако, в общем случае, нельзя считать, что будет автоматически полученным такой порядок.

Выходные данные объединенного запроса могут быть отсортированы путем использования предложения ORDER BY в конце объединенного запроса (при этом использовать ORDER BY внутри объединенного запроса нельзя).

osnum

Ocen

Mm

001

5

MIN

001

5

MAX

002

4

MIN

002

4

MAX

003

2

MIN

003

4

MAX

Пример: отсортировать по кодам студентов.

SELECT osnum, MIN(ocen), “MIN” FROM оценка

GROUP BY osnum

UNION

SELECT osnum, MAX(ocen), “MAX” FROM оценка

GROUP BY osnum

ORDER BY 1,3 DESC;

Может объединяться более двух запросов. Например, обозначим результаты данного запроса как максимальная-минимальная оценка MMOЦ. И обозначим названия столбцов:

osnum

ocen

mm

Получим на основе этой таблицы таблицу кодов студентов с включением столбца признаков: 0 – отличник, 1 – 4,5; 2 – есть 3-ки; 3 – имеющие 2-ки.

SELECT osnum, 0 FROM ММОЦ

WHERE mm= ‘’MIN’’ AND ocen=5

UNION

(SELECT osnum, 1 FROM ММОЦ

001

0

002

1

003

3

WHERE mm= “MIN” AND ocen=4

UNION

(SELECT osnum, 2 FROM ММОЦ

WHERE mm= “MIN” AND ocen=3

SELECT osnum, 3 FROM ММОЦ

WHERE mm=”MIN” AND ocen<3))

OEDER BY 2;