- •4. Реляционные языки запросов
- •Isbl -язык реляционной алгебры
- •Язык sql
- •Типы данных.
- •Создание, удаление или изменение таблиц или индексов с помощью управляющих запросов sql.
- •Инструкция create table
- •Предложение constraint (sql)
- •Инструкция alter table
- •Инструкция drop
- •Drop {table таблица | index индекс on таблица}
- •Инструкция create index
- •Запросы на выборку. Инструкция select
- •Предикаты all, distinct, distinctrow, top (sql)
- •Select [all | distinct | distinctrow | [top n [percent]]]
- •Предложение from
- •Синтаксис
- •Предложение where
- •Синтаксис
- •Предложение order by
- •Синтаксис
- •Группировка записей. Предложение group by
- •Синтаксис
- •Where условие_отбора
- •Предложение having
- •Синтаксис
- •From таблица
- •Запросы с соединением таблиц. Операция inner join
- •On таблица1.Поле2 оператор_сравнения таблица2.Поле2) or
- •Операции left join, right join
- •From таблица1 [ left | right ] join таблица2
- •Объединение результатов нескольких запросов. Операция union
- •Подчиненный запрос.
- •Запросы на изменение. Инструкция select...Into
- •From источник
- •Предложение in
- •Синтаксис
- •Инструкция insert into
- •Инструкция update
- •Инструкция delete
- •Delete [таблица.*]
- •Перекрестные запросы
- •Синтаксис
- •Запросы с параметрами Описание parameters
- •Синтаксис parameters имя тип_данных [, имя тип_данных [, ...]]
- •Статистические функции sql .
- •Функция Avg
- •Функция Count
- •Функции Min, Max
- •Функции StDev, StDevP
- •Функция Sum
- •Функции Var, VarP
- •Var(выражение)
- •VarP(выражение)
- •Quel:язык реляционного исчисления с переменными-кортежами
- •Query-by-example: язык исчисления с переменными – доменами
- •Формы запросов
- •Зарезервированные слова:
- •Конструирование операторов запроса.
- •Выбор записей
- •Запросы к нескольким таблицам
- •Вычисления
- •Операции
- •Группы записей
- •Работа с наборами записей
- •Развитые операторы запросов.
Развитые операторы запросов.
Многие мощные средства языка запросов, рассмотренные выше - элементы-примеры, вычисления, главные и зависимые таблицы, Set операторы и т.д. - можно комбинировать для получения ответов на сложные, тонкие и комплексные запросы.
Выше рассматривалось использование оператора включения (!) для того, чтобы ответ на запрос содержал полный набор записей. Оператор добавляется к элементу-примеру для выбора всех записей данной таблицы независимо от того, есть или нет соответствующие записи в другой таблице. Кроме того, можно задать условие выбора главных записей для включения в Answer.
Примеры 28, 29, 30 иллюстрировали использование оператора включения в запросах, содержащих одну главную и одну зависимую таблицу. Ниже рассмотрим примеры использования множественных ! для выбора всех записей из нескольких таблиц, использование ! в арифметических выражениях, использование в одном запросе одновременно исключающей и включающей связей.
Добавим в схему БД, используемой в примерах, отношение SPO (Заказы). Будем считать, что возможны поставки деталей без предварительного заказа.
65) Определить все поставленные и(или) заказанные детали.
SP════╦══════НомП════╦════════НомД══════╦════Колич════╗
║ ║√ MD! ║√ ║
SPO════╦══НомЗ══╦══НомП══╦════════НомД══════╦════Колич════╦═Дата══╗
║√ ║ ║√ ND!,as Дет ║√ as Кол ║√ ║
ANSWER═╦══НомД═╦══Колич══╦══НомЗ══╦═Дет══╦══Кол══╦════Дата════╗
1 ║ ║ ║ 1 ║ Д16 ║ 4 ║ 15.10.92 ║
2 ║ Д1 ║ 34 ║ 3 ║ Д1 ║ 35 ║ 23.09.92 ║
3 ║ Д1 ║ 35 ║ 3 ║ Д1 ║ 35 ║ 23.09.92 ║
4 ║ Д10 ║ 35 ║ ║ ║ ║ ║
5 ║ Д11 ║ 67 ║ 2 ║ Д11 ║ 80 ║ 10.10.92 ║
Запрос, содержащий единственный оператор ! иногда называют асимметричным внешним соединением, так как включающая связь специфицирована только для одной из таблиц, включенных в запрос. В симметричном внешнем соединении специфицируется более одной включающей связи. При этом выбираются все значения в общих полях независимо от того, соответствуют ли они друг другу.
Можно использовать включающие связи в двух таблицах, не содержащих общего поля, например:
66)
S═╦══════НомП════╦════ИмяП════╦══Статус════╦════Город════╗
║ NP! ║√ ║ ║ ║
SP════╦════════НомП══════╦════════НомД══════╦════Колич════╗
║ NP! ║ ND! ║√ ║
P═╦════НомД════╦═══Наим════╦══Цвет══╦══Вес════╦══Город══╗
║ ND! ║√ ║ ║ ║ ║
ANSWER═╦══ИмяП═════╦══Колич══╦═════Наим══════╗
1 ║ ║ ║ Молоток ║
2 ║ База 1 ║ 4 ║ Редуктор ║
3 ║ База 1 ║ 12 ║ Стол ║
4 ║ База 1 ║ 45 ║ Стул ║
19 ║ База 3 ║ 88 ║ Стул ║
20 ║ База 4 ║ 54 ║ Каркас ║
21 ║ База 5 ║ ║ ║
22 ║ База 6 ║ 35 ║ Корпус ║
Оператор включения ! можно использовать в выражениях для вычислений. Это позволяет конструировать компактные и мощные запросы.
67)
SP════╦════НомП════╦════════НомД══════╦══════Колич══════╗
║ ║√ ND! ║√ <QQ!/2 ║
SPO════╦══НомЗ══╦════НомП══╦════НомД════╦══════Колич══════╦══Дата══╗
║ ║ ║ ND ║√ QQ,as Кол ║ ║
ANSWER═╦══НомД═╦══Колич══╦══Кол══╗
1 ║ Д1 ║ 34 ║ ║
2 ║ Д1 ║ 35 ║ ║
3 ║ Д10 ║ 35 ║ ║
4 ║ ... ║ ║ ║
5 ║ Д3 ║ 4 ║ 45 ║
6 ║ Д3 ║ 4 ║ 76 ║
7 ║ Д3 ║ 45 ║ ║
8 ║ ... ║ ║ ║
Различия между асимметричным и симметричным соединением определяют порядок, в котором выполняются элементы запроса и пути, которыми можно связать различные строки в запросе. Основные правила связывания таблиц:
1. Для каких-либо двух строк в операторе запроса можно использовать для задания связи либо включающую, либо исключающую связь, но не обе.
2. В одном операторе запроса можно использовать и включающую, и исключающую связи, если они не включают одну и ту же пару строк, Когда в одном запросе имеются оба типа связей, они обрабатываются в порядке от наименьшего к наибольшему включению.
3. Можно использовать ! с любым элементом-примером один раз в строке и дважды в запросе.
Главное правило связи таблиц:
Любые две строки в операторе запроса можно связать только одним типом связи.
68)
SP════╦════НомП══╦════════НомД══════╦════Колич════╗
║ ║√ ND! ║√ QQ! ║
SPO════╦══НомЗ══╦══НомП══╦════НомД════╦══════Колич══════╦══Дата══╗
║ ║ ║ ND ║√ QQ,as Кол ║ ║
ANSWER═╦══НомД═╦══Колич══╦══Кол══╗
1 ║ Д1 ║ 34 ║ ║
2 ║ Д1 ║ 35 ║ 35 ║
3 ║ Д10 ║ 35 ║ ║
4 ║ Д11 ║ 67 ║ ║
5 ║ Д11 ║ 98 ║ 98 ║
6 ║ Д12 ║ 56 ║ ║
7 ║ Д12 ║ 78 ║ 78 ║
8 ║ Д13 ║ 98 ║ 98 ║
9 ║ Д14 ║ 23 ║ 23 ║
10 ║ ... ║ ║ ║
Без ! в поле QTY формы SP запрос будет ошибочным и не будет выполнен.
69) Пример запроса с различными типами связей:
SP════╦══════НомП══════╦════НомД════╦══Колич══╗
║ NP ║√ ND! ║√ QQ! ║
SPO════╦════НомЗ══╦══НомП══╦════НомД════╦════Колич════╦══Дата══╗
║ ║ ║ ND ║√ QQ ║ ║
S══════╦════НомП════╦════ИмяП════╦════Статус════╦══Город══╗
║ NP ║√ ║ ║ ║
ANSWER═╦═НомД═╦══Колич══╦Колич-1═╦══ИмяП════╗
1 ║ Д1 ║ 34 ║ ║ База 10 ║
2 ║ Д1 ║ 35 ║ 35 ║ База 6 ║
3 ║ Д10 ║ 35 ║ ║ База 2 ║
4 ║ Д11 ║ 67 ║ ║ База 2 ║
5 ║ Д11 ║ 98 ║ 98 ║ База 7 ║
6 ║ Д12 ║ 56 ║ ║ База 10 ║
7 ║ ... ║ ║ ║ ║
Количество поставленных деталей (строки 1, 3, 4, 6) отлично от заказанного.
Формы SP и S связаны исключающей связью, а SP и SPO - включающей. СУБД обрабатывает различные типы связей в одном запросе в следующей последовательности:
1. Исключающие связи;
2. Асимметричные включающие связи;
3. Симметричные включающие связи.
Такая последовательность гарантирует постоянные результаты запросов.
Источники:
1. Ульман Дж. Основы систем баз данных.- М.: Финансы и статистика, 1983. – 334 с.
2. Справочная система MS Access 97.
3. Paradox relational database version 3.5. User’s Guide. Borland international
4. Дейт К. Руководство по реляционной СУБД DB2.- М.: Фининсы и статистика, 1988. - 320с.