Добавил:
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. Описание практического примера 2.1. Наполнение тестовой БД
’206’, ’555-1345’, ’Customer1000@somewhere.com’);
INSERT INTO CUSTOMER VALUES
(nextval(’seq_customer’), ’David Smith’,
’813 Tumbleweed Lane’, ’Loveland’, ’CO’, ’80345’, ’USA’,
’303’, ’555-5434’, ’Customer1001@somewhere.com’);
INSERT INTO CUSTOMER VALUES
(nextval(’seq_customer’), ’Tiffany Twilight’,
’88 - First Avenue’, ’Langley’, ’WA’, ’98114’, ’USA’,
’206’, ’555-1000’, ’Customer1015@somewhere.com’);
INSERT INTO CUSTOMER VALUES
(nextval(’seq_customer’), ’Fred Smathers’,
’10899-88th Ave’, ’Bainbridge Island’, ’WA’, ’98108’, ’USA’,
’206’, ’555-1234’,’Customer1033@somewhere.com’);
INSERT INTO CUSTOMER VALUES
(nextval(’seq_customer’), ’Mary Beth Frederickson’,
’25 South Lafayette’,’Denver’, ’CO’, ’80210’, ’USA’,
’303’, ’555-1000’, ’Customer1034@somewhere.com’);
INSERT INTO CUSTOMER VALUES
(nextval(’seq_customer’), ’Selma Warning’,
’205 Burnaby’, ’Vancouver’, ’BC’, ’VON1B’, ’Canada’,
’253’, ’555-1234’, ’Customer1036@somewhere.com’);
INSERT INTO CUSTOMER VALUES
(nextval(’seq_customer’), ’Susan Wu’,
’105 Locust Ave’, ’Atlanta’, ’GA’, ’23224’, ’USA’,
’721’, ’555-1234’, ’Customer1037@somewhere.com’);
INSERT INTO CUSTOMER VALUES
(nextval(’seq_customer’), ’Donald G. Gray’,
’55 Bodega Ave’, ’Bodega Bay’, ’CA’, ’92114’, ’USA’,
’705’, ’555-1345’, ’Customer1040@somewhere.com’);
INSERT INTO CUSTOMER VALUES
(nextval(’seq_customer’), ’Lynda Johnson’,
’117 C Street’, ’Washington’, ’DC’, ’11345’, ’USA’,
’703’, ’555-1000’, ’’);
INSERT INTO CUSTOMER VALUES
(nextval(’seq_customer’), ’Chris Wilkens’,
’87 Highland Drive’, ’Olympia’, ’WA’, ’98008’, ’USA’, ’206’,
’555-1234’, ’’);
INSERT INTO WORK VALUES
(nextval(’seq_work’), ’Mystic Fabric’, ’One of the only pr’,
’99/135’, 106);
INSERT INTO WORK VALUES
(nextval(’seq_work’), ’Mi Vida’, ’Very black, but ve’,
31

2.1. Наполнение тестовой БД Глава 2. Описание практического примера
’7/100’, 101);
INSERT INTO WORK VALUES
(nextval(’seq_work’), ’Slow Embers’, ’From the artist’’s’,
’HC’, 106);
INSERT INTO WORK VALUES
(nextval(’seq_work’), ’Mystic Fabric’, ’Some water damage’,
’105/135’, 106);
INSERT INTO WORK VALUES
(nextval(’seq_work’), ’Northwest by Night’, ’Wonderful,
moody’,
’37/50’, 108);
INSERT INTO TRANSACTION VALUES
(nextval(’seq_transaction’), ’1974-2-27’, 8750,
’1974-3-18’, 18500, 20000, 203, 301);
INSERT INTO TRANSACTION VALUES
(nextval(’seq_transaction’), ’1989-7-17’, 28900,
’1989-10-14’, 46700, 47000, 202, 301);
INSERT INTO TRANSACTION VALUES
(nextval(’seq_transaction’), ’1989-11-17’, 4500,
’2000-11-21’, 9750, 10000, 208, 304);
INSERT INTO TRANSACTION VALUES
(nextval(’seq_transaction’), ’1999-2-27’, 8000,
’2000-3-15’, 17500, 17500, 206, 302);
INSERT INTO TRANSACTION VALUES
(nextval(’seq_transaction’), ’2000-4-7’, 38700,
’2001-8-17’, 73500, 75000, 206, 302);
INSERT INTO TRANSACTION VALUES
(nextval(’seq_transaction’), ’2001-11-21’, 6750,
’2002-3-18’, 14500, 15000, 208, 303);
INSERT INTO TRANSACTION VALUES
(nextval(’seq_transaction’), ’2001-11-21’, 21500,
NULL, NULL, NULL, NULL, 304);
INSERT INTO TRANSACTION VALUES
(nextval(’seq_transaction’), ’2002-7-17’, 47000,
’2002-10-2’, 71500, 72500, 203, 305);
INSERT INTO CUSTOMER_ARTIST_INT VALUES
(101, 206);
INSERT INTO CUSTOMER_ARTIST_INT VALUES
(103, 203);
INSERT INTO CUSTOMER_ARTIST_INT VALUES
32

