|
Программирование >> Формирование связанных подзапросов
у которых стипендия совпадает с максимальным значением стипендии для города, в котором живет студент. 6. Напишите запрос, который позволяет вывести имена и идентификаторы всех студентов, для которых точно известно, что они про живают в городе, где нет ни одного университета. 7. Напишите два запроса, которые позволяют вывести имена и идеи тификаторы всех студентов, для которых точно известно, что он проживают не в том городе, где расположен их университет. Оди запрос с использованием соединения, а другой - с использовани ем связанного подзапроса. 2.11. Использование оператора EXISTS Используемый в SQL оператор EXISTS (существует) гене рирует значение истина или ложь, подобно булеву выражению Используя подзапросы в качестве аргумента, этот операто оценивает результат выполнения подзапроса как истинный если этот подзапрос генерирует вхходные данные, то ест в случае существования (возврата) хотя бы одного найденного значения. В противном случае результат подзапроса ложный Оператор EXISTS не может принимать значение UNKNOWN (не известно). Пусть, например, нужно извлечь из таблице! EXAM MARK данные о студентах, получивших хотя бы одну неудовлетвори тельную оценку. SELECT DISTINCT STUDENT ID FROM EXAM MARKS A where EXISTS (SE * FROM EXAM MARKS В where MARK < 3 AND B.STUDENT ID = A.STUDENT ID); При использовании связанных подзапросов предложение EXISTS анализирует каждую строку таблицы, на которую имеется ссылка во внешнем запросе. Главный запрос получает строки-кандидаты на проверку условия. Для каждой строки-кандидата выполняется подзапрос. Как только подзапрос находит 2.11. Использование оператора EXISTS 57 строку, где в столбце MARK значение удовлетворяет условию, он прекращает втполнение и возвращает значение истина внешнему запросу, который затем анализирует свою строку-кандидата. Например, требуется получить идентификаторы предметов обучения, экзамены по которым сдавались не одним, а несколькими студентами: SELECT DISTINCT SUBJ ID FROM EXAM MARKS A WHERE EXISTS (SELECT * FROM EXAM MARKS В WHERE A.SUBJ ID = B.SUBJ ID AND A.STUDENT ID < > В.STUDENT ID); Часто EXISTS применяется с оператором NOT (по-русски NOT EXISTS интерпретируется, как не существует ). Если предыхдущий запрос сформулировать следующим образом - найти идентификаторы предметов обучения, которые сдавались одним, и только одним студентом (другими словами, для которых не существует другого сдававшего студента), то достаточно просто поставить NOT перед EXISTS. Следует иметь в виду, что в подзапросе, указтваемом в операторе EXISTS, нельзя использовать агрегирующие функции. Возможности применения вложенных запросов весьма разнообразна:. Например, пусть из таблица: STUDENT требуется извлечь строки для каждого студента, сдавшего более одного I предмета. SELECT * FROM STUDENT FIRST WHERE EXISTS (SELECT SUBJ ID FROM EXAM MARKS SECOND GROUP by SUBJ ID HAVING COUNT (SUBJ IDj > 1 WHERE FIRST.STUDENT ID = SECOND.STUDENT H); Упражнения 1. Напишите запрос с EXISTS, позволяющий вывести данные обо всех студентах, обучающихся в вузах, которые имеют рейтинг выше 300 2. Напишите предхдущий запрос, используя соединения. 3. Напишите запрос с EXISTS, выбирающий сведения обо всех студентах, для котор1х в том же городе, где живет студент, существуют университеты, в которых он не учится. 4. Напишите запрос, выбирающий из таблицы SUBJECT данные о названиях предметов обучения, экзамены по которым сданы более чем одним студентом. 2.12. Операторы сравнения значений IN, ANY, All с множеством Операторы сравнения с множеством значений имеют следующий смтсл.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |