
- •1. Выборка данных из одной реляционной таблицы (агрегирование данных без использования подзапросов, но с использованием фраз group by и having).
- •Imia||''||count(imia)
- •2. Выборка данных из реляционной таблицы, соединенной со своей копией (своими копиями)
- •3. Выборка из одной реляционной таблицы с использованием для отбора данных простого подзапроса по другой таблице (другим таблицам).
- •4. Выборка из одной реляционной таблицы с использованием для отбора данных коррелированного подзапроса по другой таблице (другим таблицам).
- •5. Выборка из одной реляционной таблицы с использованием для отбора данных коррелированного подзапроса по той же таблице.
- •6. Выборка данных из реляционных таблиц с использованием вложенных подзапросов.
- •7. Использование объединения (union) при выборке данных из реляционных таблиц.
- •8. Использование квантора exists во вложенных подзапросах при выборке данных из реляционных таблиц.
- •9. Предложения модификации данных (delete, insert и update).
- •10. Создание реляционных таблиц (с использованием фраз для поддержания целостности данных).
- •11. Базовые триггеры (назначение, структура, процедура создания).
- •Альтернативное описание:
- •12. Представления (назначение, процедуры создания и обновления).
CREATE OR REPLACE TRIGGER НОВЫЕ_ЛЮДИ
BEFORE INSERT ON ЛЮДИ
FOR EACH ROW
BEGIN
SELECT SEQ_ЛЮДИ.NEXTVAL INTO :new.ИД_человек FROM DUAL;
END;
/
CREATE OR REPLACE TRIGGER s BEFORE INSERT OR UPDATE ON Группы FOR EACH ROW
DECLARE
i integer;
failed exception;
BEGIN
SELECT count(сотрудники.категория) INTO i FROM Сотрудники where ид_сотрудник = :new.ид_сотрудник and категория = :new.категория;
IF i = 0 THEN RAISE failed; END IF;
EXCEPTION
WHEN failed THEN RAISE_APPLICATION_ERROR(-20030, 'Категория группы не совпадает с категорией преподавателя');
END s;
Альтернативное описание:
|
BEFORE / AFTER / INSTEAD OF- определяет время активизации триггера.
INSERT/ DELETE / UPDATE - условие активизации, для UPDATE триггер может запускаться при обновлении только заданных столбцов.
ON определяет имя базовой таблицы (не представления!), для которой создается триггер.
REFERENCING - определяет коррелированные имена, по которым действие триггера может обращаться к столбцам изменяемых строк (промежуточным переменным) и к изменяемой таблице:
OLD - имя, представляющее изменяемую строку до изменения (по умолчанию - old);
NEW - имя, представляющее изменяемую строку до изменения (по умолчанию - new);
OLD_TABLE - имя, представляющее изменяемую таблицу до изменения;
NEW_TABLE - имя, представляющее изменяемую таблицу до изменения;
FOR EACH ROW / STATEMENT - область действия триггера.
WHEN - определяет условие, при котором выполняются последующие операторы.
Действия триггера могут включать в себя следующие SQL-операторы:
для BEFORE-триггера: SELECT, SET, SIGNAL;
для AFTER-триггера: SELECT, SET, SIGNAL, INSERT, DELETE, UPDATE.
Триггер, выполняемый после (AFTER) выполнения оператора, модифицирующего некоторую таблицу, не может содержать операторы выборки (SELECT) из этой таблицы.
12. Представления (назначение, процедуры создания и обновления).
Представление - это виртуальная таблица, которая сама по себе не существует, но для пользователя выглядит таким образом, как будто она существует. Представление определяется перечнем тех столбцов таблиц и признаками тех их строк, которые хотелось бы в ней увидеть. Представление не поддерживается его собственными физическими хранимыми данными. Вместо этого в каталоге таблиц хранится определение, оговаривающее, из каких столбцов и строк других таблиц оно должно быть сформировано при реализации SQL-предложения на получение данных из представления или на модификацию таких данных.
В каталоге БД представление сохраняется в виде того запроса, который его определяет. При трансляции запроса, содержащего обращение к представлению, SQL-машина подставляет вместо него обращение к базовой таблице/таблицам и добавляет те условия, которые определяют представление.
Представления используются для:
обеспечения дополнительного уровня защиты основной таблицы: от определенных пользователей могут быть скрыты некоторые данные, невидимые через предложенное им представление;
скрытия сложности данных, например, за счет размещения в одном представлении данных из нескольких таблиц и других представлений;
создания различного видения одних и тех же данных, возможно в одно и то же время, различными категориями пользователей; это особенно ценно при работе различных категорий пользователей с единой интегрированной базой данных: пользователям предоставляют только интересующие их данные в наиболее удобной для них форме (окно в таблицу или в любое соединение любых таблиц);
обеспечения независимости прикладных программ от изменения логической структуры базы данных (например, при необходимости расщепления какой-либо таблицы на несколько новых таблиц можно создать по ним представление, дав ему имя расщепленной таблицы).
К недостаткам представлений можно отнести:
серьезные ограничения по модификации данных через представления;
отсутствие возможности построения индексов по столбцам представления, что может снизить производительность приложений, использующих представления вместо базовых таблиц.
Синтаксис предложения CREATE VIEW имеет вид
CREATE VIEW имя_представления
[(столбец[,столбец] ...)]
AS подзапрос
[WITH CHECK OPTION];
где подзапрос, следующий за AS и являющийся определением данного представления, не исполняется, а просто сохраняется в каталоге;
необязательная фраза "WITH CHECK OPTION" (с проверкой) указывает, что для операций INSERT и UPDATE над этим представлением должна осуществляться проверка, обеспечивающая удовлетворение WHERE фразы подзапроса;
список имен столбцов должен быть обязательно определен лишь в тех случаях, когда:
а) хотя бы один из столбцов подзапроса не имеет имени (создается с помощью выражения, SQL-функции или константы);
б) два или более столбцов подзапроса имеют одно и то же имя;
если же список отсутствует, то представление наследует имена столбцов из подзапроса.
Например, создадим представление Мясные_блюда
CREATE VIEW Мясные_блюда
AS SELECT БЛ, Блюдо, В, Выход
FROM Блюда
WHERE Основа = 'Мясо';
которое может рассматриваться пользователем как новая таблица в базе данных.
Операции DELETE, INSERT и UPDATE могут оперировать не только базовыми таблицами, но и представлениями. Однако, если из базовых таблиц можно удалять любые строки, обновлять значения любых их столбцов и вводить в такие таблицы новые строки, то этого нельзя сказать о представлениях, не все из которых являются обновляемыми.
Безусловно обновляемыми являются представления, полученные из единственной базовой таблицы простым исключением некоторых ее строк и (или) столбцов, обычно называемые "представление-подмножество строк и столбцов". Таким является представление Мясные_блюда, полученное из базовой таблицы Блюда исключением из нее столбца Труд и строк, не содержащих значение 'Мясо' в столбце Основа. Работая с ним, можно:
вставить (операция INSERT) новую строку, например, строку (34, 'Шашлык', 'Г', 150), фактически вставляя соответствующую строку (34, 'Шашлык', 'Г', 150, NULL) в лежащую в основе базовую таблицу Блюда;
удалить (операция DELETE) существующую строку из представления, например строку (13, 'Бастурма', 'Г', 300), фактически удаляя соответствующую строку (13, 'Бастурма', 'Г', 300, 5) из таблицы Блюда;
обновить (операция UPDATE) какое-либо поле в существующей строке, например увеличить массу порции Бефстроганова с 210 до 250 граммов, фактически осуществляя то же самое изменение в соответствующем поле таблицы Блюда.
Как было указано выше, к теоретически обновляемым представлениям относятся представления-подмножества строк и столбцов. Однако существуют некоторые представления, которые не являются представлениями-подмножествами строк и столбцов, но также теоретически обновляемы. Хотя известно, что такие есть и можно привести их примеры, но невозможно дать их формального определения. Неверным является такое формальное определение некоторых авторов - "нельзя обновлять соединение". Во-первых, в некоторых соединениях с успехом выполняется операция UPDATE, а, во-вторых не обновляемы и некоторые представления, не являющиеся соединениями (например, где есть сумма столбцов). Кроме того, не все СУБД поддерживают обновление любых теоретически обновляемых представлений. Поэтому пользователь должен сам оценивать возможность использования операций DELETE, INSERT или UPDATE в созданном им представлении.
Альтернативное описание:
CREATE [OR REPLACE] [ FORCE | !!under!!NOFORCE ] VIEW [schema.]view
[(alias [,alias]...)] AS subquery
[ WITH READ ONLY | WITH CHECK OPTION [CONSTRAINT constraint] ] ;
где
OR REPLACE — используется для перезаписи существующего представления (иначе перед созданием новой версии представления надо уничтожить его старую версию с помощью команды DROP VIEV);
FORCE — служит для создания текста представления по пока несуществующим или недоступным для данного пользователя таблицам; перед работой с таким представлением необходимо создать указанные в subquery таблицы и (или) получить права на их использование;
NOFORCE — служит для создания представления из существующих таблиц, на использование которых имеются необходимые привилегии доступа (устанавливается по умолчанию);
schema — необязательный параметр, идентифицирующий схему, в которой должно быть создано представление (по умолчанию - схема пользователя);
view — имя представления (строится по тем же правилам, что и для таблицы); выбираются данные;
(alias [,alias]...) — имена столбцов представления, в которые будут записаны значения из выражений (столбцов) подзапроса (subquery); если этот перечень отсутствует, то столбцам представления будут присвоены имена столбцов (выражений или псевдонимов) из подзапроса;
AS subquery — определение подзапроса, генерирующего данные в представление при указании имени этого представления в тексте какого-либо запроса или родительского подзапроса;
WITH READ ONLY — запрещает модификацию представления и, следовательно, тех таблиц, на базе которых создано данное представление;
WITH CHECK OPTION — запрещает модифицировать строки, которые затем не смогут быть выбраны посредством данного представления (т.е. такие строки, которые не удовлетворяют условию фразы WHERE спецификации запроса);
constraint — имя ограничения вида CHECK.
Создать представление со списком обучающихся в данный момент контрактных студентов групп 350 - 355, содержащий номер группы, номер студента, номер его зачетной книжки, фамилию, имя и отчество:
CREATE OR REPLACE Контр_групп_350_355 AS
SELECT Группа, s.Номер, НЗК, Фамилия, Имя, Отчество
FROM Студенты s, Ученик u, Контр_студ k
WHERE s. Номер = u. Номер AND s. Номер = k. Номер AND Признак = 'обучен'
AND SYSDATE BETWEEN u.Начало AND u.Конец AND Группа BETWEEN 350 AND 355;
Так как подзапрос, используемый для описания представления, не может содержат фразы ORDER BY, то упорядочение выводимых данных придется осуществлять в запросе на получение данных из представления.
Используя представление Контр_групп_350_355 получить список контрактных студентов групп 350 и 353, упорядоченный по номеру группы и фамилии:
SELECT * FROM Контр_групп_350_355
WHERE Группа IN (350, 353)
ORDER BY Группа, Фамилия ;
Дополнительная информация:
По стандарту SQL/92 представления являются изменяемыми, если:
в списке выборки не указано ключевое слово DISTINCT;
каждое арифметическое выражение в списке выборки представляет собой одну спецификацию столбца, и спецификация одного столбца не появляется более одного раза;
в разделе FROM указана только одна таблица, являющаяся либо базовой таблицей, либо изменяемой представляемой таблицей;
в условии выборки раздела WHERE не используются подзапросы;
в табличном выражении отсутствуют разделы GROUP BY и HAVING.
Таблица Oracle является key-preserved, если ключ таблицы может также являться и ключом представления. В простейшем случае - если первичный ключ или уникальное поле входит в представление. Свойство key-preserved не зависит от конкретной конфигурации данных, а только от определений ограничений целостности в соединяемых таблицах.