Глава 2. Описание практического примера 2.1. Наполнение тестовой БД
(103, 205);
INSERT INTO CUSTOMER_ARTIST_INT VALUES
(103, 209);
INSERT INTO CUSTOMER_ARTIST_INT VALUES
(103, 210);
INSERT INTO CUSTOMER_ARTIST_INT VALUES
(105, 205);
INSERT INTO CUSTOMER_ARTIST_INT VALUES
(105, 209);
INSERT INTO CUSTOMER_ARTIST_INT VALUES
(106, 202);
INSERT INTO CUSTOMER_ARTIST_INT VALUES
(106, 203);
INSERT INTO CUSTOMER_ARTIST_INT VALUES
(106, 204);
INSERT INTO CUSTOMER_ARTIST_INT VALUES
(106, 205);
INSERT INTO CUSTOMER_ARTIST_INT VALUES
(106, 206);
INSERT INTO CUSTOMER_ARTIST_INT VALUES
(106, 208);
INSERT INTO CUSTOMER_ARTIST_INT VALUES
(106, 209);
INSERT INTO CUSTOMER_ARTIST_INT VALUES
(106, 210);
INSERT INTO CUSTOMER_ARTIST_INT VALUES
(108, 203);
После выполнения данного запроса созданные ранее таблицы
будут наполнены данными.
2.1.5 Создание индексов
Индексы создаются для обеспечения уникальности столбцов,
упрощения сортировки и быстрого поиска данных по значениям
столбцов. Столбцы, которые часто фигурируют в условиях равенства в предложениях WHERE (см. пункт 3.2.2), являются хорошими
кандидатами на создание индекса.
Для первичного ключа PostgreSQL создает индекс автоматически. При этом в качестве ключа индекса выступает значение
первичного ключа, а в качестве значения – указатель на строку.
При использовании оператора UNIQUE, позволяющего контролиро-
33

2.2. Контрольные вопросы Глава 2. Описание практического примера
вать уникальность значений в столбце таблицы, индекс для данного
столбца также создается автоматически.
В PostgreSQL возможно создание двух типов индексов:
• хэш-индекс – структура, содержащая пары (ключ, значение),
при этом все значения должны быть уникальны;
• B-дерево – древовидная структура, в которой длина любых двух
путей от корня до листьев совпадает, а каждый узел дерева ссылается на большое число узлов-потомков. B-дерево позволяет
увеличить скорость выполнения запросов (например, запрос по
диапазону дат) за счет уменьшения количества узлов, просматриваемых при каждой операции.
Для создания хэш-индекса по полю Name таблицы ARTIST ис-
пользуется следующий запрос:
CREATE INDEX ARTIST_NAME
ON ARTIST USING hash (Name);
Построить B-дерево по столбцу DateAcquired таблицы
TRANSACTION можно с помощью запроса:
CREATE INDEX TRANSACTION_DATEACQUIRED
ON TRANSACTION USING btree (DateAcquired);
Список созданных индексов можно получить с помощью ко-
манды \di. Результат представлен в таблице:
Schema Name Type Owner Table
public artist_name index postgres artist
public artistak1 index postgres artist
public artistpk index postgres artist
public customerartistpk index postgres customer_artist_int
public customerpk index postgres customer
public transaction_dateacquired index postgres transaction
public transactionpk index postgres transaction
public workak1 index postgres work
public workpk index postgres work
2.2 Контрольные вопросы
1. Для чего нужны последовательности?
2. Для чего нужны индексы?
34

