Добавил:
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
- •Числовые функции
- •Тригонометрические функции
- •Контрольные вопросы
- •Заключение
- •Библиографический список

2 ОПИСАНИЕ ПРАКТИЧЕСКОГО ПРИМЕРА
Перед непосредственным рассмотрением СУБД PostgreSQL 9.5 и соответствующего языка запросов SQL необходимо
определиться с теми исходными данными, которые будут
использоваться в примерах учебного пособия.
В качестве примера рассматривается база данных небольшой
художественной галереи [4]. Перечень требований к приложению
для галереи:
• Вести учет покупателей и их художественных интересов.
• Отслеживать приобретения, которые делает галерея.
• Отслеживать покупки клиентов.
• Вести список художников и произведений, когда-либо появляв-
шихся в галерее.
• Генерировать отчет о том, насколько быстро и с какой прибылью продаются произведения конкретного художника.
• Отображать список произведений, выставленных на продажу.
Когда галерея покупает произведение, сведения о нем, его авторе, дате и стоимости приобретения записываются в базу данных.
В отдельных случаях галерея может выкупить произведение у клиента и вновь выставить его на продажу, так что одно и то же произведение может появляться в галерее неоднократно. При повторном
приобретении информация о работе и ее авторе не вводится заново:
записывается только дата и стоимость последнего приобретения.
Когда работа продается, записываются дата совершения сделки,
уплаченная сумма и сведения о покупателе.
Данные о предыдущих продажах необходимы продавцам для
того, чтобы они могли уделять больше времени наиболее активным
покупателям. Иногда эти записи используются для определения
местонахождения ранее проданных произведений.
Для маркетинговых целей требуется, чтобы приложение базы
данных выдавало список всех произведений, которые когда-либо
появлялись в галерее, и их авторов. Владелец хотел бы также иметь
возможность определять, насколько быстро продаются произведения каждого из художников и какова прибыль от их продажи. Наконец, приложение должно отображать список работ, имеющихся
в наличии.
21

Глава 2. Описание практического примера
Модель данных такого примера приведена на рис. 2.1.
В ней есть две сильных сущности – CUSTOMER (клиент) и ARTIST
(художник). Кроме того, имеется сущность WORK (произведение),
идентификационно-зависимая от сущности ARTIST, и сущность
TRANSACTION (транзакция), идентификационно-зависимая от сущно-
сти WORK. Между сущностями CUSTOMER и WORK имеется неидентифицирующая связь принадлежности.
Рис. 2.1. Модель данных для практического примера
Сведения о художнике могут присутствовать в базе данных,
даже если ни одна из его работ не появлялась в галерее. Это сделано для того, чтобы можно было регистрировать интерес клиентов к
художникам, чьи работы галерея может приобрести в будущем. Таким образом, с художником может быть связано любое количество
произведений, в том числе ноль.
Идентификатором сущности WORK является группа (Title, Copy)
(название, номер копии), поскольку в случае литографий и фотогра-
22

Глава 2. Описание практического примера
фий произведение может существовать в нескольких экземплярах.
Кроме того, в требованиях к приложению указано, что одно и то же
произведение может неоднократно появляться в галерее, поэтому
с каждым произведением потенциально может быть связано много
транзакций. Каждый раз, когда произведение появляется в галерее, необходимо записывать дату и стоимость приобретения. Таким
образом, каждой работе должна соответствовать по меньшей мере
одна транзакция.
Клиент может приобрести множество работ; этот факт обозначен связью вида 1:N между сущностями CUSTOMER и TRANSACTION.
Кроме того, между сущностями CUSTOMER и ARTIST существует связь
вида N:M.
Удаление строк в таблицах CUSTOMER и ARTIST вызывает каскадное удаление в таблице CUSTOMER_ARTIST_INT. Это имеет смысл,
поскольку когда сведения о клиенте или художнике удаляются из
базы данных, нет нужды сохранять информацию о предпочтениях
данного клиента или интересе к данному художнику. Если с клиентом связана хотя бы одна транзакция, этот клиент не может быть
удален из базы данных. Аналогично, если с художником связана
хотя бы одна картина, удалить его будет нельзя. Кроме того, записи о работах, по которым имели место какие-либо транзакции,
удалению также не подлежат.
Данные для рассматриваемого примера приведены в
табл. 2.1-2.5.
Таблица 2.1
Данные для таблицы CUSTOMER_ARTIST_INT
ArtistID CustomerID ArtistID CustomerID
101 206 106 203
103 203 106 204
103 205 106 205
103 209 106 206
103 210 106 208
105 205 106 209
105 209 106 210
106 202 108 203
23

Глава 2. Описание практического примера
Таблица 2.2
Таблица 2.3
Таблица 2.4
Данные для таблицы ARTIST
ArtistID Name Nationality BirthDate DeceasedDate
101 Miro Spanish 1870 1950
102 Kandinsky Russian 1854 1900
103 Frings US 1700 1800
104 Klee German 1900 <NULL>
105 Moos US <NULL> <NULL>
106 Tobey US <NULL> <NULL>
107 Matisse French <NULL> <NULL>
Данные для таблицы WORK
108 Chagall French <NULL> <NULL>
WorkID Title Description Copy ArtistID
301 Mystic Fabric One of the only pr 99/135 106
302 Mi Vida Very black, but ve 7/100 101
24
303 Slow Embers From the artist’s HC 106
304 Mystic Fabric Some water damage 105/135 106
305 Northwest by Night Wonderful, moody 37/50 108
Данные для таблицы TRANSACTION
TransactionID DateAcquired AcquisitionPrice PurchaseDate SalesPrice AskingPrice CustomerID WorkID
401 2/27/1974 8750 3/18/1974 18500 20000 203 301
402 7/17/1989 28900 10/14/1989 46700 47000 202 301
403 11/17/1989 4500 11/21/2000 9750 10000 208 304
404 2/27/1999 8000 3/15/2000 17500 17500 206 302
405 4/7/2000 38700 8/17/2001 73500 75000 206 302
406 11/21/2001 6750 3/18/2002 14500 15000 208 303
407 11/21/2001 21500 <NULL> <NULL> <NULL> <NULL> 304
408 7/17/2002 47000 10/2/2002 71500 72500 203 305

Глава 2. Описание практического примера
Таблица 2.5
Email
Phone-
Number
Code
Country Area-
Postal-
Code
Данные для таблицы CUSTOMER
Customer1000@somewhere.com
Customer1001@somewhere.com
1345
5434
Customer1015@somewhere.com
Customer1033@somewhere.com
Customer1034@somewhere.com
1000
1234
1000
WA 98108 USA 206 555-
Customer1036@somewhere.com
Customer1037@somewhere.com
1234
Customer1040@somewhere.com
<NULL>
<NULL>
1234
1234
1000
1234
Canada 253 555-
1B4
CA 92114 USA 705 555-
Name Street City State Zip-
Cus-
tomer-
ID
Renton WA 98123 USA 206 555-
123 W.
Elm St
Janes
201 Jeffrey
Loveland CO 80345 USA 303 555-
813
Tumble-
Smith
202 David
weed
Lane
Langley WA 98114 USA 206 555-
Bainbridge
88-First
Avenue
10899-
Twilight
203 Tiffany
204 Fred
Island
Denver CO 80210 USA 303 555-
88th Ave
25 South
Lafayette
Smathers
Beth
205 Mary
25
Vancouver BC VON
Atlanta GA 23224 USA 721 555-
205
Burnaby
105
Locust
Frederickson
Warning
Wu
206 Selma
207 Susan
Bodega
Ave
55 Bodega
208 Donald
Bay
WashingtonDC 11345 USA 703 555-
Ave
117 C
G. Gray
209 Lynda
Olimpia WA 98008 USA 206 555-
Street
87
Highland
Johnson
Wikens
210 Chris
Drive

