Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы на вопросы к экзамену.docx
Скачиваний:
3
Добавлен:
02.01.2025
Размер:
521.41 Кб
Скачать

Использование подчиненных запросов в 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 не произойдет.