3 ВВЕДЕНИЕ В ЯЗЫК SQL
Язык SQL был разработан фирмой IBM в конце 1970-х годов и
был принят Американским национальным институтом стандартов
(ANSI) в качестве национального стандарта США в 1992 году [4].
Язык SQL ориентирован на текст. Он был разработан задолго
до появления графических интерфейсов пользователя, так что для
работы с ним требуется лишь текстовый редактор. Разумеется, в
таких СУБД, как PostgreSQL, имеются графические средства для
выполнения многих из тех задач, которые ранее могли быть выполнены только с помощью SQL. Но не все из того, что позволяет делать
SQL, можно осуществить с помощью графических средств; более
того, в ряде случаев, например, для динамической генерации операторов SQL в программном коде, SQL использовать необходимо.
С помощью SQL можно определять структуры базы данных,
а также запрашивать и обновлять информацию в базе данных. Совокупность команд, служащих для определения данных, называют
иногда языком определения данных (data difinition language, DDL),
а совокупность команд для обновления и запроса данных – языком
манипулирования данными (data manipulation language, DML). Далее в учебном пособии будут рассмотрены оба эти подмножества
языка SQL на примере, приведенном в главе 2.
3.1 Средства определения данных языка SQL
3.1.1 Оператор CREATE TABLE
Основная функция этого оператора – создание новой таблицы
и описание ее столбцов и типов данных. Кроме того, этот оператор
позволяет определять первичные ключи, альтернативные ключи и
внешние ключи с некоторыми ограничениями ссылочной целостности, а также задавать ограничения на столбцы и таблицы (листинг
3.1).
Листинг 3.1.
CREATE TABLE CUSTOMER(
CustomerID int PRIMARY KEY,
Name char(25) NOT NULL,
Street char(30) NULL,
35

3.1. Средства определения данных языка SQL Глава 3. Введение в язык SQL
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);
В SQL имеется пять типов ограничений: NULL, NOT NULL, UNIQUE,
PRIMARY KEY и FOREIGN KEY. В листинге 3.1 столбец CustomerID при-
надлежит к типу данных integer (целочисленный) и имеет свойство
PRIMARY KEY. Следующий столбец, Name, имеет тип данных char (стро-
ковый) с максимальной длиной 25 символов. Ключевые слова NOT
NULL означают, что этот столбец обязан иметь значение.
В SQL первичные ключи ни при каких условиях не могут
иметь пустых значений. Именно поэтому для столбца CustomerID
можно просто указать свойство PRIMARY KEY, не уточняя, что он не
должен быть пустым (NOT NULL). Ключевые слова PRIMARY KEY сами
по себе уже говорят, что столбец CustomerID не будет иметь пустых значений. Для уникальных столбцов, однако, пустые значения
возможны.
Седьмой столбец, Country, принадлежит к типу данных
varchar(50) и имеет свойство NULL. varchar обозначает строку пере-
менной длины. Таким образом, в разных строках значения столбца
Country могут различаться по длине, и максимально возможная
длина строки равна 50 символам. Ключевое слово NULL указывает
на то, что пустые значения допустимы.
Значения типа char имеют фиксированную длину. Если столбец Name определен как char(25), это означает, что каждое значение
столбца Name будет храниться в виде строки длиной 25 символов,
независимо от того, какова реальная длина имени клиента. При
необходимости имена будут дополняться пробелами до 25 символов. Значения типа varchar могут иметь разную длину. Если название страны состоит всего из четырех символов, то только эти
четыре символа и будут храниться в столбце Country.
В табл. 3.1 перечислены некоторые из типов данных, поддерживаемых в СУБД PostgreSQL.
36

Глава 3. Введение в язык SQL 3.1. Средства определения данных языка SQL
Таблица 3.1
Типы данных SQL в СУБД PostgreSQL
Тип данных Описание
smallint Целое число в диапазоне от -32768 до +32767
integer, int Целое число в диапазоне от -2147483648 до +2147483647
numeric(n, d) Число длиной n с d знаками после запятой
char(n) Текстовое поле фиксированной длины n
varchar(n) Текстовое поле переменной длины до n символов
timestamp Поле, содержащее дату и время
date Поле, содержащее только дату
time Поле, содержащее только время
bytea Двоичная строка переменной длины
3.1.2 Оператор ALTER TABLE
После того как таблица определена, ее структуру, свойства
и ограничения можно изменить, используя оператор ALTER TABLE.
Необходима некоторая осторожность при работе с этим оператором, поскольку при его использовании возможна потеря данных.
Добавление столбца осуществляется запросом:
ALTER TABLE MyTable ADD MyColumn int;
Рассмотренный запрос добавляет столбец с именем MyColumn
с типом integer. Обратите внимание, что при создании столбца
ключевое слово COLUMN опускается. Чтобы убедиться в том, что желаемые изменения действительно были произведены, посмотрите
структуру таблицы с помощью команды \d MyTable.
Также в любой момент можно добавить пустой, или необязательный (NULL), столбец. Чтобы добавить обязательный (NOT NULL)
столбец, сначала нужно создать его в таблице как необязательный,
заполнить все его строки данными, а затем объявить его обязательным при помощи конструкции ALTER COLUMN. Предположим, например, что добавляется столбец MyColumn в таблицу MyTable. После того
как этот столбец будет заполнен в каждой строчке таблицы MyTable,
можно выполнить следующий запрос:
ALTER TABLE MyTable ALTER COLUMN MyColumn SET NOT NULL;
Теперь столбец MyColumn будет обязательно требовать присвоения
значения.
37

