Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

metoda_2013

.pdf
Скачиваний:
54
Добавлен:
03.05.2015
Размер:
6.36 Mб
Скачать

БАЗЫ ДАННЫХ.

Внутренние и внешние соединения.

Во фразе FROM можно использовать следующие операторы соединений:

CROSS JOIN - перекрестное соединение.

NATURAL JOIN - естественное соединение. Стандарт SQL определяет это соединение как результат объединения таблиц по всем одноименным столбцам. Естественное соединение может быть следующих типов:

INNER JOIN - внутреннее соединение, используется по умолчанию.

LEFT JOIN [OUTER] - левое внешнее соединение.

RIGHT JOIN [OUTER] - правое внешнее соединение.

FULL JOIN [OUTER] - полное внешнее соединение.

UNION JOIN - соединение объединения.

При внутреннем естественном соединении группируются только те строки, значения которых по соединяемым (одноименным) столбцам совпадают, т.е. которые соответствуют условию, указанному после ключевого слова ON.

При внешнем левом соединении в результирующий набор будут выбраны все строки из левой таблицы (указываемой первой). При совпадении значений по соединяемым (одноименным) столбцам значения второй таблицы заносятся в результирующий набор в соответствующие строки. При отсутствии совпадений в качестве значений второй таблицы проставляется значение NULL.

При внешнем правом соединении в результирующий набор будут выбраны все строки из правой таблицы (указываемой второй). При совпадении значений по соединяемым (одноименным) столбцам значения первой таблицы заносятся в результирующий набор в соответствующие строки. При отсутствии совпадений в качестве значений первой таблицы проставляется значение NULL.

При полном внешнем соединении в результирующий набор будут выбраны все строки - как из правой, так и из левой таблицы. При совпадении значений по соединяемым (одноименным) столбцам строка содержит значения как из левой, так и из правой таблицы. В противном случае, вместо отсутствующих значений в столбцы таблицы (левой или правой) заносится значение NULL.

50

БАЗЫ ДАННЫХ.

Фраза USING позволяет выполнить естественное соединение по указываемым столбцам, что, в свою очередь, позволяет соединять таблицы, имеющие несколько одноименных столбцов, нужным образом (по одному или двум столбцам). Список столбцов, по которым выполняется соединение, указывается после фразы USING.

Например:

SELECT t1.f1, t1.f2, t2.f1 FROM tbl1 t1 JOIN tbl2 t2 USING f2;

Естественное соединение по указываемому предикату выполняется с помощью фразы ON. В результирующий набор выбираются строки, удовлетворяющие заданному условию. Этот способ соединения аналогичен соединению по предикату, указываемому фразой WHERE.

Например: SELECT t1.f1, t1.f2, t2.f1, t2.f2 FROM tbl1 t1 JOIN tbl2 t2 ON t1.f1= t2.f2;

Для наглядности приведем две таблици driver(id, ФИО водителя и айдишник закрепленным за ним автомобилем) и avto(id машины, марка)

Внутреннее естественное соединение(INNER JOIN) Выведем список водителей с закрепленными за ними авто.

SELECT d.name, a.marka FROM driver d INNER JOIN avto a ON d.id_avto = a.id

Внешнее левое соединение(LEFT OUTER JOIN)

Получим данные по всем водителям, будут все люди работающие в фирме с автомобилями и без

SELECT d.name, a.marka FROM driver d LEFT OUTER JOIN avto a ON d.id_avto = a.id

Если нам нужно посмотреть водителей без авто можно воспользоваться запросом типа

SELECT d.name, a.marka FROM driver d LEFT OUTER JOIN avto a ON d.id_avto = a.id WHERE a.marka IS null

Внешнее правое соединение(RIGHT OUTER JOIN) Необходимы данные по всем машинам находящихся в парке

для списка на техосмотр и в случае проблемы данные водителя чтобы к нему обратиться. У авто которая простаивает без водителя поле водитель будет NULL.

SELECT d.name, a.marka FROM driver d RIGHT OUTER JOIN avto a ON d.id_avto = a.id

