Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Базы данных. Практический курс. В 2 частях. Ч.1. Объектно-реляционные базы данных на примере PostgreSQL 9.5. Учебное пособие.pdf
X
- •Введение
- •Контрольные вопросы
- •Создание базы данных
- •Создание таблиц
- •Создание последовательностей
- •Ввод данных
- •Оператор CREATE TABLE
- •Оператор ALTER TABLE
- •Операторы DROP TABLE и DROP
- •Создание индексов
- •Контрольные вопросы
- •Средства определения данных языка SQL
- •Средства запроса данных языка SQL
- •Чтение заданных столбцов из одиночной таблицы
- •Чтение заданных строк из одиночной таблицы
- •Чтение заданных строк и столбцов из одиночной таблицы
- •Сортировка результатов
- •Агрегатные функции и группировка
- •Оконные функции
- •Чтение данных из нескольких таблиц с применением вложенных запросов
- •Чтение данных из нескольких таблиц с помощью операции соединения
- •Объединения
- •Средства модификации данных языка SQL
- •Вставка данных, оператор INSERT
- •Изменение данных, оператор UPDATE
- •Удаление данных, оператор DELETE
- •Транзакции
- •SQL-представления
- •Использование представлений для скрытия столбцов и строк
- •Использование представлений для отображения вычисляемых столбцов
- •Использование представлений для скрытия сложного синтаксиса
- •SQL-запросы в прикладных программах
- •Хранимые процедуры
- •Триггеры
- •Использование триггеров для проверки допустимости вводимых данных
- •Триггер, обновляющий представление
- •Триггер, обеспечивающий ссылочную целостность
- •Модуль TABLEFUNC
- •Словарь метаданных
- •Контрольные вопросы
- •Функция ROW_NUMBER
- •Функция COALESCE
- •Числовые функции
- •Тригонометрические функции
- •Контрольные вопросы
- •Заключение
- •Библиографический список

Глава 3. Введение в язык SQL 3.2. Средства запроса данных языка SQL
3.2.11 Внешние соединения
При выполнении соединения возможна ситуация, когда могут быть потеряны данные. В частности, если строка имеет значение, которое не удовлетворяет условию, заданному в предложении
WHERE, эта строка не будет включена в результат соединения. Такая
потеря может быть нежелательной, и для предотвращения подобных ситуаций был введен специальный тип соединения – внешнее
соединение (outer join).
Если нужно построить соединение таким образом, чтобы в результаты вошли каждая строка таблицы слева от ключевого слова
JOIN, даже если для этой строки не имеется соответствия во второй
таблице, то необходимо использовать следующий синтаксис:
SELECT Name, Title
FROM ARTIST LEFT JOIN WORK
ON WORK.ArtistID = ARTIST.ArtistID;
Смысл этого оператора в том, что строки таблицы ARTIST соединяются со строками таблицы WORK, как и раньше, но теперь, если
какая-то строка в таблице слева от ключевого слова JOIN (здесь
это таблица ARTIST) не имеет соответствия в таблице, находящейся
справа, эта строка все равно будет включена в результат. Такое соединение называется левым внешним соединением (left outer join).
Для данных из табл. 2.2 и табл. 2.3 результат этого запроса будет
таким:
Name Title
Tobey Mystic Fabric
Miro Mi Vida
Tobey Slow Embers
Tobey Mystic Fabric
Chagall Northwest by Night
Moos
Matisse
Klee
Kandinsky
Для организации правого внешнего соединения (right outer
join) используется оператор RIGHT JOIN. Правое соединение функ-
61

3.2. Средства запроса данных языка SQL Глава 3. Введение в язык SQL
ционирует аналогично левому, однако в результат включаются все
строки таблицы, находящейся справа от ключевого слова JOIN.
Полное внешнее соединение (full outer join) – объединяет в
себе работу левого и правого соединения, возвращая все строки
из обеих таблиц вне зависимости от наличия соответствия между
столбцами. Для полного внешнего соединения используется оператор FULL JOIN.
3.2.12 Объединения
Иногда возникает ситуация, когда необходимо объединить результаты двух и более запросов в единую таблицу, состоящую из
схожих строк. При этом, в отличие от операции соединения, операция объединения связывает схожие по структуре отношения, присоединяя одну таблицу к другой снизу.
Для выполнения объединения все отношения, участвующие в
данном процессе, должны удовлетворять двум ограничениям:
1. Количество и порядок столбцов в объединяемых запросах
должны совпадать.
2. Типы данных в соответствующих столбцах должны быть совместимы.
Одним из возможных вариантов использования операции объединения является ситуация, когда для увеличения быстродействия в базе данных существует несколько идентичных по структуре таблиц, содержащих данные за различный период времени.
Для объединения отношений используется оператор UNION.
Рассмотрим следующий пример:
SELECT SalesPrice, AskingPrice
FROM TRANSACTION
WHERE WorkID = 301
UNION
SELECT SalesPrice, AskingPrice
FROM TRANSACTION
WHERE CustomerID = 203;
Данный запрос получает значения столбцов SalesPrice и
AskingPrice для произведения с идентификатором 301 и аналогич-
ные данные, но в отдельном запросе, для клиента с идентификатором 203. Результат выполнения запрос представлен в таблице:
62

