Лабораторная работа №6 «Использование подзапросов»
Цель: «Сформировать навыки и умения реализации вложенных подзапросов»
Ход Работы
1. Построение подзапросов.
Часто невозможно решить поставленную задачу путем использования одного запроса. Это особенно актуально в тех случаях, когда при использовании условия поиска в предложении
WHERE <сравниваемое значение> <оператор> <значение, с которым сравнивать>
значение, с которым надо сравнивать, заранее не определено и должно быть вычислено в момент выполнения оператора SELECT.
Другой причиной, которая должна побудить к использованию вложенных подзапросов, является то, что во многих случаях значение, с которым надо сравнивать, должно представлять собой не одно, а несколько значений.
Внутренний подзапрос представляет собой также оператор SELECT и кодирование его предложений подчиняется тем же правилам, что и для основного оператора SELECT.
В общем случае оператор SELECT с подзапросом имеет вид
SELECT... FROM...
WHERE <сравниваемое значение> <оператор> SELECT... FROM... WHERE...
|
|
Задание 1. Вывести номера студентов, обучающихся в группе с количеством человек >32
Рис 9 схема данных запроса
use uch_proc
select fio
from student
where ng in (select ng
from gruppa
where kol > 32)
В начале выполняется подзапрос, в котором выбираются все группы с количеством человек более 32. Внешний запрос выбирает запись из таблицы ‘студент’ и определяет входит ли номер группы в список номеров групп, выбранных подзапросом.
Задание 2. С помощью подзапроса вывести ФИО преподавателей, которые ведут предметы, с количеством часов chas > 150
Рис 10 схема данных запроса
use uch_proc
select fio
from prepodavatel
where tabn in (select tabn
from isuchenie
where kp in (select kp
from predmet
where chas > 150 and ng ='102'))
В начале выполняется подзапрос, в котором выбираются коды предметов с количеством часов более 150 и для группы ‘101’. Второй подзапрос выбирает табельные номера преподавателей, которые ведут предметы, указанные в 1-м подзапросе. Внешний запрос выбирает запись из таблицы ‘преподаватель’ и определяет входит ли его табельный номер в список значений второго подзапроса.
Задание 3.
С помощью подзапроса вывести табельный номер преподавателей, которые ведут предмет ‘история’ в группе ‘101’.
Рис 11 схема данных запроса
use uch_proc
select tabn
from isuchenie
where ng = '101' and kp in (select kp
from predmet
where np ='история'
)
Подзапрос выбирает код предмета с названием 'история'. Внешний запрос выводит табельные номера преподавателей, которые ведут предмет с таким номером в группе ‘101’
2. Использование оператора EXISTS
Бывают случаи, когда в условии поиска нужно указать, что из таблицы требуется отобрать только те записи, для которых подзапрос возвращает один или более значений. В этом случае в условии поиска указывается предложение EXISTS (<подзапрос>)
|
|
Это предложение содержит истину, если запрос возвращает хотя бы одну запись.
Задание 4.
Вывести ФИО студентов, которые хотя бы раз получали ‘4’.
Рис 12 схема данных запроса
use uch_proc
select fio
from student
where ns in (select ns
from uspevaemost
where ozenka = 4 and uspevaemost.ns= student.ns and uspevaemost.ng= student.ng)
Если студент хотя бы раз получал 4, то его номер будет выбран в подзапросе.
Контрольные задания.- С помощью подзапроса вывести фамилии преподавателей с кафедры ‘иностранный язык’.
- С помощью подзапроса вывести фамилии преподавателей, которые ведут предметы с vidz=’пр’.
- С помощью подзапроса вывести наименование предметов, у которых в таблице ‘изучение’ количество часов более 70.
- С помощью подзапроса вывести номер группы и количество человек в ней, если в этой группе ведет преподаватель с табельным номером ‘103’
- Вывести ФИО преподавателей, которые ведут хотя бы один предмет.
- Вывести ФИО студентов, которые хотя бы раз получали ‘2’. или ‘3’.
- Определите с помощью подзапроса номера студентов, группу и их оценки, кто изучает предмет с кодом ‘02’ и видом занятия ‘пр’.
Сформулируйте и создайте несколько подзапросов в индивидуальной базе данных