русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Подзапросы: вкладывание блоков SELECT друг в друга


Дата добавления: 2015-07-09; просмотров: 1107; Нарушение авторских прав


Вложенный подзапрос – это запрос, результат выполнения которого предается в качестве аргумента в другой запрос. Способом вкладывания подзапроса в запрос является его использование во фразе WHERE или HAVING в правом аргументе одного из следующих предикатов: IN, EXISTS =, <>, <,| <=,| >,| >=.

Существуют простые (независимые) и коррелированные (зависимые) вложенные подзапросы.

Простой (независимый) вложенный подзапрос – это такой подзапрос, вычисление которого происходит независимо от вычисления внешнего запроса. Такие запросы обрабатываются системой "снизу вверх". Первым обрабатывается вложенный подзапрос. Множество значений, полученное в результате его выполнения, использу­ется при реализации внешнего подзапроса.

Коррелированный (зависимый, связанный) вложенный подзапрос – это такой подзапрос, вычисление которого зависит от процесса вычисления во внешнем запросе. Такие запросы обрабатываются системой в обратном поря­д­ке. Сначала выбирается текущая строка из таблицы внешнего запроса и на основании значений ее полей производится вычисление подзапроса (то есть в условии вычисления подзапроса присутствуют значения полей из внешнего запроса). Затем проверяется условие WHERE на включение текущей строки внешнего запроса в результат.

Возврат одного значения. При использовании предикатов, сравнивающих два значения ( =, ¹, <, £, >, ³), подза­прос должен возвращать одно значение. В противном случае выдается сообщение об ошибке.

1) Выдать список кафедр ВУЗа, которые располагаются в том же корпусе, что и кафедра вычислительной техники.

SELECT Name

FROM DEPARTMENT

WHERE Building = (SELECT Building

FROM DEPARTMENT

WHERE Name = 'CS')

Внутренний запрос определяет корпус кафедры 'CS'; он используется в предикате сравнения (=) внешнего запроса.



В подзапросе можно использовать агрегатную функцию, гарантирующую возвращение единственного значения.

2) Выдать факультеты, фонд которых превышает фонд всех кафедр факультета информатики.

SELECT Name

FROM FACULTY

WHERE Fund > (SELECT SUM(DEPARTMENT.Fund)

FROM FACULTY, DEPARTMENT

WHERE FACULTY.#F = DEPARTMENT.#F AND FACULTY.Name = 'IT'

Возврат многих значений. Если используется предикат, проверяющий вхождение ( IN ) или не вхождение ( NOT IN ) отдельного значения во множество (или некоторые другие, о которых пойдет речь далее), то подзапрос может возвращать множество значений.

3) Кто из преподавателей факультета информатики также работает на других факультетах.

SELECT TEACHER.Name

FROM FACULTY, DEPARTMENT, TEACHER

WHERE FACULTY.#F = DEPARTMENT.#F AND

DEPARTMENT.#D = TEACHER.#D AND

FACULTY.Name = 'IT' AND

TEACHER.Name IN

(SELECT TEACHER.Name

FROM FACULTY, DEPARTMENT, TEACHER

WHERE FACULTY.#F = DEPARTMENT.#F AND

DEPARTMENT.#D = TEACHER.#D AND

FACULTY.Name != 'IT')

Коррелирование (связывание) подзапроса с запросом. В некоторых случаях характер вычисления подзапроса зависит от значения текущей строки внешнего запроса. Это хорошо демонстрируется следующим примером. Обратите внимание, что в подзапросе во фразе FROM присутствует только отношение DEPARTMENT, однако во фразе WHERE мы ссылаемся к отношению FACULTY. Это означает, что происходит обращение к внешнему запросу. При наличии такого обращения процедура вычисления следующая: фиксируется текущая строка внешнего отношения, затем для вычисления условия фразы WHERE производится вычисление подзапроса. При этом используются значения столб­цов текущей строки внешнего запроса.

Обработка коррелированного подзапроса, следовательно, должна повторяться для каждого значения извлекаемого из внешнего подзапроса, а не выполняться раз и навсегда как в не связанном подзапросе. Рассмотрим несколько примеров такого связывания.

1) Выдать факультеты, у которых фонд финансирования меньше, чем сумма фондов финансирования всех их кафедр:

SELECT Name

FROM FACULTY

WHERE Fund < (SELECT SUM(Fund)

FROM DEPARTMENT

WHERE DEPARTMENT.#F = FACULTY.#F )

2) Выдать преподавателей, не являющиеся кураторами групп

SELECT Name

FROM TEACHER

WHERE NOT EXISTS (SELECT *

FROM GROUP

WHERE TEACHER.#T = GROUP.#Curator )

(О предикате EXISTS см. далее).

Подзапрос во фразе HAVING. Как уже отмечалось, подзапросы могут вкладываться и во фразе HAVING.

4) Выдать названия кафедр и количество студентов на них для тех кафедр, количество студентов на которых больше, чем на кафедре инженерии программного обеспечения (SE).

SELECT DEPARTMENT.Name, SUM(GROUP.Quantity)

FROM DEPARTMENT, GROUP

WHERE DEPARTMENT.#D = GROUP.#D

GROUP BY DEPARTMENT

HAVING SUM(GROUP.Quantity) > (SELECT SUM(GROUP.Quantity)

FROM DEPARTMENT, GROUP

WHERE DEPARTMENT.#D = GROUP.#D AND

DEPARTMENT.Name = 'SE')



<== предыдущая лекция | следующая лекция ==>
Фраза GROUP BY. Группирование таблицы по строкам | Использование предикатов ANY, ALL, EXISTS и IN.


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 2.832 сек.