- •Информационные системы, основные функции и области применения
- •Банк данных и его компоненты
- •Иерархическая модель данных
- •Сетевая модель данных
- •Реляционная модель
- •Классификация программ субд
- •Общие понятия реляционного подхода к организации бд Основные концепции и принципы
- •Индексирование
- •Отношения между таблицами
- •Управление реляционной базой данной. Реляционная алгебра. Реляционное исчисление.
- •Реляционное исчисление
- •Проектирование реляционных баз данных с использованием нормализации.
- •Первая нормальная форма таблицы
- •Вторая нормальная форма
- •Управление транзакциями
- •Транзакции и целостность бд
- •Изолированность пользователей
- •Сериализация транзакций
- •Методы сериализации транзакций
- •Синхронизационные захваты
- •Тупики распознавания и разрушения
- •Метод временных меток
- •Элементы языка sql Функции и основные возможности языка sql
- •Отличие sql от процедурных языков программирования
- •Интерактивный и встроенный sql
- •Составные части sql
- •Типы данных sql
- •Числовые типы данных:
- •Используемые термины и обозначения
- •Выборка данных с использование предложения select
- •Простейшие select-запросы
- •Преобразование вывода и встроенные функции
- •Числовые и символьные константы
- •Арифметические операции для преобразования числовых данных
- •Операция конкатенации строк
- •Агрегирование и групповые функции
- •Упорядочение выходных полей
- •Вложенные подзапросы
- •Формирование связанных подзапросов
- •Организация данных в InterBase
Формирование связанных подзапросов
При использовании подзапросов во внутреннем запросе можно ссылаться на таблицу, имя которой указано в предложении From внешнего запроса. В этом случае такой связанный подзапрос выполняется по одному разу для каждой строки таблицы основного запроса. Пример: выбрать сведения обо всех предметах обучения, по которым проводился экзамен 20 января 2012 года:
Select *
From subject as su
Where ‘20/01/2012’ in
(Select exam_date
From exam_marks as ex
Where su.subj_id = ex.subj_id);
В некоторых СУБД для выполнения этого запроса может потребоваться преобразование значения даты в символьный тип. В приведенном запросе ex и su являются псевдонимами, т.е. специально вводимыми именами, которые могут быть использованы вместо настоящих имен. Эту же операцию можно записать при помощи соединения таблиц.
Select su.subj_id, subj_name, hour, semester
From subject as su, exam_marks as ex
Where su.subj_id = ex.subj_id
And exam_date = #20/01/2012
Можно использовать подзапросы связывающие таблицу со своей собственной копией. Пример: найти студентов, которые получают стипендию выше средней на курсе.
Select distinct student_id, surname, name, stripend
From student as E1
Where stipend >
(Select avg(stipend)
From student as E2
Where E1.kurs = E2.kurs);
Select distinct student_id, surname, name, stripend
From student as E1,
(Select kurs, avg(stipend) as avg_stipend
From student as E2
Group by E2.kurs) as E3
Where E1.stipend > avg_stipend
And E1.kurs = E3.kurs;
Второй запрос будет выполнен гораздо быстрее т.к. в первом запросе агрегирующая функция AVG выполняется над таблицей указанной в подзапросе для каждой строки внешнего запроса. Во втором варианте вторая таблица алиас E2 обрабатывается агрегирующей функцией один раз в результате чего формируется вспомогательная таблица алиас E3 со строками которой затем соединяются строки первой таблицы (алиас E1).
Связанные подзапросы с предложением Having
Пример: по данным из таблицы exam_marks определить сумму полученных студентами оценок сгруппировав значения оценок по датам экзаменов и исключить те дни когда число студентов сдавших в течение дня экзамены было меньше 10.
Организация данных в InterBase
Домены
Перед тем как создавать таблицы, которые ссылаются на домены необходимо задать описание доменов при помощи команды create domain. В результате ее выполнения создается, на который можно ссылаться в командах создания и модификации таблиц. Столбцы базирующиеся на доменах наследуют все его характеристики, причем часть из них может быть переопределена в локальных описаниях столбцов.
Замечание: тип данных не может быть переопределен при использовании домена в описании таблицы.
Синтаксис описания домена:
create domain <name_domain> as <data_type>
[Default {literal | Null | User}]
[Not null] [Check (<dom_condition>)];
Name_ domain - имя создаваемого домена; data_type – тип данных;
[Default {literal | Null | User}] – задание значения по умолчанию – значение по умолчанию присваивается соответствующему атрибуту при создании новой строки в таблице, если его значение не указано явно. Параметр literal указывает значение явно, Null – оставляет значение пустым, User – имя пользователя создавшего запись.
Для полей типа Data можно указывать now, тогда будет вводиться текущая дата.
[Not null] – запрещает ввод пустых значений.
[Check (<domain_condition)] – задает ограничения (описание контроля данных при вводе и изменении). Для задания условия используются следующие ключевые слова:
value – подразумевает значение вводимое в поле.
Is null, is not null
Between … and…, like, in.
А также все арифметические и логические операторы.
Замечание: домены создаются независимо друг от друга и тем более, от каких либо таблиц, следовательно, Check в домене не может ссылаться ни на какой другой домен или столбец в таблице.
Замечание: домен может иметь только одну конструкцию Check.
Замечание: конструкция Check не может быть переопределена при описании атрибута таблицы. Если при описании поля таблицы, ссылающегося на домен, имеющий Check, указано свое ограничение, то действовать будут оба ограничения.
Пример:
Create domain username as varchar(20)
Default user;
Create domain month as smallint
Check (value between 1 and 12);
Create domain d_elem as char(2)
Check (value in (‘Au’, ‘Ag’, ‘Pt’, ‘Pd’, ‘Os‘));
Create domain pweight as numeric(122)
Default null check ((value is null) or (value > 1.25));
Изменение доменов
Изменение доменов осуществляется командой alter domain. С помощью данной команды можно изменить любые характеристики домена, кроме типа данных и установок not null. Сделанные изменения воздействуют на атрибуты всех таблиц, где использовался измененный домен. Команду alter domain может вызвать либо создатель домена, либо пользователь с правами системного администратора.
Для изменения типа поля или установки not null необходимо удалить домен, если это возможно (если домен используется для описания столбцов каких либо таблиц то удалить его нельзя) , а затем создать его снова с требуемыми характеристиками.
Синтаксис команды изменения домена:
Alter domain name_domain {
[Set default {literal | Null | User}]
[Drop default]
[Add [Constraint] Check (<dom_condition>)]
[Drop constraint]};
[Drop default] – удаляет значение по умолчанию.
[Add [Constraint] Check (<dom_condition>)] – добавить ограничение.
[Drop constraint] – удалить ограничение.
Замечание: изменить ограничение одной командой нельзя. Сначала ограничение нужно удалить, а потом добавить.
Пример:
Alter domain d_elem drop constraint;
Alter domain d_elem add check (value in (‘H’, ‘Li’, ‘K’, ‘Na’);
Alter domain username set default ‘***’;
Удаление доменов
Удаление доменов осуществляется командой drop domain. Если домен используется в какой-либо таблице, то удалить его нельзя.
Синтаксис:
Drop domain <name_domain>
Таблицы
Прежде чем перейти к созданию таблицы необходимо провести проектирование БД, далее следует создать комплект необходимых доменов и только затем переходить к созданию таблицы.
Создание таблицы
Создание таблицы осуществляется командой create table, которая создает структуру таблицы и в самом простом случае определяет название таблицы, перечень полей с указанием типов данных, а также контрольными ограничениями. Кроме того при создании таблицы можно задать первичный ключ, внешние ключи, дополнительные виды контроля на уровне записей.
Упрощенный синтаксис команды:
Create table <name_table>
(Описание полей таблицы);
Описание полей таблицы:
Name {<тип_данных> | Computed [by](<выражение>) | <имя домена>}
[Default { literal | Null | User}]
[not null]
[<ограничение столбца>];
Name – заголовок столбца
Computed [by] – выражение для вычисляемого столбца. Значения вычисляемых столбцов рассчитываются всякий раз при обращении к ним. Выражение может быть любым допустимым в InterBase выражением, возвращающим единственное значение простого типа. Допустимы выражения с предложением SELECT.
Ограничения столбца – описывает ограничения логической целостности столбца.
InterBase позволяет задавать ограничения на отдельные столбцы и на таблицу в целом называемые ограничением логической целостности, которые задают порядок управления зависимостями между столбцом и таблицей, а также между таблицей и таблицей. Они воздействуют на все выполняемые с таблицей действия, автоматически поддерживаясь системой. Конструкция ограничения столбца имеет следующий синтаксис:
[Constraint <имя ограничения>]
{ Unique
| Primary key
| Check (<условие>)
| References <имя другой таблицы> [(список атрибутов)]
[On delete {No action | Cascade | Set default | Set null}]
[On update {No action | Cascade | Set default | Set null}]
}