Полное внешнее соединение(FULL (OUTER))

51

БАЗЫ ДАННЫХ.

Необходимо вывести весь штат техники и водителей в одном отчете.

SELECT d.name, a.marka FROM driver d full OUTER JOIN avto a ON d.id_avto = a.id

Вывести свободные авто и незанятых водителей например:

SELECT d.name, a.marka FROM driver d full OUTER JOIN avto a ON d.id_avto = a.id WHERE d.id_avto IS null OR a.id IS null

Перекрестное соединение(CROSS JOIN) Необходимо составить все возможные варианты

объединения двух множеств, в нашем примере увидеть у кого имя сочетается с маркой машины:

SELECT d.name, a.marka FROM driver d cross join avto a

Естественное соединение (NATURAL JOIN)

SELECT d.name, a.marka FROM driver d NATURAL JOIN avto a

объединение произошло по полю id и id_avto

Соединение объединения (UNION JOIN)

Получить автомобили без водителей и водителей без авто

SELECT * FROM driver d UNION JOIN avto a ON d.id_avto =

a.id

6. Псевдонимы. Внешнее соединение таблиц в SQL.

См. пункт 5. "Многотабличные запросы SQL. Внутренние соединения".

7. Запросы с группировкой и вложенные запросы в SQL.

Группировка данных в операторе SELECT осуществляется с помощью ключевых слов GROUP BY и HAVING.

GROUP BY неразрывно связано с агрегирующими функциями, без них оно практически не используется. GROUP BY разделяет таблицу на группы, а агрегирующая функция вычисляет для каждой из них итоговое значение.

Пример. Определить количество книг каждого издательства:

SELECT publishers.publisher, count(titles.title)

FROM titles,publishers WHERE titles.pub_id=publishers.pub_id GROUP BY publisher;

Kлючевое слово HAVING работает следующим образом: сначала GROUP BY разбивает строки на группы, затем на полученные наборы накладываются условия HAVING.

Пример. Устранить из предыдущего запроса те издательства, которые имеют только одну книгу:

SELECT publishers.publisher, count(titles.title) FROM titles,publishers

52

БАЗЫ ДАННЫХ.

WHERE titles.pub_id=publishers.pub_id GROUP BY publisher HAVING COUNT(*)>1;

Вложенные запросы.

Вложенный подзапрос - это подзапрос, заключенный в круглые скобки и вложенный в WHERE (HAVING) фразу предложения SELECT или других предложений, использующих WHERE фразу. Вложенный подзапрос может содержать в своей WHERE (HAVING) фразе другой вложенный подзапрос и т.д. Вложенный подзапрос создан для того, чтобы при отборе строк таблицы, сформированной основным запросом, можно было использовать данные из других таблиц (например, при отборе блюд для меню использовать данные о наличии продуктов в кладовой пансионата).

Существуют простые и коррелированные вложенные подзапросы. Они включаются в WHERE (HAVING) фразу с помощью условий IN, EXISTS или одного из условий сравнения (

= | <> | < | <= | > | >= ).

Простые вложенные подзапросы обрабатываютя системой "снизу вверх". Первым обрабатывается вложенный подзапрос самого нижнего уровня. Множество значений, полученное в результате его выполнения, используется при реализации подзапроса более высокого уровня и т.д.

Пример. Выдать название и статус поставщиков продукта с номером 11:

SELECT Название, Статус FROM Поставщики WHERE ПС IN

(SELECT ПС FROM Поставки WHERE ПР = 11);

Результат:

Название Статус

СЫТНЫЙ рынок УРОЖАЙ коопторг

Запросы с коррелированными вложенными подзапросами обрабатываются системой в обратном порядке. Сначала выбирается первая строка рабочей таблицы, сформированной основным запросом, и из нее выбираются значения тех столбцов, которые используются во вложенном подзапросе (вложенных подзапросах). Если эти значения удовлетворяют условиям вложенного подзапроса, то выбранная строка включается в результат. Затем выбирается вторая строка и т.д., пока в результат не будут включены все строки, удовлетворяющие вложенному подзапросу (последовательности вложенных подзапросов).

