История развития баз данных. Основные понятия и определения. Архитектура базы данных. Физическая и логическая независимость, страница 18

Пример:

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

SELECT sname, sgrp FROM студентWHERE spdp = ANY  (SELECT pnum FROM преподавательWHERE pcaf = «K-1»);

Результат:

sname

sgrp

С-1

Г-1

С-2

Г-2

С-3

Г-2

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

Пример:

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

SELECT odate, ocen FROM оценкаWHERE osnum =  «002» AND  ocen > ANY (SELECT ocen FROM оценкаWHERE osnum = «003»);

Результат:

odate

ocen

11/01/01

4

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

Пример:

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

SELECT osnum, ocen  =  «002» AND ocen FROM оценкаWHERE opnum =  «001» AND  osnum< > ALL (SELECT snum FROM студентWHERE spdp = «001»);

Результат:

osnum

ocen

003

3

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

Пример:

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

SELECT odate, ocen FROM оценкаWHERE osnum =  «001» AND  ocen < > ALL (SELECT ocen FROM оценкаWHERE osnum = «003»);

Результат:

odate

ocen

10/01/01

5

15/01/01

5

Этот же запрос с 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.

Пример:

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

SELECT pnum, pname FROM ПреподавательWHERE pnum IN (SELECT DISTINCT spdp FROM студент)

UNION

SELECT snum, sname FROM студентWHERE spdp IS NOT NULL;

Результат:

001

П

002

П

001

С

002

С

003

С

Использование DISTINCT в данном запросе необязательно, он используется оптимизацией запроса. Только последний запрос заканчивается «;», если  «;», то SQL думает, что последует ещё один запрос и выдаст ошибку. Столбцы результата не поименованы, т.к. принадлежат разным таблицам. При необходимости, ссылки на эти столбцы могут быть выполнены по номерам столбца.

Некоторые системы, в том числе MS ACCESS, принимают в качестве имён столбцов имена первого предложения SELECT. Предложение UNION реализует операцию объединения в реляционной алгебре. Для того чтобы 2 или более запросов можно было бы объединить, их столбцы выходных данных должны быть совместимы по объединению.