Пример:
Получить фамилии дипломников для преподавателей определённой кафедры.
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);
Вопросы темы:
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 или более запросов можно было бы объединить, их столбцы выходных данных должны быть совместимы по объединению.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.