Языки манипулирования данными. Карепова Е.Д. - 18 стр.

UptoLike

Составители: 

35
Подзапросы в инструкции WHERE.
Некоррелированный подзапрос
DEF. Подзапрос, значение которого не зависит от какого-либо внешне-
го запроса, называется некоррелированным.
Некоррелированные подзапросы часто реализуют соединения. Выпол-
нение таких запросов происходит изнутри наружу.
Запрос: Перечислить фамилии студентов, сдававших курс К1 в первом
семестре.
Решение:
SELECT СТУДЕНТ.ID_Stud, ФИО=СФам
FROM СТУДЕНТ, УСПЕВАЕМОСТЬ
WHERE СТУДЕНТ.ID_Stud IN
(SELECT ID_Stud FROM УСПЕВАЕМОСТЬ
WHERE ID_Subj=’K1’ AND Семестр=1)
В этом случае выполнение внутреннего запроса никак не зависит от
внешнего.
Следующий пример демонстрирует использование групповых опера-
ций в подзапросе.
Запрос: Вывести список студентов, у которых хотя бы по одному
предмету оценка выше средней оценки по всему списку.
Решение:
SELECT СТУДЕНТ.ID_Stud, ФИО=СФам
FROM СТУДЕНТ, УСПЕВАЕМОСТЬ
WHERE СТУДЕНТ.ID_Stud=УСПЕВАЕМОСТЬ.ID_Stud AND
Оценка > (SELECT AVG(Оценка) FROM УСПЕВАЕМОСТЬ)
Интересно, что и тета-соединения можно реализовать как некоррели-
рованные запросы.
Запрос: Перечислить номера студентов, которые сдали хотя бы один
курс, который сдал студент с номером 004.
Решение:
SELECT ID_Stud FROM УСПЕВАЕМОСТЬ
WHERE ID_Subj IN
(SELECT ID_Subj FROM УСПЕВАЕМОСТЬ WHERE ID_Stud=’004’)
Запрос: Вывести номера курсов, по которым сдавал экзамен более чем
один студент.
Решение:
SELECT DISTINCT У1.ID_Subj FROM УСПЕВАЕМОСТЬ AS У1
WHERE ID_Subj IN
(SELECT У2.ID_Subj FROM УСПЕВАЕМОСТЬ AS У2
WHERE У1.ID_Stud <> У2.ID_Stud)
Практически все некоррелированные запросы могут быть сформулиро-
ваны без использования подзапроса. Например, последний запрос может
быть записан следующим образом.
36
Решение(2):
SELECT DISTINCT ID_Subj FROM УСПЕВАЕМОСТЬ
GROUP BY ID_Subj
HAVING COUNT(DISTINCT УСПЕВАЕМОСТЬ.ID_Stud) > 1
Коррелированные подзапросы
В предложениях FROM или WHERE внешнего запроса возможно об-
ращение к внутреннему подзапросу. Такие запросы принято называть корре-
лированными.
В коррелированном запросе подзапрос выполняется неоднократно, по
одному разу для каждой строки таблицы основного запроса.
Пример использования оператора сравнения совместно с коррелиро-
ванным подзапросом.
Запрос 2: Определить Ф.И.О. студентов, которые сдали экзамены не
хуже своих консультантов.
Решение (3):
SELECT DISTINCT №Студента=СТУДЕНТ.ID_Stud, ФИО=СФам,
FROM СТУДЕНТ, УСПЕВАЕМОСТЬ AS У1
WHERE №Студента=У1.ID_Stud AND У1.Оценка >=
(SELECT У2.Оценка FROM УСПЕВАЕМОСТЬ AS У2
WHERE У2.ID_Stud=Консультант AND
У1.Семестр=У2.Семестр)
Решение (4):
SELECT DISTINCT №Студента=СТУДЕНТ.ID_Stud, ФИО=СФам,
FROM СТУДЕНТ
WHERE №Студента IN
(SELECT У1.ID_Stud FROM УСПЕВАЕМОСТЬ AS У1
WHERE У1.Оценка >=
(SELECT У2.Оценка
FROM УСПЕВАЕМОСТЬ AS У2
WHERE У2.ID_Stud=Консультант AND
У1.Семестр=У2.Семестр))
Обратите внимание, что в последнем запросе самый вложенный подза-
прос использует ссылку на поле самого внешнего подзапроса.
Следующий пример демонстрирует использование групповых опера-
ций в коррелированных ПЗ.
Запрос: У кого из студентов оценка хотя бы по одному предмету выше
средней оценки по этому предмету.
Решение:
SELECT У1.ID_Stud FROM УСПЕВАЕМОСТЬ AS У1
WHERE У1.Оценка > (SELECT AVG(У2.Оценка)
FROM УСПЕВАЕМОСТЬ AS У2
WHERE У1.ID_Subj= У2.ID_Subj)