П. Г. Демидова А. В. Зафиевский А. А. Короткин А. Н. Лататуев Базы данных Учебное пособие


Download 1.32 Mb.
Pdf ko'rish
bet41/94
Sana15.06.2023
Hajmi1.32 Mb.
#1487605
1   ...   37   38   39   40   41   42   43   44   ...   94
Bog'liq
Базы данных

3.4.10. Вложенные запросы 
Часто приходится строить запросы, для которых необходима 
информация, получаемая с помощью других запросов. 
Простейшим примером является запрос на вывод из таблицы Stud 


65 
списка студентов, получающих максимальную стипендию. 
Очевидно, что для этого необходимо выполнить сначала запрос 
SELECT MAX(stip) FROM stud 
и запомнить или записать полученное значение, а затем запрос 
SELECT grp, fam, im, ot FROM Stud 
WHERE stip = <максимальная стипендия> 
для получения требуемого списка студентов. Мы уже отмечали, 
что SQL не является языком программирования и в стандартном 
варианте в нем отсутствуют переменные для запоминания проме-
жуточных значений. Заменой этому является возможность запи-
сывать в выражениях, используемых во фразах WHERE и 
HAVING, операторы SELECT, результатом выполнения которых 
является единственное значение, точнее, таблица из одной строки 
и одного столбца. Такие операторы можно использовать везде, 
где в выражениях может быть записано имя столбца или кон-
станта. Предыдущий пример может быть записан в виде 
SELECT grp, fam, im, ot FROM Stud 
WHERE stip = (SELECT MAX(stip) FROM Stud) . 
Возможности применения вложенных запросов (подзапро-
сов) в SQL немного шире, чем использование только одиночных 
значений. Сохраняя основную идею записи подзапросов только в 
WHERE или HAVING, они допускают небольшие отступления от 
принципа «один столбец и одна строка». 
Простейшим вариантом является принадлежность значения 
выражения множеству значений результата выполнения запроса, 
например, запрос 
SELECT grp, fam, nsb, stip FROM Stud 
WHERE grp IN (SELECT grp FROM Stud GROUP BY grp 
HAVING AVG(stip) > (SELECT AVG(stip) FROM Stud) ) 
выдаст список студентов тех групп, средняя стипендия в которых 
превышает общую среднюю стипендию. 
Приведенный запрос демонстрирует также возможность 
многократного вложения запросов – в нашем случае количество 
«матрешек» равно трем. 
Тот же результат, что и в предыдущем случае, может быть 
достигнут и с помощью оператора 
SELECT grp, fam, nsb, stip FROM Stud 
WHERE grp = ANY (SELECT grp FROM Stud GROUP BY grp 
HAVING AVG(stip) > (SELECT AVG(stip) FROM Stud) ), 


66 
условие в котором означает, что значение grp должно совпадать с 
каким-нибудь из результирующих значений внутреннего запроса. 
Вместо ANY можно использовать ключевое слово SOME. 
Ключевое слово ANY чаще применяется при сравнении 
выражения и подзапроса на неравенство. Например, запрос 
SELECT grp, fam, nsb, stip FROM Stud 
WHERE stip > ANY (SELECT DISTINCT stip FROM Stud) 
выдаст список студентов, получающих стипендию больше какой-
либо из возможных (т. е. в нашем случае – больше минимальной). 
При этом предполагается, что неназначение стипендии обозна-
чается пустым значением. 
Если требуется, чтобы значение выражения было больше 
любого значения, выдаваемого подзапросом, то вместо 
ANY
следует использовать ключевое слово 
ALL
. Так, запрос 
SELECT grp, fam, nsb, stip FROM Stud 
WHERE stip > 
ALL (SELECT DISTINCT AVG(stip) FROM Stud GROUP BY grp) 
выдаст список студентов, получающих стипендию больше 
средней в любой группе. 
Еще одной возможностью, используемой в подзапросах, яв-
ляется проверка на существование или несуществование резуль-
тирующих строк подзапроса. Следующий запрос выводит список 
студентов, которые имеют хотя бы одну неудовлетворительную 
оценку: 
SELECT grp, fam, im, ot FROM Stud 
WHERE EXISTS (SELECT * FROM Sess 
WHERE (Sess.nsb=Stud.nsb) AND ball=2) . 
До сих пор мы применяли вложенные запросы во фразах 
WHERE
и 
HAVING
. Однако, как мы уже видели, выражения могут 
использоваться при создании вычисляемых столбцов, и в этом 
случае также могут использоваться вложенные запросы. Наибо-
лее типичное их применение демонстрируется запросом 
SELECT grp, fam, im, ot,
(SELECT COUNT(*) FROM Sess WHERE (Sess.nsb=Stud.nsb)) 
FROM Stud , 
который для каждого студента выводит количество сданных им 
экзаменов. 


67 

Download 1.32 Mb.

Do'stlaringiz bilan baham:
1   ...   37   38   39   40   41   42   43   44   ...   94




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling