русс | укр

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

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

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

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


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

Вложенные запросы как альтернатива соединению таблиц в запросах


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


Этот вариант использования вложенного запроса во многих (но не во всех!) случаях позволяет избежать операции соединения таблиц. Текст такого запроса выглядит понятно и логично, эффективность для многих СУБД сравнима с использованием операции соединения, но существенного ускорения запроса таким способом не добиться. Тем не менее, как альтернативный вариант соединению, он заслуживаеи внимания.

Например, пусть требуется выяснить оценку студента Иванова по математике (если таких студентов несколько – все оценки). Можно легко решить эту задачу, соединив таблицы students, subjects и marks и выполнив выборку из полученной в результате соединения таблицы. Однако, логичным представляется и такой вариант: найти коды всех Ивановых из таблицы students, найти код математики из таблицы subjects, на последнем этапе найти оценку (или несколько оценок) в таблице marks. Получаем такой текст запроса с двумя вложенными запросами:

Select mark from marks

where cod_st in

(select cod_st from students Where name_st=’Иванов’)

and cod_sub IN

(select cod_sub from subjects Where name_sub=’Математика’)

Обратим внимание на использование операции IN (принадлежность значения множеству). Вложенные запросы, которые используются для извлечения кода студента и кода предмета, в общем случае, возвращают множество значений. Хотя в таблице предметов название предмета является уникальным столбцом, второй вложенный запрос может возвратить пустое множество при отсутствии предмета с названием ’Математика’. Поэтому применение операции IN в данной ситуации является правильным.

Еще один пример. Пусть требуется выяснить средний балл всех студентов по фамилии Иванов. Логика рассуждений та же, что и в предыдущем случае – сначала найти коды Ивановых, а затем выполнить всю оставшуюся работу, используя только таблицу оценок:

Select cod_st, avg (mark) avg_mark from marks

where cod_st in

(select cod_st from students where name_st=’Иванов’)

group by cod_st



<== предыдущая лекция | следующая лекция ==>
Использование псевдонимов таблиц в запросах с соединением | Вложенные запросы в условиях отбора (WHERE и HAVING)


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


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

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

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


 


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

 
 

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

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