2.1. Наполнение тестовой БД Глава 2. Описание практического примера
2.1 Наполнение тестовой базы данных
В текущем подразделе описан процесс создания и наполнения
данными базы данных галереи.
2.1.1 Создание базы данных
Для создания новой базы данных используется оператор
CREATE DATABASE. Запрос для создания базы данных галереи будет
иметь следующий вид:
CREATE DATABASE GALLERY;
Для подключения к вновь созданной базе данных GALLERY в
оболочке psql требуется выполнить следующую команду:
\connect GALLERY
2.1.2 Создание таблиц
Листинг 2.1 содержит запрос для создания необходимых отношений (таблиц). Более подробно процесс создания отношений
описан в пункте 3.1.1.
Листинг 2.1.
CREATE TABLE CUSTOMER(
CustomerID int NOT NULL,
Name char(25) NOT NULL,
Street char(30) NULL,
City char(35) NULL,
State char(2) NULL,
ZipPostalCode char(5) NULL,
Country varchar(50) NULL,
AreaCode char(3) NULL,
PhoneNumber char(8) NULL,
Email varchar(100) NULL,
CONSTRAINT CustomerPK
PRIMARY KEY (CustomerID));
CREATE TABLE ARTIST(
ArtistID int NOT NULL,
Name char(25) NOT NULL,
Nationality varchar(30) NULL,
BirthDate numeric(4,0) NULL,
DeceasedDate numeric(4,0) NULL,
26

Глава 2. Описание практического примера 2.1. Наполнение тестовой БД
CONSTRAINT ArtistPK PRIMARY KEY (ArtistID),
CONSTRAINT ArtistAK1 UNIQUE (Name),
CONSTRAINT NationalityValues CHECK (Nationality IN
(’Canadian’, ’English’, ’French’, ’German’,
’Mexican’, ’Russian’, ’Spanish’, ’US’)),
CONSTRAINT BirthValuesCheck CHECK
(BirthDate < DeceasedDate),
CONSTRAINT ValidBirthYear CHECK ((BirthDate > 1000) AND
(BirthDate < 2100)),
CONSTRAINT ValidDeathYear CHECK ((DeceasedDate > 1000) AND
(DeceasedDate < 2100)));
CREATE TABLE CUSTOMER_ARTIST_INT(
ArtistID int NOT NULL,
CustomerID int NOT NULL,
CONSTRAINT CustomerArtistPK
PRIMARY KEY (ArtistID, CustomerID),
CONSTRAINT Customer_Artist_Int_ArtistFK
FOREIGN KEY (ArtistID)
REFERENCES ARTIST (ArtistID)
ON DELETE CASCADE,
CONSTRAINT Customer_Artist_Int_CustomerFK
FOREIGN KEY (CustomerID)
REFERENCES CUSTOMER (CustomerID)
ON DELETE CASCADE);
CREATE TABLE WORK(
WorkID int NOT NULL,
Title varchar(25) NOT NULL,
Description varchar(1000) NULL,
Copy varchar(8) NOT NULL,
ArtistID int NOT NULL,
CONSTRAINT WorkPK
PRIMARY KEY (WorkID),
CONSTRAINT WorkAK1
UNIQUE (Title, Copy),
CONSTRAINT ArtistFK
FOREIGN KEY (ArtistID)
REFERENCES ARTIST (ArtistID));
CREATE TABLE TRANSACTION(
TransactionID int NOT NULL,
DateAcquired date NOT NULL,
AcquisitionPrice numeric(8,2) NULL,
27

2.1. Наполнение тестовой БД Глава 2. Описание практического примера
PurchaseDate date NULL,
SalesPrice numeric(8,2) NULL,
AskingPrice numeric(8,2) NULL,
CustomerID int NULL,
WorkID int NOT NULL,
CONSTRAINT TransactionPK
PRIMARY KEY (TransactionID),
CONSTRAINT SalesPriceRange
CHECK ((SalesPrice > 1000) AND
(SalesPrice <= 200000)),
CONSTRAINT ValidTransDate
CHECK (DateAcquired <= PurchaseDate),
CONSTRAINT TransactionWorkFK
FOREIGN KEY (WorkID)
REFERENCES WORK (WorkID),
CONSTRAINT TransactionCustomerFK
FOREIGN KEY (CustomerID)
REFERENCES CUSTOMER (CustomerID));
После выполнения данного запроса можно получить список
созданных таблиц с помощью команды \dt. Результат работы команды имеет вид:
Schema Name Type Owner
public artist table postgres
public customer table postgres
public customer_artist_int table postgres
public transaction table postgres
public work table postgres
2.1.3 Создание последовательностей
Последовательность (sequence) – это объект, который генерирует ряд последовательных уникальных чисел, которые чаще всего
используются для формирования первичных ключей. Более подробно первичные ключи рассмотрены в пункте 3.1.2.
Запрос для создания последовательности с именем MYSEQ выглядит следующим образом:
CREATE SEQUENCE IF NOT EXISTS MYSEQ
INCREMENT BY 1 START WITH 1;
28

