- •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) представляет собой разновидность группы - специфической группы записей, о которой можно задавать различные вопросы. Ключевое слово set можно использовать, например, для определения набора поставщиков, находящихся в Киеве, деталей красного цвета и т.п. Определив набор в запросе, его можно сравнивать с другими записями или группами записей. Возможны два типа сравнений:
1. Можно сравнить с набором группу записей, например:
Какие поставщики поставляют только детали, хранящиеся в Москве? Все детали, хранящиеся в Москве?
Какие поставщики не поставляют детали весом более 20?
Какие детали поставляются только поставщиками из Киева?
Для таких сравнений используется специальная группа операторов: only, no, every и exactly.
2. Так как набор представляет собой разновидность группы, можно использовать агрегатные операторы и сравнивать их результаты со значениями в других записях, например:
Вес каких деталей более чем вдвое превышает средний вес деталей красного цвета?
Возможность использовать set в запросах, выполнение которых иным путем потребовало бы нескольких шагов, является очень мощным средством языка.
Каждый set запрос содержит следующие компоненты:
одна или более строк для определения набора;
одна или более строк, которые показывают другие записи, участвующие в сравнениях с набором;
(необязательно) одна или более строк, определяющих связанную информацию.
Выделение перечисленных компонент при конструировании или анализе set запроса делает его более понятным и полезным.
52) Определить поставщиков, не поставляющих детали красного цвета.
P══════╦════НомД════╦═══Наим════╦════Цвет═════╦══Вес════╦══Город══╗
set ║ ND ║ ║ Красный ║ ║ ║
SP════╦════════НомП══════╦════════НомД══════╦══════Колич══════╗
║√ ║ no ND ║ ║
ANSWER═╦══НомП═╗
1 ║ П10 ║
2 ║ П2 ║
3 ║ ... ║
Набор сравнивается с записями таблицы SP, сгруппированными по НомП. No ND в поле НомД выделяет записи SP, не содержащие значений НомД из набора.
При необходимости можно пометить для включения в Answer дополнительные поля или установить связи с другими таблицами с помощью элементов-примеров. При добавлении необходимо быть уверенным, что они не будут пересекаться с определением набора и группировкой записей.
53)
P══════╦════НомД════╦══Наим═══╦══════Цвет═════╦══Вес════╦══Город══╗
set ║ ND ║ ║ Красный ║ ║ ║
SP════╦════════НомП══════╦════════НомД══════╦══════Колич══════╗
║√ NP ║ no ND ║ ║
S═╦══════НомП═══╦═════ИмяП════╦═════Статус══════╦══════Город══════╗
║ NP ║√ ║ ║√ ║
ANSWER═╦══НомП═╦══ИмяП════╦══════Город══════╗
1 ║ П10 ║ База 10 ║ Рязань ║
2 ║ П2 ║ База 2 ║ Казань ║
3 ║ ║ ... ║ ║
Определение набора записей в запросе очень похоже на выделение их для включения в Answer, образуя "запрос в запросе". В формы запроса включаются условия, определяющие записи для включения в набор. Если информация находится более чем в одной таблице, используются элементы-примеры для связи форм запросов.
Для определения набора ключевое слово set помещается в левую графу всех строк запроса, которые определяют набор. Для выбора поля используется элемент-пример. Строки в определении набора не должны содержать √ или операторы calc. Те же самые элементы-примеры можно при необходимости использовать для организации связи с другими таблицами.
54) Определить номера поставщиков, поставляющих только детали, хранящиеся в Киеве.
P══════╦════НомД════╦═══Наим════╦══Цвет══╦══Вес════╦════Город════╗
set ║ ND ║ ║ ║ ║ Киев ║
SP════╦════════НомП══════╦════════НомД══════╦══════Колич══════╗
║√ ║ only ND ║ ║
ANSWER═╦══НомП═╗
1 ║ П7 ║
Определение набора может занимать несколько строк. При этом процесс определения набора остается тем же.
55) Какие детали весят меньше, чем в среднем весят детали, поставляемые поставщиком П7?
P══════╦════НомД═══╦═══Наим══╦══Цвет══╦══════Вес══════╦═══Город════╗
set ║ ND ║ ║ ║ W ║ ║
║ ║√ ║ ║√ < average W ║ ║
SP════╦════════НомП══════╦════════НомД══════╦══════Колич══════╗
set ║ П7 ║ ND ║ ║
ANSWER═╦═════Наим══════╦══Вес══╗
1 ║ Дрель ║ 6 ║
2 ║ Зубило ║ 3 ║
3 ║ ... ║ ║
Набор можно сравнивать с другими записями, например, с группами записей, определенных с использованием . При этом можно использовать операторы сравнения only, no, every, exactly:
only - значения в группе содержат только элементы набора;
no - значения в группе не содержатся в наборе;
every - значения в группе включают все элементы набора;
exactly - значения в группе соответствуют исключительно элементам набора
(only + every).
56) Какие поставщики поставляют все детали, хранящиеся в Туле?
P══════╦════НомД════╦═══Наим══╦══Цвет════╦══Вес════╦════Город════╗
set ║ ND ║ ║ ║ ║ Тула ║
SP════╦════════НомП══════╦════════НомД══════╦══════Колич══════╗
║√ NP ║ every ND ║ ║
S═╦══════НомП════╦════ИмяП════╦═════Статус═════╦══════Город══════╗
║ NP ║√ ║ ║ ║
ANSWER═╦══НомП═╦══ИмяП════╗
1 ║ П2 ║ База 2 ║
57) Какие поставщики поставляют все детали, хранящиеся в Москве, и никакие другие?
P══════╦════НомД════╦═══Наим══╦══Цвет══╦══Вес════╦════Город════╗
set ║ ND ║ ║ ║ ║ Москва ║
SP════╦════════НомП══════╦════════НомД══════╦══════Колич══════╗
║√ ║ exactly ND ║ ║
ANSWER═╦══НомП═╗
1 ║ П3 ║
58) Какие детали не поставляются поставщиками со статусом меньше 30?
S══════╦══════НомП════╦════ИмяП════╦══════Статус══════╦══Город══╗
set ║ NP ║ ║ <30 ║ ║
SP════╦════════НомП══════╦════════НомД══════╦══════Колич══════╗
║ no NP ║√ ║ ║
ANSWER═╦══НомД═╗
1 ║ Д2 ║
2 ║ Д8 ║
3 ║ Д9 ║
√ в той же строке, что и операторы сравнения (также как и в одной строке с агрегатными операторами) имеет двойной смысл:
1. Группировать записи по значениям поля;
2. Включить поле в Answer.
Если требуется провести группировку по какому-либо полю, не включая его значения в Answer, вместо F6 (Checkmark) нужно нажать Shift - F6 (Groupby). В поле появится индикатор G. Groupby используется только в set запросах.
59) То же, что пример 56, но в поле НомП таблицы SP вместо помещается G.
P══════╦════НомД════╦═══Наим════╦══Цвет══╦══Вес════╦════Город════╗
set ║ ND ║ ║ ║ ║ Тула ║
SP════╦════════НомП══════╦════════НомД══════╦══════Колич══════╗
║G NP ║ every ND ║ ║
S═╦══════НомП════╦══════ИмяП══════╦══Статус════╦══Город════╗
║ NP ║√ ║ ║ ║
ANSWER═╦══ИмяП════╗
1 ║ База 2 ║
60) Какие поставщики поставляют детали только из Киева?
P══════╦════НомД════╦═══Наим════╦══Цвет════╦══Вес════╦════Город════╗
set ║ ND ║ ║ ║ ║ Киев ║
SP════╦════════НомП══════╦════════НомД══════╦══════Колич══════╗
║G NP ║ only ND ║ ║
S═╦════НомП═══╦═════ИмяП══════╦══════Статус══════╦══════Город═════╗
║ NP ║√ ║ ║ ║
ANSWER═╦══ИмяП════╗
1 ║ База 7 ║
Записи можно сравнивать с агрегатными значениями, полученными для набора. Для этого в строке, выделяющей записи для сравнения, используются агрегатные операторы.
61) Какие детали имеют вес меньший, чем минимальный вес деталей желтого цвета?
P══════╦════НомД════╦═══Наим════╦══Цвет══╦════Вес══════╦══Город══╗
set ║ ║ ║ Желтый ║ W ║ ║
║√ ║√ ║ ║√ < min W ║ ║
ANSWER═╦══НомД═╦══════Наим══════╦══Вес══╗
1 ║ Д13 ║ Фреза ║ 1 ║
2 ║ Д14 ║ Пила ║ 2 ║
3 ║ Д15 ║ Зубило ║ 3 ║
4 ║ Д6 ║ Молоток ║ 2 ║
5 ║ Д8 ║ Рубанок ║ 1 ║
62) Какие детали имеют вес, превышающий средний вес всех деталей не менее чем на 50%?
P══════╦══НомД══╦═Наим══╦══Цвет══╦══════════Вес══════════╦══Город══╗
set ║ ║ ║ ║ W ║ ║
║√ ║√ ║ ║ >=(average W)*1.5 ║ ║
ANSWER═╦══НомД═╦═════Наим══════╗
1 ║ Д3 ║ Редуктор ║
2 ║ Д7 ║ Верстак ║
3 ║ Д9 ║ Мотор ║
63) То же, но требуется получить и средний вес деталей, и вес каждой детали.
P═══╦НомД╦Наим╦Цвет╦══════════════════Вес════════════════════╦Город╗
set ║ ║ ║ ║ W ║ ║
║√ ║ ║ ║√calc average W as Вес1,>=(average W)*1.5║ ║
ANSWER═╦══НомД═╦══Вес══╦════Вес1══════╗
1 ║ Д3 ║ 57 ║ 18.67 ║
2 ║ Д7 ║ 45 ║ 18.67 ║
3 ║ Д9 ║ 88 ║ 18.67 ║
64) Определить поставщиков из всех остальных городов, которые поставляют детали общим количеством большим, чем поставщики из Киева.
S══════╦══════НомП════╦════ИмяП════╦══Статус══╦══════Город══════╗
set ║ NP ║ ║ ║ Киев ║
║ NP1 ║ ║ ║√ ║
SP════╦════════НомП══════╦════НомД════╦══════════Колич════════════╗
set ║ NP ║ ║ Q ║
║ NP1 ║ ║ sum > sum Q,calc sum ║
ANSWER═╦══════Город══════╦═Sum of Колич══╗
1 ║ Казань ║ 568 ║
2 ║ Москва ║ 1247 ║
3 ║ Рязань ║ 288 ║
Первая строка в каждой форме определяет набор киевских поставщиков и количества поставляемых ими деталей. Вторые строки без выражения sum определяют суммарные количества деталей, поставляемые поставщиками каждого города. Выражение sum выделяет только города, суммарные количества деталей для которых превышает его для набора (Киев).