3.1. Средства определения данных языка SQL Глава 3. Введение в язык SQL
При модификации столбца можно увеличивать количество
символов в текстовых столбцах и количество цифр в числовых
столбцах. Также можно свободно увеличивать или уменьшать количество цифр после десятичной точки. Если данный столбец является пустым во всех строках, можно уменьшать длину текстовых
и числовых данных, а также менять тип данных столбца.
В листинге 3.2 представлен альтернативный способ определения первичного ключа, при котором сначала определяется таблица, а потом ее определение модифицируется оператором ALTER
TABLE. Оператор CREATE TABLE определяет все столбцы таблицы
CUSTOMER, но ни один из них не указывается в качестве первичного
ключа. Затем при помощи оператора ALTER TABLE вводится новое
ограничение под названием CustomerPK, которое определяет столбец CustomerID как первичный ключ.
Листинг 3.2.
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);
ALTER TABLE CUSTOMER
ADD 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,
CONSTRAINT ArtistPK PRIMARY KEY (ArtistID));
Имя для ограничения может выбираться произвольно. Однако
есть смысл придерживаться некоторым стандартным соглашениям
38

Глава 3. Введение в язык SQL 3.1. Средства определения данных языка SQL
об именовании. В этом пособии, например, имена первичных ключей образуются путем присоединения аббревиатуры PK (Primary
Key – первичный ключ) к названию таблицы.
Оба способа определения первичных ключей для таблиц
CUSTOMER (листинг 3.1 и листинг 3.2) являются правильными. Раз-
личие состоит в том, что во втором листинге разработчик указал
явно имя ограничения первичного ключа. Ограничению первичного ключа таблицы CUSTOMER (листинг 3.1) также будет дано имя,
но сгенерирует его уже СУБД, что очень часто затрудняет задачи
администрирования данных. Поэтому второй метод более предпочтителен.
Определение таблицы ARTIST в листинге 3.3 демонстрирует
еще один способ определения первичного ключа. Здесь ограничение определяется в теле оператора CREATE TABLE, после того как
определены все столбцы. Используя этот подход, разработчик может присваивать имена ограничениям в момент создания таблиц,
не прибегая к использованию оператора ALTER TABLE.
Композитный ключ определяется путем перечисления имен
атрибутов в скобках. Первичный ключ таблицы CUSTOMER_ARTIST_INT
(листинг 3.3) представляет собой сочетание {ArtistID, Custo-
merID}. Композитный первичный ключ не может быть определен с
помощью того метода, который представлен в листинге 3.1.
Листинг 3.3.
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);
39

3.1. Средства определения данных языка SQL Глава 3. Введение в язык SQL
Посредством оператора ALTER TABLE можно также опреде-
лять внешние ключи (листинг 3.3). Ограничение Customer_Artist-
_Int_ArtistFK указывает, что столбец ArtistID является внешний
ключом, который указывает на столбец ArtistID таблицы ARTIST.
Аббревиатура FK означает внешний ключ (Foreign Key). В определении внешнего ключа можно указать процедуру обеспечения
ссылочной целостности при удалении: ON DELETE CASCADE.
3.1.3 Операторы DROP TABLE и DROP
Одним из самых полезных операторов определения данных
SQL является оператор DROP TABLE. Но он одновременно является
и одним из самых опасных, поскольку удаляет таблицу из базы
данных вместе со всеми содержащимися в ней данными. Если
необходимо удалить из базы данных таблицу ARTIST и все содержащиеся в ней данные, то можно использовать следующий вариант
запроса:
DROP TABLE ARTIST;
Оператор DROP TABLE не выполняется, если таблица
содержит или может содержать значения, необходимые для
соблюдения ограничений ссылочной целостности. Например,
столбец ArtistID таблицы ARTIST может содержать значения,
необходимые для соблюдения ограничения внешнего ключа
Customer_Artist_Int_ArtistFK. Попытка передать СУБД на
выполнение запрос DROP TABLE ARTIST; окончится неудачей и
система выдаст сообщение об ошибке.
Если необходимо удалить таблицу ARTIST, нужно сначала удалить либо ограничение внешнего ключа Customer-
_Artist_Int_ArtistFK, либо всю таблицу CUSTOMER_ARTIST_INT.
Удалить ограничение можно при помощи следующего запроса:
ALTER TABLE CUSTOMER_ARTIST_INT
DROP CONSTRAINT Customer_Artist_Int_ArtistFK;
С помощью оператора DROP можно удалить столбец из таблицы,
как показано ниже:
ALTER TABLE MyTable DROP COLUMN MyColumn;
40
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