Глава 2. Описание практического примера 2.1. Наполнение тестовой БД
Предложение IF NOT EXISTS позволяет выполнять данный запрос несколько раз без возникновения ошибки, связанной с наличием в СУБД последовательности с аналогичным именем. Параметры
INCREMENT BY и START WITH определяют величину, на которую будет
произведен инкремент текущего значения последовательности, и
величину, определяющую начальное значение последовательности
соответственно.
Для генерации следующего значения последовательности используется внутренняя функция nextval, например, запрос
SELECT nextval(’MYSEQ’);
вернет следующее значение последовательности MYSEQ.
Текущее значение последовательности можно получить с помощью функции currval. Например, результатом запроса
SELECT currval(’MYSEQ’);
будет текущее значение последовательности MYSEQ.
Изменить текущее значение последовательности позволит
внутренняя функция setval. После выполнения запроса
SELECT setval(’MYSEQ’, 3);
текущее значение последовательности MYSEQ будет равно трем.
Листинг 2.2 содержит запрос для создания необходимых последовательностей.
Листинг 2.2.
CREATE SEQUENCE SEQ_ARTIST
INCREMENT BY 1
START WITH 101
MINVALUE 100;
CREATE SEQUENCE SEQ_CUSTOMER
INCREMENT BY 1
START WITH 201
MINVALUE 200;
CREATE SEQUENCE SEQ_WORK
INCREMENT BY 1
START WITH 301
MINVALUE 300;
29

2.1. Наполнение тестовой БД Глава 2. Описание практического примера
CREATE SEQUENCE SEQ_TRANSACTION
INCREMENT BY 1
START WITH 401
MINVALUE 400;
После выполнения данного запроса можно получить список
созданных последовательностей с помощью команды \ds. Результат
представлен в таблице:
Schema Name Type Owner
public seq_artist sequence postgres
public seq_customer sequence postgres
public seq_transaction sequence postgres
public seq_work sequence postgres
2.1.4 Ввод данных
Теперь можно начать заполнять таблицы данными. В листинге
2.3 показан созданный во внешнем редакторе файл, состоящий из
последовательности операторов INSERT.
Листинг 2.3.
INSERT INTO ARTIST VALUES
(nextval(’seq_artist’), ’Miro’, ’Spanish’, 1870, 1950);
INSERT INTO ARTIST VALUES
(nextval(’seq_artist’), ’Kandinsky’, ’Russian’, 1854, 1900);
INSERT INTO ARTIST VALUES
(nextval(’seq_artist’), ’Frings’, ’US’, 1700, 1800);
INSERT INTO ARTIST VALUES
(nextval(’seq_artist’), ’Klee’, ’German’, 1900, NULL);
INSERT INTO ARTIST VALUES
(nextval(’seq_artist’), ’Moos’, ’US’, NULL, NULL);
INSERT INTO ARTIST VALUES
(nextval(’seq_artist’), ’Tobey’, ’US’, NULL, NULL);
INSERT INTO ARTIST VALUES
(nextval(’seq_artist’), ’Matisse’, ’French’, NULL, NULL);
INSERT INTO ARTIST VALUES
(nextval(’seq_artist’), ’Chagall’, ’French’, NULL, NULL);
INSERT INTO CUSTOMER VALUES
(nextval(’seq_customer’), ’Jeffrey Janes’,
’123 W. Elm St’, ’Renton’, ’WA’, ’98123’, ’USA’,
30
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