Глава 3. Введение в язык SQL 3.3. Средства модификации данных языка SQL
SalesPrice AskingPrice
18500.00 20000.00
46700.00 47000.00
71500.00 72500.00
Для объединения отношений также можно использовать оператор UNION ALL. Основное отличие оператора UNION от оператора UNION ALL заключается в том, что первый оператор удаляет
дублирующиеся строки из результирующего отношения, а второй
оставляет:
SELECT SalesPrice, AskingPrice
FROM TRANSACTION
WHERE WorkID = 301
UNION ALL
SELECT SalesPrice, AskingPrice
FROM TRANSACTION
WHERE CustomerID = 203;
SalesPrice AskingPrice
18500.00 20000.00
46700.00 47000.00
18500.00 20000.00
71500.00 72500.00
3.3 Средства модификации данных языка SQL
Модификация данных подразумевает три возможных операции: вставка, изменение и удаление. В этом разделе показывается,
как выполняются эти операции средствами языка SQL.
3.3.1 Вставка данных, оператор INSERT
Для вставки данных в таблицы служит SQL-оператор INSERT.
Этот оператор имеет две формы, в зависимости от того, всем ли
столбцам таблицы присваиваются значения. Если указываются значения всех столбцов, то оператор имеет следующий вид:
INSERT INTO WORK VALUES
(505, ’Mystic Fabric’, ’One of the only pr’, ’99/136’, 104);
63

3.3. Средства модификации данных языка SQL Глава 3. Введение в язык SQL
Обратите внимание, что значения типа integer и numeric не
заключаются в кавычки, в отличие от char и varchar.
Если данные для каких-то столбцов отсутствуют, можно ис-
пользовать ключевое слово NULL для пропускаемых значений:
INSERT INTO ARTIST VALUES
(15, ’Matisse1’, ’French’, NULL, NULL);
Вторая форма оператора INSERT, которая допускает пропуск
значений некоторых столбцов, предполагает перечисление имен
столбцов, которым будут присвоены значения. Например, следующий оператор добавляет в таблицу ARTIST строку, в которой столбцам ArtistID, Name и Nationality присвоены значения, а столбцы
BirthDate и DeceasedDate оставлены пустыми:
INSERT INTO ARTIST (Name, Nationality, ArtistID) VALUES
(’Repin’, ’Russian’, 20);
Если для какого-либо столбца при создании таблицы было
определено начальное значение, тогда несмотря на то, что в операторе INSERT значение этому столбцу может и не присваиваться,
СУБД установит значение равное значению по умолчанию.
Есть несколько дополнительных замечаний, которые следует
сделать по поводу второй формы оператора INSERT. Во-первых, порядок, в котором перечисляются значения столбцов, должен соответствовать порядку следования их имен. В предыдущем примере
имена столбцов идут в порядке (Name, Nationality, ArtistID), поэтому сначала должно быть указано значение столбца Name, затем –
Nationality и, наконец, ArtistID). Следует отметить, что столбцы
в таблице идут в другом порядке (см. табл. 2.2). Во-вторых, чтобы
вставка была выполнена, необходимо задать значения всех столбцов, определенных как NOT NULL.
Если требуется скопировать большое количество данных из
другой таблицы, их значения можно получить с помощью оператора SELECT. Например, следующий оператор копирует значения
столбцов ArtistID, Name и Nationality из таблицы ARTIST в таблицу
ARTIST_NEW (которая должна быть создана заранее):
INSERT INTO ARTIST_NEW (ArtistID, Name, Nationality)
SELECT ArtistID, Name, Nationality
FROM ARTIST;
64