53

БАЗЫ ДАННЫХ.

8. Целостность данных. Транзакции.

Термин “целостность данных” относится к правильности и полноте информации, содержащейся в БД. Вероятно, корректнее говорить о непротиворечивости данных, поскольку невозможно предотвратить появление неверных данных. При изменении содержимого БД с помощью операторов INSERT, DELETE, UPDATE может произойти нарушение целостности данных. Например, могут возникнуть следующие ситуации:

в базу внесены заведомо неправильные данные (отрицательная цена товара);

данные оказались несогласованными (заказ билета на несуществующий рейс);

внесенные изменения потеряны из-за системной ошибки или сбоя в электропитании;

изменения внесены частично (учтена выручка от продажи товара, но количество товара на складе не уменьшено);

изменена нумерация домов на улице, но остались старые

адреса жильцов.

Одной из важнейших задач реляционной СУБД является поддержка целостности данных.

Для обеспечения непротиворечивости данных в реляционных СУБД определяются условия целостности данных.

Виды условий целостности данных.

1.Обязательность данных. Некоторые столбцы должны содержать значения в каждой строке, то есть иметь NULLзначения и не оставаться незаполненными. Например, для каждой поставки должен быть указан поставщик. Условие обязательности данных задается в операторе создания таблицы CREATE TABLE.

2.Проверка на правильность. Можно, например, указать СУБД, что значения поля должны находиться в определенном диапазоне. Это условие также задается в операторе CREATE TABLE.

3.Целостность таблицы. Первичный ключ таблицы должен в каждой строке иметь уникальное значение. Свойство уникальности может быть задано и для других полей. Условие задается в операторе CREATE TABLE.

4.Ссылочная целостность. Каждая строка таблицы-

потомка с помощью внешнего ключа связана со строкой таблицы-предка, содержащей первичный ключ, значение которого равно значению внешнего ключа.

5.Деловые правила. Изменение информации может быть ограничено деловыми правилами, учитывающими

54

БАЗЫ ДАННЫХ.

специфику БД. Например, компания может установить правило, запрещающее принимать заказ на товар, если его недостаточно на складе. Деловые правила могут быть реализованы с помощью триггеров, которые будут описаны ниже.

6.Непротиворечивость. Многие операции в БД вызывают несколько изменений одновременно. Например, регистрация продажи товара может потребовать обновления таких полей разных таблиц, как общий доход, количество товара на складе, объем продаж определенного продавца и т. п. Если эти изменения выполнены не в полном объеме, целостность данных нарушается. Условия непротиворечивости данных обеспечивает механизм транзакций.

Существует четыре типа изменений БД, которые могут нарушить ссылочную целостность отношений предок-потомок.

1.Добавление новой строки-потомка. Значение внешнего ключа строки-потомка должно быть одним из значений первичного ключа в таблицепредке.

2.Обновление внешнего ключа в строке-потомке. Новое значение внешнего ключа строки-потомка должно быть одним из значений первичного ключа в таблице-предке.

3.Удаление строки-предка. Если из таблицы предка будет удалена строка, у которой есть хотя бы один строкипотомки, то значения внешних ключей в этих строках не будут равны ни одному из значений первичного ключа в таблице-предке.

4.Обновление первичного ключа в строке-предке - все аналогично предыдущему случаю.

Первые две ситуации приводят к сообщению об ошибке. Для двух последних ситуаций в операторе CREATE TABLE можно задать одно из четырех возможных правил

1.RESTRICT – запрещает удаление строки из таблицыпредка или корректировку первичного ключа, если строка имеет потомков.

2.CASCADE – при удалении строки-предка все строкипотомки также удаляются из таблицы-потомка. При обновлении первичного ключа в строке-предке значение внешнего ключа обновляется во всех строках-потомках.

3.SET NULL – при удалении или корректировке первичного ключа строки-предка внешним ключам во всех строках-

потомках присваивается NULL-значение.

55

БАЗЫ ДАННЫХ.

