
- •Введение в sql
- •1. Введение в реляционную базу данных
- •2.Sql: Обзор
- •3. Использования sql для извлечения информации из таблиц
- •4. Использование реляционный и булевых операторов для создания более изощренных предикатов
- •5. Использование специальных операторов в условиях
- •6. Обобщение данных с помощью агрегатных функций
- •7. Формирование выводов запросов
- •8. Запрашивание многочисленных таблиц также как одной
- •9. Объединение таблицы с собой
- •10. Вставка одного запроса внутрь другого
- •11. Соотнесенные подзапросы
- •12. Использование оператора exists
- •13. Использование операторов any, all, и some
- •14. Использование предложения union
- •15. Ввод, удаление и изменение значений полей
- •16. Использование подзапросов с коммандами модификации
- •17. Создание таблиц
- •19. Поддержка целостности ваших данных
- •20. Введение: Представления
- •21. Изменение значей с помощью представлений
- •22. Кто что может делать в базе данных
- •Глава 23 продолжит обсуждение о выводах в sql, таких как сохранение
- •23. Глобальные аспекты sql
- •24. Как данные sql содержатся в упорядоченом виде
- •25. Использование sql с другим языком (вложенный sql)
- •Глава 1
- •Глава 2
- •Глава 3
- •Глава 4
- •Глава 5
- •Глава 6
- •Глава 7
- •Глава 8
- •Глава 9
- •Глава 10
- •Глава 11
- •Глава 12
- •Глава 13
- •Глава 14
- •Глава 15
- •Глава 16
- •Глава 17
- •Глава 18
- •Глава 19
- •Глава 20
- •Глава 21
- •Глава 22
- •Глава 23
- •Глава 24
- •Глава 25
- •Приложение b Тиры данных в sql
- •Приложение c Некоторые общие нестандартные средства sql
- •Intersect и minus
- •Приложение d Синтаксис и команда ссылки
Intersect и minus
Команда UNION, как вы уже видели в Главе 14, может объединить два
запроса, обьединив их вывод в один. Два других обычно имеющихся спосо-
ба объединения отдельных запросов - это INTERSECT(Плюс) и MINUS(Ми-
нус). INTERSECT выводит только строки произведенные обоими перекресны-
ми запросами, в то время как MINUS выводит строки которые производятся
одним запросом, но не другим. Следовательно, следующие два запроса
SELECT *
FROM Salespeople
WHERE city = 'London'
INTERSECT
SELECT *
FROM Salespeople
WHERE 'London' IN
(SELECT city
FROM Customers
WHERE Customers.snum =
Salespeople.snum);
выведут строки произведенные обоими запросами, производящими всех про-
давцов в Лондоне которые имели по крайней мере одного заказчика разме-
щенного там также. С другой стороны, запрос
SELECT *
FROM Salespeople
WHERE city = 'London'
MINUS
SELECT *
FROM Salespeople
WHERE 'London' IN
(SELECT sity
FROM Customers
WHERE Customers.snum =
Salespeople.snum);
удалит строки выбранные вторым запросом из вывода первого, и таким об-
разом будут выводены все продавцы в Лондоне которые не имели там за-
казчиков. MINUS иногда еще называют DIFFERENCE (ОТЛИЧИЕ)
Автоматические внешние объединения
В Главе 14, мы обсуждали внешнее обьединение и показывали вам как
выполнять его используя команду UNION. Некоторые программы базы данных
имеют более непосредственный способ выполнения внешних обьединений. В
некоторых реализациях, вводимый знак " + " после предиката, может вы-
водить строки которые удовлетворяют условию также как и строки которые
ему не удовлетворяют. В условии предиката может содержаться поле сов-
падающее для обеих таблиц, и NULL значения будут вставлены там, где
такого совпадения не будет найдено. Например, предположим вы хотите
видеть ваших продавцов и соответствующих им заказчиков, не исключая
тех продавцов которым не назначено ни одного заказчика ( хотя такого
нет в наших типовых таблицах, но в действительности это возможно ) :
SELECT a.snum, sname, cname
FROM Salespeople a, Customers b
WHEREa.snum = b.snum(+);
Это является эквивалентом следующего объединения (UNION):
SELECT a.snum, sname, cname
FROM Salespeople a, Customers b
WHERE a.snum = b.snum
UNION
SELECT snum, sname, '_ _ _ _ _ _ _ _ _ _'
FROM Salespeople
WHERE snum NOT IN
(SELECT snum
FROM Customers);
Мы считаем что подчеркивания будут отображены NULL значениями( см. ко-
манду FORMAT ранее в этом приложении где описывалось отображение NULL
значениями).
Отслеживание действий
Ваша SQL реализация - достаточна хороша, если она доступна многим
пользователями, чтобы обеспечивать для них некий способ слежения за
действиями выполняемыми в базе данных. Имеются две основные формы что-
бы делать это:
Journaling(Протоколирование) и Auditing(Ревизия).
Эти формы отличаются по назначению. Journaling, пименяется с целью
защиты ваших данных, при разрушении вашей системы. Сначала Вы исполь-
зуете реализационно-зависимую процедуру чтобы архивировать текущее со-
держание вашей базы данных, поэтому копия ее содержания где-нибудь бу-
дет сохранена. Затем вы просматриваете протокол изменений сделанных в
базе данных. Он сохраняется в некоторой области памяти, но не в глав-
ной памяти базы данных а желательно на отдельном устройстве, и содер-
жит список всех команд которые произвели изменения в структуре или в
содержании базы данных. Если у вас вдруг появились проблемы и текущее
содержание вашей базы данных оказалось нарушенным, вы можете повторно
выполнить все изменения зарегистрированные в протоколе на резервной
копии вашей базы данных, и снова привести вашу базу данных в состояние
которое было до момента последней записи в протокол. Типичной командой
чтобы начать протоколирование, будет следующяя:
SET JOURNAL ON;
Auditing используется c целью защиты. Она следит за тем, кто и какие
действия выполнял в базе данных, и сохраняет эту информацию в таблице
доступной только очень немногим высоко привилегированным пользовате-
лям. Конечно, вы редко будете прибегать к процедуре ревизии, потому
что очень скоро она займет много памяти и вам будет сложно работать в
вашей базе данных. Но вы можете устанавливать ревизию для определенных
пользователей, определенных действий или определенных объектов данных.
Имеется такая форма команды AUDIT:
AUDIT INSERT ON Salespeople BY Diane;
Или предложение ON или предложение BY могут быть исключены, устанав-
ливая ревизию, либо всех объектов или всех пользователей, соответс-
твенно. Применвние AUDIT ALL, вместо AUDIT INSERT, приведет к отслежи-
ванию всех действий Diane в таблице Продавцов.