Глава 3. Введение в язык SQL 3.3. Средства модификации данных языка SQL
Обратите внимание, что в этом случае ключевое слово VALUES
не входит в оператор SELECT.
3.3.2 Изменение данных, оператор UPDATE
Значение существующих данных могут быть изменены с помощью SQL-оператора UPDATE. Нужно принимать во внимание, что
это мощная команда и ее следует использовать с осторожностью.
Рассмотрим следующий пример:
UPDATE WORK
SET Copy = ’99/100’
WHERE WorkID = 302;
Этот запрос устанавливает значение столбца Copy в строке
произведения с номером 302, равным ’99/100’. Теперь посмотрим,
что имелось в виду, когда речь шла об осторожности. Допустим, что
собираясь произвести это изменение, вы сделали ошибку и забыли
про предложение WHERE. Таким образом, был передан на исполнение
СУБД следующий запрос:
UPDATE WORK
SET Copy = ’99/100’;
В итоге, если не нарушаются ограничения столбца Copy (например, ограничения по уникальности), то во всей таблице WORK у
столбца Copy будет одно значение – ’99/100’.
Итог таков: оператор UPDATE весьма мощен и прост в использовании, но может привести к печальным последствиям.
С помощью оператора UPDATE можно обновлять и несколько
столбцов за один прием. Это демонстрирует следующий пример:
UPDATE WORK
SET Copy = ’99/100’, Description = ’Very Nice’
WHERE WorkID = 302;
Эта команда изменяет значения столбцов Copy и Description
для указанной работы.
3.3.3 Удаление данных, оператор DELETE
Для удаления строк служит SQL-оператор DELETE. К нему относятся те же самые предостережения, что и к оператору UPDATE.
65

3.4. Транзакции Глава 3. Введение в язык SQL
Он обманчиво прост в использовании, и неосторожное его применение может привести к самым неожиданным последствиям. Следующий оператор удаляет из таблицы CUSTOMER_ARTIST_INT строку,
в которой столбец ArtistID равен 108:
DELETE
FROM CUSTOMER_ARTIST_INT
WHERE ArtistID = 108;
Как и в случае с оператором UPDATE, если вы забудете указать
предложение WHERE, последствия могут быть катастрофическими.
Например, следующий запрос удалит все строки из отношения
CUSTOMER_ARTIST_INT:
DELETE
FROM CUSTOMER_ARTIST_INT;
Здесь следует обратить внимание на процедуру обеспечения ссылочной целостности между таблицами ARTIST и CUSTOMER-
_ARTIST_INT. Если мы попытаемся выполнить следующую команду,
то нас постигнет неудача, поскольку указанная строка таблицы
ARTIST имеет дочерние строки в таблице CUSTOMER_ARTIST_INT (см.
листинг 3.3):
DELETE
FROM ARTIST
WHERE ArtistID = 108;
3.4 Транзакции
Транзакция – механизм СУБД, обеспечивающий непротиворечивость данных. Явное использование механизма транзакций при
модификации данных гарантирует, что все операции будут произведены успешно, а в случае возникновения ошибки будет вызван
процесс отката транзакции (rollback) и состояние базы данных вернется к первоначальному (состояние до начала выполнения транзакции).
Транзакции в СУБД PostgreSQL обладают свойствами ACID:
• Atomicity (Атомарность) – гарантия успешного выполнения всех
операций в рамках транзакции (транзакция не будет зафиксирована с СУБД частично);
66

Глава 3. Введение в язык SQL 3.4. Транзакции
• Consistency (Согласованность) – гарантия согласованности данных при выполнении транзакций, достигших своего нормального завершения (противоречивые состояния не видны пользователю, так как при возникновении ошибки происходит откат
транзакции);
• Isolation (Изолированность) – гарантия того, что результат
транзакции не зависит от результата другой транзакции и не
влияет на работу других транзакций;
• Durability (Долговечность) – гарантия сохранности результатов
работы успешно завершенных транзакций даже после аварийного отказа сервера СУБД.
Оператор BEGIN TRANSACTION позволяет использовать механизм
явных транзакций, а оператор ROLLBACK TRANSACTION применяется
для отката транзакции:
BEGIN TRANSACTION;
DELETE FROM CUSTOMER_ARTIST_INT;
DELETE FROM TRANSACTION;
ROLLBACK TRANSACTION;
SELECT * FROM CUSTOMER_ARTIST_INT;
SELECT * FROM TRANSACTION;
После выполнения данного запроса содержимое таблиц
CUSTOMER_ARTIST_INT и TRANSACTION останется прежним, так как
все действия, совершенные оператором DELETE, были отменены в
результате отката транзакции.
Помимо явных транзакций, вызываемых пользователем, в
PostgreSQL присутствуют так называемые неявные транзакции.
Данный вид транзакций используется в процессе работы
SQL-операторов для модификации данных: INSERT, UPDATE,
DELETE.
Например, если во время работы запроса
DELETE DROM TRANSACTION WHERE SalesPrice < 10000;
произошел аварийный останов сервера СУБД PostgreSQL, после
восстановления его работоспособности будет произведен откат базы данных к первоначальному состоянию путем отката соответствующей неявной транзакции.
67