4.SET DEFAULT - при удалении или корректировке первичного ключа строки-предка внешним ключам во всех строках-потомках присваивается значение по умолчании.

Правила удаления и обновления могут быть разными для одной и той же пары таблицы-предка и таблицы потомка. Пусть, например, в таблице предке содержится информация о читателях библиотеки, а в таблице потомке – данные о взятых ими книгах. При выписке читателя нельзя забывать о книгах на его руках, поэтому для удаления разумно определить правило RESTRICT. При смене номера читательского билета, являющегося первичным ключом в таблице читателей, можно автоматически поменять этот номер в таблице выдач, то есть определить правило на обновление CASCADE.

Каскадные удаления и обновления могут приводить к непредвиденным последствиям. Рассмотрим, например три таблицы A - животные, B – девочки и C – мальчики с одинаковыми полями Name и Likes (любит). Будем считать, что животные любят мальчиков, мальчики – девочек, а девочки – животных. Таким образом, каждая из таблиц является как родительской, так и дочерней. Таблица A является родительской для B и дочерней для C, а B – родительской для C и дочерней для A.

Пусть таблицы имеют следующее содержание.

Записи таблицы A

 

Записи таблицы B

 

Записи таблицы C

 

Name

Likes

 

 

Name

Likes

 

 

Name

Likes

 

 

Джек

Леша

 

 

Таня

Джек

 

 

Петя

Г ля

 

 

Мурка

Петя

 

 

Галя

Хрюша

 

 

Леша

Лена

 

 

Хрюша

Толя

 

 

Лена

Мурка

 

 

Толя

Таня

 

 

 

 

 

 

 

 

 

 

Стас

Галя

 

Предположим, что все правила удаления CASCADE. Удалим запись с данными о Пете из таблицы C. Тогда из таблицы A каскадно удалится запись с информацией о Мурке, потом не останется Лены в таблице B и т. д. Легко проследить, что в итоге произойдет полное удаление содержимого всех таблиц.

Часть внешнего ключа может иметь значения NULL. По стандарту SQL92 в операторе CREATE TABLE можно указать один из двух режимов

MATCH FULL (полное совпадение) – ни одна часть внешнего ключа не может иметь значение NULL;

56

БАЗЫ ДАННЫХ.

MATCH PARTIAL (частичное совпадение) – часть

внешнего ключа может принимать значение NULL.

Транзакции.

Под транзакцией понимается неделимая с точки зрения воздействия на БД последовательность операторов манипулирования данными (чтения, удаления, вставки, модификации) такая, что либо результаты всех операторов, входящих в транзакцию, отображаются в БД, либо воздействие всех этих операторов полностью отсутствует. Лозунг транзакции - "Все или ничего": при завершении транзакции оператором COMMIT результаты гарантированно фиксируются во внешней памяти (смысл слова commit - "зафиксировать" результаты транзакции); при завершении транзакции оператором ROLLBACK результаты гарантированно отсутствуют во внешней памяти (смысл слова rollback - ликвидировать результаты транзакции).

Понятие транзакции имеет непосредственную связь с понятием целостности БД. Очень часто БД может обладать такими ограничениями целостности, которые просто невозможно не нарушить, выполняя только один оператор изменения БД.

Поэтому для поддержания подобных ограничений целостности допускается их нарушение внутри транзакции с тем условием, чтобы к моменту завершения транзакции условия целостности были соблюдены.

Различаются два вида ограничений целостности:

немедленно проверяемые;

откладываемые.

Кнемедленно проверяемым ограничениям целостности относятся такие ограничения, проверку которых бессмысленно или даже невозможно откладывать. К таким ограничениям относятся ограничения домена (пример: возраст сотрудника не может превышать 150 лет). Немедленно проверяемые ограничения целостности соответствуют уровню отдельных операторов языкового уровня СУБД. При их нарушениях не производится откат транзакции, а лишь отвергается соответствующий оператор.

