
- •Введение
- •Общая схема банка данных в системе
- •Основные понятия
- •Базы данных
- •Банк данных как система управления основные понятия
- •Банк данных как автоматизированная система
- •Субд с включающим языком
- •Информационные системы
- •Документальные аис основные понятия дескриптор
- •Фактографические аис
- •Основные понятия
- •Основные данные
- •Уровни моделей
- •Классификация моделей
- •Роль подсхемы
- •Этапы проектирования базы данных
- •Архитектура банка данных
- •Последовательность действий при чтении записи
- •Инфологическое проектирование базы данных
- •Модели данных и подъязыки данных
- •Иерархическая модель данных
- •Сетевая модель данных
- •Реляционная модель данных
- •Реляционные базы данных
- •Алгебра отношений
- •Преимущества реляционных бд
- •Отношения
- •Нормализация отношений
- •Функциональная зависимость
- •Полная функциональная зависимость.
- •Проектирование баз данных.
- •Специальные операции над отношениями
- •Операции над отношениями.
- •Централизация и децентрализация процессов обработки данных.
- •Традиционный набор операций
- •Нормализация отношений
- •Исчисление отношений
- •Вторая и третья нормальные формы.
- •26. Язык запросов sql
- •1 Основы sql
- •Многотабличные запросы на чтение (объединения)
- •Сортировка результатов запроса (предложение order by)
- •Объединение результатов нескольких запросов (union)*
- •Запрос на объединение и сортировка *
- •Многотабличные запросы на чтение (объединения)
- •Простое объединение таблиц (объединение по равенству)
- •Запросы с использованием отношения предок/потомок
- •Объединения с условием для отбора строк
- •Несколько связанных столбцов
- •Запросы на чтение к трем и более таблицам
- •Чтение всех столбцов
- •Самообъединения
- •Псевдонимы таблиц
- •Правила выполнения многотабличных запросов
- •Внешнее объединение таблиц *
- •Итоговые запросы на чтение
- •Агрегатные функции
- •Агрегатные функции в списке возвращаемых столбцов
- •Запросы с группировкой (предложение group by)
- •Несколько столбцов группировки
- •Ограничения на запросы с группировкой
- •Вложенные запросы на чтение
- •Внешние ссылки
- •Вложенные запросы и объединения
- •Связанные вложенные запросы
- •Однострочный оператор insert
- •В интерактивном режиме удобно не включать в оператор insert список столбцов, так как это уменьшает длину оператора. В случае программного
- •Многострочный оператор insert
- •Удаление существующих данных
- •Удаление всех строк
- •Оператор delete с вложенным запросом *
- •Обновление существующих данных
-
Вложенные запросы на чтение
В SQL существует понятие вложенный запрос, механизм вложенных запросов позволяет использовать результаты одного запроса в качестве составной части другого. Возможность применения одного запроса внутри другого и была причиной появления слова "структурированный" в названии "структурированный язык запросов". Понятие вложенного запроса не так широко известно, как понятие объединения, но оно играет важную роль SQL по трем следующим причинам:
• Оператор SQL с вложенным запросом зачастую является самым естественным способом выражения запроса, так как он лучше всего соответствует словесному описанию запроса.
• Вложенные запросы облегчают написание операторов select, поскольку они позволяют разбивать запрос на части (на запрос и вложенных запросы), а затем складывать эти части вместе.
• Существуют запросы, которые нельзя сформулировать на SQL, не прибегая к помощи вложенных запросов.
ПРИМЕНЕНИЕ ВЛОЖЕННЫХ ЗАПРОСОВ
Вложенным, или подчиненным, запросом называется запрос, содержащийся в предложении where или having другого оператора SQL. Вложенные запросы позволяют естественным образом обрабатывать запросы, выраженные через результаты других запросов. Вот пример такого запроса:
"Вывести список офисов, в которых плановый объем продаж превышает сумму плановых объемов продаж всех служащих."
В данном запросе требуется получить список офисов из таблицы of fices, для которых значение столбца target удовлетворяет некотором условию. Логично предположить, что оператор select, выражающий данный запрос, должен выглядеть примерно так, как показано ниже.
Здесь величина "???" равна сумме плановых объемов продаж всех служащих, работающих в данном офисе. Как можно задать ее в этом запросе? Сумму плановых объемов продаж для отдельного офиса (скажем, офиса с идентификатором 21) можно получить с помощью следующего запроса:
Но как результаты этого запроса вставить в предыдущий запрос вместо вопросительных знаков? По-видимому, было бы разумно вначале написать первый запрос, а затем заменить символ "???"* вторым запросом:
Фактически это и есть правильный SQL-запрос. Вложенный (внутренний) запрос вычисляет для каждого офиса сумму плановых объемов продаж всех служащих, работающих в данном офисе. Главный (внешний) запрос сравнивает план продаж офиса с полученной суммой и, в зависимости от результата сравнения либо добавляет данный офис в таблицу результатов запроса, либо нет. Совокупно главный и вложенный запросы выражают исходный запрос и извлекают из базы данных требуемую информацию.
Вложенные SQL-запросы всегда выступают в качестве части предложения where или having. В предложении where они помогают отбирать из таблицы результатов запроса отдельные строки, а в предложении having — группы строк.
Что такое вложенный запрос
Вложенный запрос всегда заключается в круглые скобки, но по-прежнему сохраняет знакомую структуру оператора select, содержащего предложение from и необязательные предложения where, group by и having. Структура этих предложений во вложенном запросе идентична их структуре в операторе select; во вложенном запросе эти предложения выполняют свои обычные функции. Однако между вложенным запросом и оператором select имеется ряд отличий.
• Таблица результатов вложенного запроса всегда состоит из одного столбца. Это означает, что в предложении select вложенного запроса всегда указывается один возвращаемый столбец,
• Во вложенный запрос не может входить предложение order by. Результаты вложенного запроса используются только внутри главного запрос и для пользователя остаются невидимыми, поэтому нет смысла и сортировать.
• Вложенный запрос не может быть запросом на объединение нескольки:
различных операторов select; допускается использование только одной оператора select.
• Имена столбцов во вложенном запросе могут являться ссылками ш столбцы таблиц главного запроса. Эти внешние ссылки подробно рассматриваются ниже в настоящей главе.
ВЛОЖЕННЫЕ ЗАПРОСЫ В ПРЕДЛОЖЕНИИ WHERE
Чаще всего вложенные запросы указываются в предложении where оператора SQL. Когда вложенный запрос содержится в данном предложении, он участвует в процессе отбора строк. Рассмотрим еще раз пример запроса, приведенный в предьщущем параграфе.
Главный запрос считывает данные из таблицы offices, а его предложение where отбирает офисы, которые будут включены в таблицу результатов запроса. Условие, заданное в этом предложении, поочередно применяется ко всем строкам таблицы offices. Предложение where сравнивает значение текущей строки в столбце target со значением, возвращенным вложенным запросом. Для каждой строки результатов главного запроса выполняется вложенный запрос, который дает сумму плановых объемов продаж для служащих "текущего" офиса. Результатом вложенного запроса является одно число, и предложение where сравнивает его со значением столбца target, выбирая или отбрасывая текущий офис на основании результата сравнения. Как видно из рисунка, выполнение вложенного запроса повторяется для каждой строки, проверяемой предложением where главного запроса.