- •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: язык исчисления с переменными – доменами
- •Формы запросов
- •Зарезервированные слова:
- •Конструирование операторов запроса.
- •Выбор записей
- •Запросы к нескольким таблицам
- •Вычисления
- •Операции
- •Группы записей
- •Работа с наборами записей
- •Развитые операторы запросов.
Функции Min, Max
Возвращают минимальное и максимальное значения из набора значений, содержащихся в указанном поле запроса.
Синтаксис
Min(выражение)
Max(выражение)
Функции Min и Max используют следующий аргумент:
Аргумент выражение является строковым выражением, которое определяет поле, содержащее вычисляемые данные, или выражение, выполняющее вычисления с данными из этого поля. Операнды аргумента выражение могут включать имя поля таблицы, константу или функцию (которая может быть внутренней или определяться пользователем, но не одной из других статистических функций SQL или статистических функций по подмножествам).
Функции Min и Max используются для определения наименьшего и наибольшего значений из поля на основе группы. Если не указан способ группирования, используется вся таблица.
Функции StDev, StDevP
Возвращают смещенное и несмещенное значение среднеквадратичного отклонения, вычисляемого по набору значений, содержащихся в указанном поле запроса.
Синтаксис
StDev(выражение)
StDevP(выражение)
Аргумент выражение является строковым выражением, которое определяет поле, содержащее вычисляемые числовые данные, или выражение, выполняющее вычисления с данными из этого поля. Операнды аргумента выражение могут включать имя поля таблицы, константу или функцию (которая может быть внутренней или определяться пользователем, но не одной из других статистических функций SQL или статистических функций по подмножествам).
Функции StDevP и StDev вычисляют величину смещенного и несмещенного среднеквадратичного отклонения.
Если базовый запрос содержит меньше двух записей (или не содержит записей для функции StDevP), эти функции возвращают значение Null (что означает невозможность вычисления среднеквадратичного отклонения).
Функция Sum
Возвращает сумму набора значений, содержащихся в заданном поле запроса.
Синтаксис
Sum(выражение)
Аргумент выражение является строковым выражением, которое определяет поле, содержащее добавляемые числовые данные, или выражение, выполняющее вычисления с данными из этого поля. Операнды аргумента выражение могут включать имя поля таблицы, константу или функцию (которая может быть внутренней или определяться пользователем, но не одной из других статистических функций SQL или статистических функций по подмножествам).
Функция Sum выполняет суммирование значений в поле.
Функция Sum пропускает записи с пустыми полями.
Функции Var, VarP
Возвращают значение смещенной и несмещенной дисперсии, вычисляемой по набору значений, содержащихся в указанном поле запроса.
Синтаксис
Var(выражение)
VarP(выражение)
Функции VarP и Var вычисляют значение смещенной и несмещенной дисперсии.
Если базовый запрос содержит меньше двух записей, функции Var и VarP возвращают значение Null (что означает невозможность вычисления дисперсии).
Quel:язык реляционного исчисления с переменными-кортежами
QUEL —это язык запросов INGRESреляционной СУБД, разработанной в Калифорнийском университете в Беркли. Он обладает весьма развитым синтаксисом, представляющим широкий спектр операторов исчисления с переменными-кортежами. Манипуляционная часть языка QUEL является чистой реализацией реляционного исчисления кортежей. Это означает, что в операторах указываются условия, накладываемые на кортежи, с которыми необходимо произвести соответствующие действия.
Оператор исчисления
{u(r) | (t1)…(tk)(R1(t1)…(Rk(tk)u[1]=ti1[j1]…u[r]=tir[jr] }
устанавливает, что ti принадлежит Ri и u образуется из r отдельных компонентов ti, а также формулирует некоторое дополнительное условие . Если — произвольная формула исчисления с переменными-кортежами без кванторов, то оператор может быть записан в языке QUEL следующим образом:
range of t1 is R1
range of tk is Rk
retrieve (ti1.A1,…,tir.Ar)
where '
Здесь Am являетсяjm-м атрибутом отношенияRim, m=1,2,…,k,а’ - условием в форме выражения QUEL.
Основной набор операторов манипулирования данными включает операторы RETRIVE (выбрать), APPEND (добавить), REPLACE (заменить) и DELETE (удалить). Перед выполнением любого из этих операторов необходимо определить используемые в них кортежные переменные, связав их с соответствующими отношениями путем выполнения оператора range.
Интуитивный смысл оператора
range of t is R
заключается в том, что любые последующие операции должны быть выполнены по одному разу для каждого принадлежащего Rкортежа при t,равном поочередно каждому из этих кортежей. Эта декларация имеет силу до тех пор, пока tне будет переопределено другим оператором range.
Оператор выборки retrieveпечатает таблицу с именами столбцовAi1,…,Aik. Если мы желаем назначить столбцу m иное имя, скажем, ЗАГОЛОВОК, то следует написать ЗАГОЛОВОК = tim.Ajm.
Оператор retrieve into R присваевает значение новому отношению с именемR.
Для сортировки отношения используется оператор sort. При сортировке удаляются дубликаты кортежей.
Для печати отношений служит оператор print.
Язык QUEL содержит также операторы определения ограничений целостности, представлений и ограничений доступа.
Продемонстрируем основные свойства операторов QUEL на примерах. Будем использовать ту же базу данных, что и при рассмотрении SQL.
Определить имена поставщиков из Калининграда:
range of p is Поставщики
retrieve (p.Имя)
where p.Адрес = “Калининград”
Определить наименования товаров типа “Обувь”:
range of tis Товары
range of p is Типы
retrieve (p.Наименование)
where p.Наименование =“Обувь” and p.Тип =t.Тип
Определить имена поставщиков, поставляющих хотя бы один товар с местом хранения Москва:
range of tis Товары
range of pis Поставки
range of vis Поставщики
retrieve (v.Имя)
where t.Место_хранения =“Москва” and t.Код_товара =p.Код_товара and p.Код_поставщика =v.Код_поставщика
Добавить в таблицу Товары новый товар:
append to Товары(155,”Новый_товар”,15,250.50,”Тула”)
Определить коды товаров, поставляемых несколькими поставщиками:
range of pis Поставки
range of vis Поставки
retrieve into Коды(p.Код_товара)
where p.Код_товара =v.Код_товара and p.Код_поставщика !=v.Код_поставщика
sort Коды
print Коды
Удалить сведения о поставках товаров, если количество поставляемого товара меньше 5:
range of pis Поставки
delete p
where p.Количество< 5
Увеличить на 25% цену всех товаров, хранящихся в Москве:
range of tis Товары
replace t (ЦенаbyЦена * 1.25)
where t.Место_хранения =“Москва
В языке QUEL,как и в SQL,используются агрегатные функции: сумма sum,среднее avg,счетчик count,минимум minи максимум max.Аргументом таких функций может быть любое выражение, содержащее компоненты одного отношения, константы и арифметические операторы. Все компоненты должны указываться как t.Aдля переменной-кортежа tи различных атрибутов А.
Определить суммарное количество всех поставляемых товаров:
range of pis Поставки
retrieve (sum(p.Количество))
Определить наименования товаров с ценой, меньшей средней цены всех товаров:
range of tis Товары
retrieve (t.Наименование)
where t.Стоимость< avg(t.Стоимость)
Можно также разбить кортежи отношения на группы в соответствии со значением одного или более выражений, вычисляемых над отдельным кортежем, и вычислить агрегаты для каждого множества кортежей, имеющих общие значения указанных выражений. Для получения такого разбиения следует записать:
ag-op (E by F1, F2, ...,Fk),
где Е и Fi —выражения, операндами которых являются константы и компоненты t.Aдля одной переменной-кортежа t.Операнды в выражении могут соединяться арифметическими операторами. Если tопределено на R,значение функции вычисляется для значенийEгруппы кортежей R с одинаковыми значениями F1, …,Fk.
Получить таблицу, содержащую коды поставщиков и средние количества поставляемых ими товаров:
range of pis Поставки
retrieve into Средние(Код_поставщика =p.Код_поставщика,
Среднее = avg(p.Количествоby p.Код_поставщика))
sort Средние
print Средние
Язык QUEL содержит операторы для создания и уничтожения отношений:
create имя_отношения (имя_атрибута is тип_атрибута, ...)
destroy имя_отношения
а также два оператора изменения структур хранимых данных:
modify имя_отношения to структура_памяти on (ключ1, ключ2,...)
и
index on имя_отношения is имя_индекса (ключ1, ключ2, ...).
Если для кортежей не установлено конкретное упорядочение, файл называется кучей. Мы можем обеспечить хешированный доступ к файлу для отношения R,если запишем:
modify R to hash on A1, ...,Ak,
где A1, ..., Ak —список атрибутов R,которые служат ключом.
В качестве альтернативы использованию структуры с хешированным доступом может быть создан первичный индекс файла для R.С этой целью следует написать:
modify R to isam on A1, ...,Ak.
Здесь снова предполагается, что A1, ...,Akесть ключ для R.Акронимisamобозначает индексно-последовательный метод доступа (indexed sequential access method).
Вторичный индекс для Rможно создать с помощью оператора
index on R is S(A1, ...,Ak}.
Отношение Sв результате этого становится вторичным индексом дляRпо атрибутам A1, ...,Ak.Отношение Sсостоит из k + 1компонентов, первыми kиз которых являются A1, ...,Ak, а последним —указатель на записи из R.Этот последний компонент не имеет имени атрибута, и поэтому пользователь не может осуществлять доступ к его значениям или изменять их . Файл для вторичного индекса Sавтоматически делается файлом с индексно-последовательным методом доступа по A1, ...,Ak,хотя такая организация может быть изменена командой modify так же, как и для любого другого отношения.
В рассмотренном виде язык QUEL предназначен для интерактивной работы с базами данных Ingres. Для программирования прикладных информационных систем, которые должны взаимодействовать с базами данных, был разработан язык программирования EQUEL, являющийся, по существу, расширением языка программирования Си путем встраивания в него операторов языка QUEL. Язык EQUEL определяется следующим образом:
1) Любой оператор языка Си является оператором языка EQUEL.
2) Любой оператор языка QUEL, которому предшествуют два знака "#", является допустимым оператором языка EQUEL.
3) Переменные Си-программы могут использоваться в операторах QUEL, заменяя имена отношений, имена атрибутов, элементы списка выборки или константы. Те переменные Си-программы, которые используются таким образом, должны при своем объявлении быть помечены двойным знаком "#".
4) Оператор RETRIEVE (без INTO) сопровождается составным оператором языка Си, который выполняется по одному разу для каждого выбранного кортежа.
Приведем пример программы на языке EQUEL, выдающей код поставщика по его имени:
main() {
# # char post_name[20];
# # int Kod_post;
while (READ(post_name)) {
# # RANGE OF p IS Post
# # RETRIEVE (p. kod_post)
# # WHERE (p.post_name = post_name)
{ PRINT ("The post kod of "post_name" is
"kod_post"); }
}
}
Программа на языке EQUEL обрабатывается специальным препроцессором, который превращает ее в обычную Си-программу, содержащую вызовы Ingres с передачей в качестве параметров текстов операторов языка QUEL.