3.4. Транзакции Глава 3. Введение в язык SQL
3.4.1 Контрольные вопросы
1. Оператор CREATE TABLE.
2. Определение ограничений CONSTRAINT.
3. Оператор вставки данных INSERT.
4. Оператор обновления UPDATE.
5. Оператор удаления строк DELETE.
6. Чтение строк и столбцов.
7. Шаблоны поиска в SQL.
8. Сортировка результатов запроса.
9. Встроенные функции SQL.
10. Группировка в запросах.
11. Вложенные запросы.
12. Внешние и внутренние соединения.
68

4 ПРИМЕНЕНИЕ SQL В ПРИЛОЖЕНИЯХ
4.1 SQL-представления
SQL-представление (SQL view) – это виртуальная таблица, составленная из других таблиц или представлений. Представление не
имеет своих собственных данных, а объединяет данные из таблиц
или представлений, которые в него входят. Представления создаются с помощью комбинации операторов CREATE VIEW и SELECT. Согласно стандарту SQL-92 представления не могут включать в себя
конструкцию ORDER BY, но PostgreSQL такой вариант допускает.
Например, следующий оператор определяет представление
под названием ArtistNameView, базирующийся на таблице ARTIST:
CREATE VIEW ArtistNameView AS
SELECT Name AS ArtistName
FROM ARTIST
ORDER BY Name;
Для получения отсортированного списка имен художников
данное представление можно обработать при помощи следующего
запроса:
SELECT *
FROM ArtistNameView;
Результат будет выглядеть следующим образом:
ArtistName
Chagall
Frings
Kandinsky
Klee
Matisse
Miro
Moos
Tobey
Следует обратить внимание на то, как используется оператор
SELECT для запроса данных из представления ArtistNameView. Как
известно, это выражение возвращает все столбцы. В данном случае
возвращается только один столбец, так как он является единственным в представлении ArtistNameView, хотя таблица ARTIST, на основе
которой он сформирован, имеет несколько столбцов.
69

4.1. SQL-представления Глава 4. Применение SQL
Также обратите внимание, что столбцу Name из таблицы ARTIST
в представлении ArtistNameView было дано имя ArtistName. В возвращаемых СУБД результатах в качестве имени столбца фигурирует
именно ArtistName.
Представления имеют множество применений. Во-первых, с
их помощью можно скрывать от доступа отдельные столбцы или
строки. Кроме того, они позволяют отображать вычисляемые столбцы и скрывать сложные SQL-запросы. Также представления обеспечивают уровень абстракции между данными, обрабатываемыми приложением, и реальными данными, содержащимися в таблицах. Далее рассматриваются примеры каждого из этих применений и обсуждаются некоторые другие варианты использования
представлений.
4.1.1 Использование представлений для скрытия столбцов и строк
С помощью представлений можно скрыть отдельные столбцы
таблиц. Это делается для того, чтобы возвращаемый результат имел
более простой вид, а также для предотвращения доступа к конфиденциальным данным. Предположим, что пользователям базы
данных нужны только имена и номера телефонов клиентов, но не их
домашние адреса или адреса электронной почты. Следующий оператор создает представление BasicCustomerData, содержащее только эти данные.
CREATE VIEW BasicCustomerData AS
SELECT Name, AreaCode, PhoneNumber
FROM CUSTOMER;
Результаты выполнения оператора SELECT над этим представлением следующие:
ArtistName AreaCode PhoneNumber
Jeffrey Janes 206 555-1345
David Smith 303 555-5434
Tiffany Twilight 206 555-1000
Fred Smathers 206 555-1234
Mary Beth Frederickson 303 555-1000
продолжение таблицы на следующей странице
70
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
