- •Понятия: первичный ключ, внешний ключ, суррогатный ключ, индекс.
- •Ограничения на значения данных.
- •Ограничения на связи между данными.
- •Нормализация отношений. Первая нормальная форма.
- •Нормализация отношений. Вторая нормальная форма.
- •Варианты задания условий отбора при создании sql-запросов.
- •Варианты создания многотабличных sql-запросов. Виды объединений.
- •Использование вычисляемых полей при создании sql-запросов.
- •Использование подчиненных запросов в sql-запросах.
- •Возможности запроса alter table.
- •Обработка транзакций.
- •Распределение функций в архитектуре «клиент-сервер».
- •1. Двухзвенные архитектуры.
- •2. Трёхзвенные архитектуры.
- •Понятие хранимой процедуры.
- •Понятие триггера.
Использование подчиненных запросов в sql-запросах.
Подчиненный запрос – создается путем включения одного запроса в другой;
– внутренний запрос выполняется только один раз;
– внешний (главный) запрос, проходя по всем своим записям, обращается только к итогу, полученному внутренним запросом.
Варианты подчиненных запросов:
1). выражение [Not] In (инструкция SQL) – отбор в главном запросе только тех записей, которые содержат значения, совпадающие (несовпадающие) с одним из значений, отобранных внутренним запросом.
Пример: Вывести информацию о вылетах в Москву.
SELECT *
FROM Вылет
WHERE [Номер рейса] In
(SELECT [Номер рейса]
FROM Рейс
WHERE [Пункт назначения] = ‘Москва’ )
2). [Not] Exists (инструкция SQL) – определение того, должен ли внутренний запрос возвращать какие-либо записи.
Пример: Вывести список пассажиров, которые когда-либо летали в Москву.
SELECT DISTINCT [Паспортные данные]
FROM Пассажир
WHERE Exists
(SELECT *
FROM Рейс
WHERE Рейс.[Номер рейса] = Пассажир.[Номер рейса]
AND [Пункт назначения] = ‘Москва’ )
3). знак сравнения [Any | Some | All] (инструкция SQL) – отбор в главном запросе записей, которые удовлетворяют сравнению с какими-нибудь (Any и Some) или со всеми (All) записями, отобранными внутренним запросом.
Пример: В какие города были проданы билеты по цене менее 120?
SELECT [Пункт назначения]
FROM Рейс
WHERE [Номер рейса] = ANY
(SELECT [Номер рейса]
FROM Пассажир
WHERE [Цена билета] <= 120 )
Any и Some – синонимы.
Если с Any и Some используется знак равенства, то это эквивалентно использованию оператора In, но Any и Some можно использовать со знаками > и <
Пример: Какие рейсы в Москву имеют число мест, меньшее по сравнению с рейсами в другие города?
SELECT [Номер рейса]
FROM Рейс
WHERE [Пункт назначения] = ‘Москва’ AND [Число мест] < All
(SELECT [Число мест]
FROM Рейс
WHERE [Пункт назначения] <> ‘Москва’)
Внутреннему запросу может предшествовать только знак сравнения. В этом случае он должен возвращать только одну запись.
Пример: Вывести информацию о рейсах, в которых число мест такое же, как на рейс в Киев.
SELECT *
FROM Рейс
WHERE [Пункт назначения] <> ‘Киев’ AND [Число мест] =
(SELECT [Число мест]
FROM Рейс
WHERE [Пункт назначения] = ‘Киев’)
Запросы с параметрами в языке SQL.
Условие отбора формируется пользователем в процессе выполнения запроса путем ввода значения параметра.
Пользователю выводится текст приглашения на ввод параметра.
В формулировке запроса текст приглашения заключается в квадратные скобки.
Пример: Вывести информацию о вылетах, плановая дата которых находится в определенном диапазоне, задаваемом пользователем.
SELECT *
FROM Вылет
WHERE [Плановая дата] Between [Начальная дата] AND [Конечная дата]
Возможности запроса CREATE TABLE.
SQL имеет особый раздел DDL, позволяющий определять структуру БД (таблицы, поля, индексы, ключи, ограничения).
Типы запросов DDL:
CREATE TABLE – создание новой таблицы.
ALTER TABLE – изменение структуры существующей таблицы.
DROP TABLE – удаление таблицы.
CREATE INDEX – создание нового индекса для таблицы.
DROP INDEX – удаление индекса таблицы.
Пример: Создать таблицу с двумя текстовыми полями, одним полем дата/время и числовым полем, которое определить как ключ. Сформировать в таблице уникальный индекс.
CREATE TABLE [Сотрудники компании] ( [Фамилия] TEXT, [Имя] TEXT, [Дата рождения] DATETIME, [Табельный номер] INTEGER CONSTRAINT ключ PRIMARYKEY, CONSTRAINT индекс1 UNIQUE ( [Фамилия], [Имя] ) )
Ограничения уровня поля:
DEFAULT значение – значение по умолчанию.
CHECK (условие) – условие на вводимые данные.
NOT NULL – обязательность значения.
UNIQUE – уникальность значения.
PRIMARY KEY – первичный ключ.
REFERENCES имя_таблицы (имя_поля) – задание ссылочной целостности (упрощенное задание внешнего ключа).
CREATE TABLE student
( id serial PRIMARY KEY, -- Первичный ключ
name varchar(20) NOT NULL UNIQUE,
mark numeric(1) CHECK (mark >= 3 AND mark <=5) DEFAULT 3,
code integer REFERENCES student_group (group_code), -- Внешний ключ
);
Замечание:
При установке ограничений UNIQUE и PRYMARY KEY автоматически создается индекс на основе В-дерева для поддержки этого ограничения.
Ограничения уровня таблицы:
Ограничение уровня таблицы начинается с ключевого слова CONSTRAINT.
Каждое ограничение имеет имя для отражения сути налагаемого ограничения.
При нарушении ограничения выводится имя нарушенного ограничения.
CONSTRAINT [имя_ограничения] ограничение, где ограничение – CHECK, UNIQUE
Пример:
CREATE TABLE student
( id serial PRIMARY KEY,
name varchar(20) NOT NULL,
mark numeric(1) DEFAULT 3,
code integer REFERENCES student_group (group_code),
CONSTRAINT unique_name UNIQUE (name),
CONSTRAINT valid_mark CHECK (mark >= 3 AND mark <=5)
);
Ограничение NOT NULL впрямую через CONSTRAINT не задается. Для этого надо использовать CHECK:
CONSTRAINT not_null_name CHECK (name IS NOT NULL)
Ограничения на уровне таблицы можно задавать без ключевого слова CONSTRAINT. Тогда имя ограничения будет формироваться автоматически.
Пример:
UNIQUE (name),
CHECK (mark >= 3 AND mark <=5),
Замечание:
Ограничения, в которых используются 2 и более полей, можно формировать только на уровне таблицы.
Задание маски ввода для значений символьных полей:
CONSTRAINT имя_ограничения CHECK (имя_поля SIMILAR TO ‘шаблон’), где ‘шаблон’ – регулярное выражение.
Примеры:
‘[0-9][0-9][0-9]’ – 3 цифры
‘[A-Z][0-9][0-9]’ – буква и 2 цифры
‘\([A-Z]\)[0-9][0-9]’ – буква в скобках и 2 цифры
‘\([A-Z]\)[0-9]\-[0-9]’ – буква в скобках и 2 цифры через дефис
Задание первичного и внешнего ключа на уровне таблицы:
PRIMARY KEY (имя_поля (или полей через запятую)),
FOREIGN KEY (имя_поля (или полей через запятую)) REFERENCES имя_таблицы (имя_поля (или полей через запятую)),
Пример:
CREATE TABLE student
( id serial,
name varchar(20) NOT NULL UNIQUE,
mark numeric(1) CHECK (mark >= 3 AND mark <=5) DEFAULT 3,
code integer,
PRIMARY KEY (id),
FOREIGN KEY (code) REFERENCES student_group (group_code)
);
Замечание:
Задание первичного и внешнего ключа выполняется только на уровне таблицы, если они состоят из 2 и более полей.
Каскадное удаление и каскадное обновление при определении внешнего ключа:
ON DELETE CASCADE – задание каскадного удаления.
ON DELETE RESTRICT (ON DELETE NO ACTION) – запрет удаления, если есть хоть одна строка, ссылающаяся на удаляемую строку (применяется по умолчанию).
ON DELETE SET NULL – присваивание атрибутам внешнего ключа значения NULL.
ON DELETE SET DEFAULT – присваивание атрибутам внешнего ключа значения по умолчанию.
ON UPDATE CASCADE – задание каскадного обновления.
ON UPDATE RESTRICT – аналогично.
ON UPDATE SET NULL – аналогично.
ON UPDATE SET DEFAULT – аналогично.
DROP TABLE имя_таблицы; – удаление таблицы, если нет зависимых объектов.
DROP TABLE имя_таблицы CASCADE; – удаление таблицы вместе с зависимыми объектами.
DROP TABLE IF EXISTS имя_таблицы CASCADE; – удаление таблицы, если она существует.
Вставка новых строк в таблицу
INSERT INTO имя_таблицы [(имя_поля, имя_поля, …)]
VALUES (значение_поля, значение_поля, ……);
Замечания:
Поля таблицы можно указывать не в том порядке, в котором они были указаны при создании таблицы.
Список полей не является обязательным. Если список полей не приведен, то в предложении VALUES значения полей должны перечисляться в соответствии с порядком полей, заданным при определении таблицы.
Для значений полей символьного типа и даты/времени обязательны одинарные кавычки. Для числовых полей кавычки не нужны.
В одной команде INSERT можно добавить несколько строк.
Данные будут введены, если не будут нарушены никакие ограничения целостности.
Пример:
CREATE TABLE student
( id serial PRIMARY KEY,
name varchar(20) NOT NULL UNIQUE,
mark numeric(1) CHECK (mark >= 3 AND mark <=5) DEFAULT 3,
code integer REFERENCES student_group (group_code)
);
INSERT INTO student (name, code, mark)
VALUES (‘Иванов А.А.’, 1, 5),
(‘Петров П.П.’, 2, 4);
В одной команде INSERT INTO могут быть только строки с одинаковой схемой (с одинаковым перечислением полей).
Если какие-то строки вводятся с другой схемой, например, с использованием значения по умолчанию DEFAULT, то их надо вводить с помощью отдельной команды INSERT INTO.
Обновление данных в таблице
UPDATE имя_таблицы
SET имя_поля1 = значение_поля1,
имя_поля2 = значение_поля2,
………………………..
WHERE условие; -- Условие ограничивает диапазон обновляемых строк
Удаление строк из таблицы
DELETE FROM имя_таблицы
WHERE условие; -- Условие ограничивает диапазон удаляемых строк
Замечание:
Если в таблице student указано ON DELETE CASCADE для внешнего ключа, то запись из таблицы student_group будет удалена, а также удалены все записи из таблицы student, связанные с удаляемой записью.
Если в таблице student указано ON DELETE RESTRICT для внешнего ключа и в ней есть хотя бы одна запись, связанная с удаляемой записью в student_group, удаления из student_group не произойдет.
