Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы данных. Практический курс. В 2 частях. Ч.1. Объектно-реляционные базы данных на примере PostgreSQL 9.5. Учебное пособие.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
2 Мб
Скачать
Глава 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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]