Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SUBD.docx
Скачиваний:
15
Добавлен:
01.03.2025
Размер:
91.04 Кб
Скачать

Формирование связанных подзапросов

При использовании подзапросов во внутреннем запросе можно ссылаться на таблицу, имя которой указано в предложении 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)] – задает ограничения (описание контроля данных при вводе и изменении). Для задания условия используются следующие ключевые слова:

  1. value – подразумевает значение вводимое в поле.

  2. Is null, is not null

  3. Between … and…, like, in.

  4. А также все арифметические и логические операторы.

Замечание: домены создаются независимо друг от друга и тем более, от каких либо таблиц, следовательно, 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}]

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]