Откладываемые ограничения целостности - это ограничения на базу данных, а не на какие-либо отдельные операции. По умолчанию такие ограничения проверяются при конце транзакции, и их нарушение вызывает автоматическую замену оператора COMMIT на оператор ROLLBACK. Однако в некоторых системах поддерживается специальный оператор насильственной проверки ограничений целостности внутри транзакции.

57

БАЗЫ ДАННЫХ.

Изолированность пользователей. В

многопользовательских системах с одной базой данных одновременно могут работать несколько пользователей или прикладных программ. Предельной задачей системы является обеспечение изолированности пользователей, т.е. создание достоверной и надежной иллюзии того, что каждый из пользователей работает с БД в одиночку.

В связи со свойством сохранения целостности БД транзакции являются подходящими единицами изолированности пользователей.

9. Представления и работа с ними. Триггеры и хранимые процедуры.

Механизм представлений (view) является мощным средством языка SQL, позволяющим скрыть реальную структуру БД от некоторых пользователей за счет определения представления БД, которое реально является некоторым хранимым в БД запросом с именованными столбцами, а для пользователя ничем не отличается от базовой таблицы БД (с учетом технических ограничений). Любая реализация должна гарантировать, что состояние представляемой таблицы точно соответствует состоянию базовых таблиц, на которых определено представление. Обычно вычисление представляемой таблицы (материализация соответствующего запроса) производится каждый раз при использовании представления.

В стандарте SQL/89 оператор определения представления имеет следующий синтаксис:

<view definition> ::=

CREATE VIEW <table name> [(<view column list>)] AS <query specification> [WITH CHECK OPTION]

<view column list> ::= <column name> [{,<column name>}...]

Определяемая представляемая таблица V является изменяемой (т.е. по отношению к V можно использовать операторы DELETE и UPDATE) в том и только в том случае, если выполняются следующие условия для спецификации запроса:

В списке выборки не указано ключевое слово DISTINCT;

Каждое арифметическое выражение в списке выборки представляет собой одну спецификацию столбца, и спецификация одного столбца не появляется более одного раза;

В разделе FROM указана только одна таблица, являющаяся либо базовой таблицей, либо изменяемой представляемой таблицей;

58

БАЗЫ ДАННЫХ.

В условии выборки раздела WHERE не используются подзапросы;

В табличном выражении отсутствуют разделы GROUP BY и

HAVING.

Если в списке выборки спецификации запроса имеется хотя бы одно арифметическое выражение, состоящее не из одной спецификации столбца, или если одно имя столбца участвует в списке выборки более одного раза, определение представления должно содержать список имен столбцов представляемой таблицы (т.е. нужно явно именовать столбцы представляемой таблицы, если эти имена не наследуются от столбцов таблиц раздела FROM спецификации запроса).

Хранимые процедуры - это процедуры и функции, хранящиеся непосредственно в базе данных в откомпилированном виде и которые могут запускаться пользователями или приложениями, работающими с базой данных. Хранимые процедуры обычно пишутся либо на специальном процедурном расширении языка SQL. Основное назначение хранимых процедур - реализация бизнес-процессов предметной области.

Хранимые процедуры позволяют повысить производительность, расширяют возможности программирования и поддерживают функции безопасности данных.

Вместо хранения часто используемого запроса, клиенты могут ссылаться на соответствующую хранимую процедуру. При вызове хранимой процедуры ее содержимое сразу же обрабатывается сервером.

Кроме собственно выполнения запроса, хранимые процедуры позволяют также производить вычисления и манипуляцию данными - изменение, удаление, выполнять DDLоператоры и вызывать другие хранимые процедуры, выполнять сложную транзакционную логику. Один-единственный оператор позволяет вызвать сложный сценарий, который содержится в хранимой процедуре, что позволяет избежать пересылки через сеть сотен команд и, в особенности, необходимости передачи больших объемов данных с клиента на сервер.

Триггеры - это хранимые процедуры, связанные с некоторыми событиями, происходящими во время работы базы данных. В качестве таких событий выступают операции вставки, обновления и удаления строк таблиц. Если в базе данных определен некоторый триггер, то он запускается автоматически

59

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