- •Предисловие
- •1. Основы информационного обеспечения процессов и систем
- •1.1. Понятие и содержание информационного обеспечения
- •1.2. Структура и классификация информационных систем
- •1.3. Система представления и обработки данных фактографических аис
- •Вопросы и упражнения
- •2. Системы управления базами данных фактографических информационных систем
- •2.1. Функции, классификация и структура субд
- •2.2. Модели организации данных
- •2.2.1. Иерархическая и сетевая модели организации данных
- •2.2.2. Реляционная модель организации данных
- •2.3. Внутренняя схема баз данных фактографических аис
- •2.3.1. Физические структуры данных
- •2.3.2. Индексирование данных
- •2.3.3. Расстановка (хеширование) записей
- •Вопросы и упражнения
- •3. Основы создания автоматизированных информационных систем
- •3.1. Общие положения по созданию автоматизированных систем
- •3.2. Проектирование банков данных фактографических аис
- •3.2.1. Концептуальное проектирование
- •3.2.2. Проектирование схем реляционных баз данных
- •3.2.2.1. Проектирование и создание таблиц
- •3.2.2.2. Нормализация таблиц
- •Вопросы и упражнения
- •4. Ввод, обработка и вывод данных в фактографических аис
- •4.1. Языки баз данных
- •4.2. Ввод, загрузка и редактирование данных
- •4.2.1. Ввод и редактирование данных в реляционных субд
- •4.2.2. Особенности ввода и загрузки данных в субд с сетевой моделью организации данных
- •4.3. Обработка данных
- •4.3.1. Поиск, фильтрация и сортировка данных
- •4.3.2. Запросы в реляционных субд
- •4.3.2.1. Запросы на выборку данных
- •4.3.2.1.1. Запросы на выборку данных из одной таблицы
- •4.3.2.1.2. Запросы на выборку данных из нескольких таблиц
- •4.3.2.1.3. Вычисления и групповые операции в запросах
- •4.3.2.2. Запросы на изменение данных
- •4.3.2.3. Управляющие запросы
- •4.3.2.4. Подчиненные (сложные) запросы
- •4.3.2.5. Оптимизация запросов
- •4.3.3. Процедуры, правила (триггеры) и события в базах данных
- •4.3.4. Особенности обработки данных в субд с сетевой моделью организации данных
- •4.4. Вывод данных
- •Вопросы и упражнения
- •5. Распределенные информационные системы
- •5.1. Понятие распределенных информационных систем, принципы их создания и функционирования
- •5.2. Технологии и модели «Клиент-сервер»
- •5.2.1. Модель файлового сервера
- •5.2.2. Модель удаленного доступа к данным
- •5.2.3. Модель сервера базы данных
- •5.2.4. Модель сервера приложений
- •5.2.5. Мониторы транзакций
- •5.3. Технологии объектного связывания данных
- •5.4. Технологии реплицирования данных
- •Вопросы и упражнения
- •6. Документальные информационные системы
- •6.1. Общая характеристика и виды документальных информационных систем
- •6.2. Информационно-поисковые каталоги и тезаурусы
- •6.2.1. Классификационные системы поиска документов
- •6.2.2. Координация понятий в классификационных системах
- •6.2.3. Информационно-поисковые тезаурусы
- •6.2.4. Автоматизация индексирования документов
- •6.3. Полнотекстовые информационно-поисковые системы
- •6.3.1. Информационно-технологическая структура полнотекстовых ипс
- •6.3.2. Механизмы поиска документов в полнотекстовых ипс
- •6.3.3. Методы количественной оценки релевантности документов
- •6.4. Гипертекстовые информационно-поисковые системы
- •6.4.1. Гипертекст
- •6.4.2. Структура, принципы построения и использования гипертекстовых ипс
- •6.4.3. Модель организации данных в гипертекстовых ипс
- •6.4.4. Формирование связей документов в гипертекстовых ипс
- •Вопросы и упражнения
- •7. Администрирование информационных систем и защита данных
- •7.1. Администрирование информационных систем
- •7.2. Разграничение доступа и защита данных
- •7.2.1. Понятие и модели безопасности данных
- •7.2.2. Технологические аспекты защиты информации
- •7.2.2.1. Идентификация и аутентификация
- •7.2.2.2. Языки безопасности баз данных
- •7.2.2.3. Безопасность повторного использования объектов
- •7.2.2.4. Надежное проектирование и администрирование
- •7.2.3. Требования и классы защищенности автоматизированных (информационных) систем в «Руководящих документах...» Государственной технической комиссии при Президенте рф
- •Вопросы и упражнения
- •Литература
- •Алфавитно-предметный указатель Содержание
4.3.2.4. Подчиненные (сложные) запросы
Как уже отмечалось, источникомданных для запросов могут быть результаты выполнениядругих запросов.Возможныдваварианта построения таких запросов.
Первый вариант реализуется через указание в SQL-инструкциях в качестве имен таблиц и имен полей имен запросов и полей запросов. Синтаксис таких запросов ничем не отличается от обычных запросов, а его исполнение осуществляется в две фазы. По запуску основного запроса сначала неявно запускается запрос, формирующий источник данных, и по завершению его исполнения запускается основной (внешний) запрос.
Второй вариантреализуется черезвключениев тело внешней (главной)SQL-инструкции внутренней инструкции SELECT.При этом результат исполнения внутренней инструкцииSELECTиспользуется для формирования условия отбора записей в главном (внешнем) запросе или в качестве выражения для нового вычисляемого поля. Такие запросы называютсяподчиненными.
Использование внутренней инструкции SELECT для формирования условий отбора записей во внешнем запросевозможно одним изтрехспособов:
• через предикаты сравнения «для некоторых/для всех» — ANY, SOME, ALL;
• через предикат вхождения IN;
• через предикат существования EXISTS.
В первом способеконструкция запроса может выглядеть следующим образом:
SELECT.. FROM...WHEREВыражение[ANY|SOME|ALL](SELECT...);
где — оператор сравнения.
Как правило, выражение включает поле из списка полей внешней SQL-инструкции или функцию от этих полей. Внутренняя инструкция SELECT должна возвращать набор данных по одному полю или по вычисляемому полю, при принципиальной сравнимости с выражением во внешней SQL-инструкции (главным образом по типу данных).
Предикаты ANYи SOME («для некоторых»),являющиеся синонимами, используются для отбора в главной SQL-инст-рукции тех записей, которые удовлетворяют сравнениюс какой-либо записью(т. е.хотя бы с одной),из отобранных во внутренней инструкции SELECT.
Для примера на рис. 4.23, априведен запрос по отбору из таблицы «Заявки» тех записей, которые могут быть удовлетворены в соответствии с данными по таблице «Квартиры», т. е. тех записей из таблицы «Заявки», которые удовлетворяют сравнению по полям «КолКомп», «Площадь» и «Этаж» хотя бы с некоторыми (ANY)записями из таблицы «Квартиры», выбираемыми при условии «Продано=Нет».
Рис. 4.23, а. Пример подчиненного запроса на основе предиката ANY
Предикат ALL (для всех)используется для отбора в главном запросе только тех записей, которые удовлетворяют сравнениюодновременно со всеми записями,отобранными в подчиненном запросе. Пример выполнения запроса с предикатомALLприведен на рис. 4.23,б.
Рис. 4.23, б. Пример подчиненного запроса па основе предиката ALL
Принцип действия запроса по второму способузаключается в поиске среди результирующего набора записей внешней SQL-инструкции тех записей, для которых значение определенного выражения входит в список записей, отбираемых внутренней инструкцией SELECT.Конструкция запроса с предикатом INвыглядит следующим образом:
SELECT ... FROM ... WHEREВыражение [NOT]IN (SELECT...);
В качестве примера на рис. 4.24 приведен запрос по тем же исходным данным (таблицы «Сотрудники» и «Премирование») для отбора записей только тех сотрудников, записи которых по премиям были в списке премий, равных или превышающих 100%.
Рис. 4.24. Пример с подчиненным запросом на основе предиката IN
Следует добавить, что предикат NOT INиспользуется для отбора во внешней SQL-инструкции только тех записей, которые содержат значения, не совпадающие ни с одним из отобранных внутренней инструкцией SELECT.
В третьем способепостроения подчиненного запроса предикат EXISTS(с необязательным зарезервированным словомNOT)используется в логическом выражении для определения того, должен ли подчиненный запросвозвращать какие-либо записи.Исходя из этого, каждая запись, отбираемая во внешней SQL-инструкции, идет в итоговый набор данных только тогда, когда при ее условиях отбирается (существует) хотя бы одна запись по внутренней инструкции SELECT.Конструкция запроса в этом случае может выглядеть следующим образом:
SELECT...FROM..WHERE([NOT]Exists(SELECT...));
В следующем примере на рис. 4.25 по таблицам, представленным на рис. 4.24, иллюстрируется запрос по отбору записей сотрудников, премированных хотя бы один раз, т.е. таких, у которых существует запись в списке премированных.
Рис. 4.25. Пример с подчиненным запросом на основе предиката EXISTS
Следует заметить, что использование предиката NOT EXISTSсформирует список ни разу не премированных сотрудников. В последнем примере можно также увидеть, что альтернативным решением для реализации такого запроса является использование запроса на внутреннее соединение (INNER JOIN).
Внутренняя инструкция SELECT может также использоваться в качестве выражения для вычисляемого поля внешней SQL-инструкции. Конструкция запроса в этом случае может выглядеть следующим образом:
SELECT...(SELECT...ИмяВычПоляFROM..WHERE...;
Обязательным условием при этом является то, чтобы внутренняя инструкция SELECT для каждой отбираемой по внешней SQL-инструкции записи возвращала не более чем одну запись но не более чем одному полю.
Приведем пример подобного запроса, отбирающего все записи по полю «Марка» из таблицы «Товары», с формированием дополнительного поля «Категория», значения которого возвращаются внутренней инструкцией SЕLЕСТ из таблицы «ТипыТоваров» при условии совпадения значения поля «КодТипа» из таблицы «Товары» для текущей записи внешней SQL-инструкции с аналогичным полем «КодТипа» в записях таблицы «ТипыТоваров»:
SELECTТовары.Марка, (SELECTТипыТоваров.КатегорияFRОМТипы
WHERE(Товары.КодТипа=ТипыТоваров.КодТипа);)
ASКатегория
FROMТовары;
Нетрудно заметить, что целью использования в данном примере внутренней инструкции SELECT является формирование в наборе данных, отбираемых из таблицы на стороне «Многие», дополнительного поля по значению какого-либо поля из связанной таблицы на стороне «Один». Исходя из этого, альтернативным способом решения данной задачи может быть использование запроса на внутреннее соединение:
SELECTТовары.Марка,ТипыТоваров.Категория
FROMТовары INNERJOINTТипыТоваровONТовары.Код-Типа = ТипыТоваров.КодТипа;
В тех случаях, когда отбор данных внешней SQL-инструкцией осуществляется из таблицы на стороне «Один», внутренняя инструкция SELECT может использоваться для дополнительного поля, формируемого на основе групповой операции по группам соответствующих связанных записей в таблице на стороне «Многие». Приведем пример отбора записей по полю «Категория» из таблицы «ТипыТоваров» с дополнительным полем «СредняяЦена», формируемым на основе статистической функции AVGпо полю «Цена» для групп связанных записей в таблице «Товары»:
SELECTТипыТоваров.Категория, (SELECT Avg(Toвары.Цена)
ASСредняяЦена
FROMТовары
GROUPВYТовары.КодТипа
НАVING(ТипыТоваров.КодТипа=Товары.КодТипа);)АSСредняяЦена
FROMТипыТоваров;
Опять-таки отметим, что альтернативным решением по данному примеру может быть использование следующего запроса на внутреннее соединение:
SELECTТипыТоваров.Категория, Avg(Toвapы.Цена) AS СредняяЦена
FROMТипыТоваров INNER JOINTТовары ON ТипыТоваров.КодТипа=Товары.КодТипа
GROUP ВY ТипыТоваров.Категория;