Объектно-реляционная СУБД PostgreSQL. Учебное пособие
.pdf
|
|
Окончание табл. 2 |
Вкладка |
Параметр |
Примечание |
|
Сопоставление |
Russian_Russia,1251 |
|
Тип символа |
Russian_Russia,1251 |
|
Макс. число |
-1 (число подключений не ограничено) |
Привилегии |
подключений |
Набор устанавливаемых привилегий |
|
||
|
|
зависит от роли владельца БД |
SQL |
|
Показывает текст SQL-запроса, при |
|
|
выполнении которого создаётся БД |
Заметим, что достаточно задать имя базы данных и её владельца, а значения остальных параметров оставить по умолчанию.
После создания базы данных в Браузере объектов можно увидеть её структуру: перечень типов объектов с указанием их количества:
имя_БД Каталоги(2)
ANSI (information_schema) PostgreSQL (pg_catalog)
Триггеры по событию (0) Расширения (1)
plpgsql Схемы (1)
public
Репликация Slony (0)
Поясним некоторые моменты.
В каталогах ANSI (information_schema) и PostgreSQL (pg_catalog) хранится информация, необходимая для функционирования СУБД.
Пункт Расширения содержит список расширений, установленных в конкретной базе данных. В частности, расширением является установленный по умолчанию встроенный в СУБД PostgreSQL язык программирования PL/pgSQL. Программист может установить и другие расширения, как языковые (например, PL/python), так и расширения, умеющие работать с новыми типами данных (например, Hstore для работы с данными типа «ключ – значение»).
11
Пункт Схемы содержит только схему public, но программист может добавить и свои схемы. Обычно несколько схем создаётся, чтобы в многотабличной базе данных разделить таблицы на логические группы. При этом пользователь по-прежнему имеет доступ ко всем таблицам базы данных в соответствии со своими правами. Стоит, однако, заметить, что большинство СУБД не поддерживают эту возможность, поэтому наличие в базе данных нескольких схем может затруднить её перенос на другую СУБД.
1.4. Создание таблиц БД
Для создания таблицы в базе данных также можно воспользоваться приложением pgAbmin III. Для этого выделим пункт меню Таблицы и щёлкнем по пиктограмме 4 (Создать объект того же типа, что и выделенный объект) или выберем из контекстного меню пункт Новая таблица… В появившемся диалоговом окне на имеющихся в окне вкладках задаём основные параметры
новой таблицы (табл. 3). |
|
|
|
|
Таблица 3 |
|
Параметры таблицы БД |
|
Вкладка |
Параметр |
Примечание |
Свойства |
Имя |
Обязательно для заполнения |
|
Владелец |
Указывается одна из |
|
|
существующих ролей |
|
Схема |
По умолчанию public |
Определение |
Табличное пространство |
pg_default |
|
Тип данных |
Тип строки существующей |
|
|
таблицы или имя типа данных, по |
|
|
умолчанию не установлен |
|
Имеет OID |
Таблице будет присвоен числовой |
|
|
идентификатор (Object Identifier, |
|
|
используется главным образом |
|
|
для системных таблиц СУБД |
|
|
PostgreSQL) |
Колонки |
Добавить |
Добавить новую колонку |
12
|
|
Окончание табл. 3 |
Вкладка |
Параметр |
Примечание |
Ограничения |
Добавить |
Добавить ограничение: |
|
|
– Первичный ключ |
|
|
– Внешний ключ |
|
|
– Проверка |
|
|
и ряд других |
Привилегии |
|
Установка/изменение привилегий |
|
|
пользователя |
SQL |
|
Показывает текст SQL-запроса |
При создании новой таблицы в качестве Типа данных можно указать тип строки существующей таблицы или ранее созданный тип. По умолчанию имя таблицы PostgreSQL рассматривает как тип данных, определяемый структурой строки таблицы. Если параметр Тип данных не установлен, то разработчик должен «вручную» добавить набор полей (колонок) в создаваемую таблицу.
Для добавления в таблицу каждой колонки необходимо ввести её параметры через диалоговое окно Новая колонка…. Структура диалогового окна позволяет задать основные параметры колонки (табл. 4).
При большом количестве колонок формирование структуры базы данных с использованием описанного интерфейса становится достаточно трудоёмким. В следующем разделе будет показано, как создать структуру базы данных с помощью SQL-запросов.
|
Параметры колонки |
|
|
Таблица 4 |
|
|
|
|
|
||
Вкладка |
Параметр |
|
Примечание |
||
Свойства |
Имя |
Обязательно для заполнения |
|||
|
Тип данных |
Выбирается из списка встроенных |
|||
|
|
или созданных |
пользователем |
||
|
|
типов данных |
|
|
|
Определение |
Сопоставление |
Выбор |
локальных |
настроек |
|
|
|
(локали). |
По |
|
умолчанию |
|
|
выбирается вариант, |
заданный при |
||
|
|
установке PostgreSQL |
|
||
|
Значение по умолчанию |
Предопределённое значение поля |
|||
|
Не разрешать NULL |
Не разрешать пустое значение поля |
|||
13
2. Основы SQL
Язык SQL (Structured Query Language) – это непроцедурный язык написания запросов к базе данных, первоначально разработанный в одной из лабораторий компании IBM. Целью разработки было создание простого языка, доступного для пользователей СУБД, не имеющих навыков программирования.
Первые СУБД, поддерживающие этот язык, появились в 1979 году, а первый его стандарт – в 1986. С того времени в стандарт были внесены многочисленные дополнения, наиболее существенные – в 1992 году (SQL-92 или SQL2) и в 1999 году (SQL:1999 или SQL3). В настоящее время действует стандарт, принятый в 2003 году (SQL:2003) с небольшими модификациями, внесёнными позже (SQL:2008).
Большинство СУБД реализует не все возможности, заложенные в стандарте, а только его основную часть, но СУБД PostgreSQL отличается практически полным соответствием указанным стандартам.
2.1. Базовые типы данных
Язык SQL может оперировать с большим количеством типов данных. Можно выделить несколько групп типов.
А) числовые типы. К числовым типам относятся: Целочисленные типы:
–smallint – 2-х байтовое целое число в диапазоне от -32768 до +32767. В настоящее время используется редко;
–integer (или int) – 4-х байтовое целое число в диапазоне от -2147483648 до +2147483647 – стандартный целый тип;
–bigint – 8-ми байтовое целое число очень большого диапазона, приблизительно от -9∙1018 до 9∙1018.
Кцелочисленным типам можно отнести и так называемые последовательные типы
–smallserial – 2-байтовый порядковый номер, который при добавлении в таблицу новой записи автоматически увеличивается на единицу. Диапазон изменения – от 1 до верхней границы типа smallint;
14
–serial – 4-байтовый порядковый номер, который при добавлении в таблицу новой записи автоматически увеличивается на единицу. Диапазон изменения – от 1 до верхней границы типа int;
–bigserial – 8-байтовый порядковый номер, который при добавлении в таблицу новой записи автоматически увеличивается на единицу. Диапазон изменения – от 1 до верхней границы типа bigint.
Стандартные вещественные типы:
–real – 4-байтовое вещественное число, количество значащих разрядов которого составляет 6-7 десятичных цифр;
–double precision (или float) – 8-ми байтовое вещественное число, количество значащих разрядов которого составляет 15-16 десятичных
цифр; Вещественные числа с фиксированной точностью:
–numeric (или decimal) – вещественные типы, для которых пользователь может задать как максимальное количество значащих цифр (параметр «точность»), так и количество знаков в дробной части числа (параметр «масштаб»).
Заметим, что вещественные числа с фиксированной точностью могут иметь около ста тридцати тысяч десятичных цифр до десятичной точки и около шестнадцати тысяч десятичных цифр после. Понятно, что такая точность требуется чрезвычайно редко, тем более что операции с числами такого типа требуют существенно большего времени, чем операции с числами целых или стандартных вещественных типов.
Б) денежный тип
–money – число с фиксированным количеством десятичных цифр в дробной части. Точность дробной части определяется на уровне базы данных параметром lc_monetary. В качестве альтернативы вместо типа money можно использовать тип numeric.
Внутреннее представление денежного типа – целое число типа bigint, поэтому все операции с типом money выполняются точно. Внешнее представление определяется встроенными в тип функциями ввода и вывода. Входные данные могут быть записаны по-разному, в том числе в виде целых и
15
дробных чисел, а также в виде строки в денежном формате, например '651,73р.'. Выводятся эти значения обычно в денежном формате, зависящем от региональных стандартов.
В) символьные типы
–character varying(n) (или varchar(n)) – строка переменной длины, но не более чем n символов;
–character(n) (или char(n)) – строка фиксированной длины ровно в n символов, дополненная при необходимости пробелами;
–text – строка неограниченной переменной длины.
SQL определяет два основных символьных типа: character varying(n) и character(n), где n – положительное число. Оба эти типа могут хранить текстовые строки длиной до n символов (не байт!). Кроме этих типов PostgreSQL предлагает тип text, в котором можно хранить строки произвольной длины. Тип text не описан в стандарте SQL, однако де-факто его поддерживают и ряд других СУБД.
Кодировка и правила сравнения текстовых строк определяется набором локальных настроек, установленных при создании базы данных.
Г) тип дата/время
PostgreSQL поддерживает большое количество различных типов даты и времени. Основные из них:
–date – только дата (без указания времени);
–time [ (p) ] [ without time zone ] – только время (без указания даты и часового пояса);
–timestamp [ (p) ] [ without time zone ] – дата и время (без указания часового пояса);
–timestamp [ (p) ] with time zone – дата, время и часовой пояс;
–interval – интервал времени между датами
Типы time и timestamp принимают необязательное значение точности p (0<=p<=6), определяющее, сколько знаков после запятой должно сохраняться в секундах. Указание without time zone в этих типах может быть опущено, это не повлияет на формат типа.
16
Формат ввода/вывода значений даты и времени
При вводе дат документация по СУБД PostgreSQL рекомендует использовать формат «год-месяц-день» в числовом варианте, например, строка '2016-01-20' соответствует дате 20 января 2016 года. Заметим, что допускаются и другие варианты, однако в некоторых форматах порядок даты, месяца и года во вводимой дате зависит от значения параметра datestyle в файле конфигурации postgresql.conf. Когда он имеет значение MDY, выбирается интерпретация «месяц-день-год», значению DMY соответствует «день-месяц-год», а YMD – «год-месяц-день».
При указании дат можно также использовать полные или сокращённые названия месяцев: January (Jan), February (Feb) и т.д. В этом случае структура даны распознаётся однозначно. Так, например, варианты '2016-Jan-20' и '20-Jan-2016' и 'Jan-20-2016' соответствуют одной и той же дате – 20 января 2016 года.
При вводе времени также можно использовать несколько разных форматов, например, '10:07' – 10 часов 7 минут 00 секунд или '10:07:23' – 10 часов 7 минут 23 секунды. По умолчанию используется 24-часовой формат времени. Для указания времени в 12-часовом формате необходимо добавить аббревиатуру AM (от латинского ante meridiem, дословно – «до полудня») или PM (от латинского post meridiem, дословно – «после полудня»). Заметим, что ввод времени в БД в «ручном» режиме требуется редко. При необходимости записать в таблицу текущее время используется функция now(), которая возвращает текущее время и дату в формате timestamp with time zone.
Основные функции для работы с датами
Функция now() возвращает текущую дату и время с часовым поясом. Чтобы выделить из полученного значения отдельно дату и отдельно время, проще всего использовать приведение типов. Пример.
SELECT now(), now()::date, now()::time;
17
Для извлечения более мелких элементов даты и времени используются функция date_part(атрибут, дата/время), где атрибут есть одно из следующих значений: 'year', 'month', 'day', 'hour', 'minute', 'second', 'timezone'.
Функция age(конечная_дата/время, начальная_дата/время) определяет промежуток между датами и возвращает результат в виде текстовой строки. Пример. Запрос
SELECT age('2016-02-29','2013-06-14');
вернёт строку "2 years 8 mons 15 days"
Если даты переставить местами, то получим в результате отрицательные значения: "-2 years -8 mons -15 days".
Д) Логический тип
–boolean – в поле (или переменной) логического типа можно хранить только два значения: «истина» (TRUE или true) или «ложь» (FALSE или false). Совместимыми с SQL являются варианты TRUE и FALSE.
При выводе PostgreSQL использует сокращения t для true и f для false.
Кроме базовых типов СУБД PostgreSQL содержит большое количество специальных типов, в частности:
–геометрические типы;
–битовые строки;
–сетевые адреса;
–типы для организации полнотекстового поиска;
–тип XML (eXtensible HyperText Markup Language);
–тип JSON (JavaScript Object Notation);
и другие Некоторые их них будут рассмотрены позже.
2.2.Типы данных, определяемые пользователем
ВСУБД PostgreSQL можно создавать свои типы данных, в частности, перечисления и составные типы. PostgreSQL позволяет использовать созданные типы в определениях таблиц и функций, точно так же, как и встроенные типы.
18
Перечисления создаются SQL-запросом вида
CREATE TYPE имя_перечисления AS ENUM (список значений); Например:
CREATE TYPE grade AS ENUM ('неуд', 'уд', 'хор', 'отл'); – запрос создаёт тип grade, который определяет набор экзаменационных оценок. С каждым элементом перечисления сопоставляется его номер в списке значений, вследствие чего эти значения могут участвовать в операциях сравнения. Заметим, что в данном примере именно из этих соображений выбран порядок значений в перечислении.
Составной тип соответствует типу «запись» в Паскале, т.е., это список имён полей с указанием их типов данных. Создадим, например, тип «комплексное число»:
CREATE TYPE complex AS (
Re |
double precision, |
Im |
double precision |
); |
|
где Re – вещественная часть комплексного числа, Im – мнимая часть комплексного числа.
При вводе и выводе значений объекта составного типа набор значений полей берётся в круглые скобки.
Для доступа к полю типа «запись» используется точечная нотация, однако в некоторых случаях, чтобы избежать неверной интерпретации объекта, имя поля должно браться в круглые скобки.
Наиболее характерным типом данных, отличающим СУБД PostgreSQL от классических реляционных баз данных, являются массивы. PostgreSQL позволяет определять поля таблицы как многомерные массивы переменной длины. Элементами массивов могут быть любые встроенные или определённые пользователями типы, перечисления или составные типы. Но, как и в большинстве языков программирования, все элементы массива должны иметь один и тот же тип.
19
Для объявления типа массива к названию типа элементов добавляется одна пара (для одномерных массивов) или несколько пар (для многомерных массивов) квадратных скобок ([]). При этом конкретный размер массива можно не указывать, так как в разных строках таблицы количество элементов массива может быть разным.
В следующих разделах будут приведены примеры использования полей-массивов в таблицах БД.
2.3.Создание схемы БД с помощью SQL-запросов
Спомощью SQL-запроса можно создать новую базу данных, определить структуру входящих в неё таблиц и установить связи между отдельными таблицами, т.е., создать полную схему базы данных. Покажем, как это делается.
А) Создание новой базы данных.
Базы данных создаются запросом CREATE DATABASE имя_БД; и
уничтожаются запросом DROP DATABASE имя_БД;. При этом владельцем БД становится роль, от имени которой выполнен запрос. Однако в запросе можно указать другого пользователя в качестве владельца этой базы данных, чтобы он мог выполнять все операции с ней самостоятельно. В этом случае SQL-запрос на создание БД будет иметь следующий вид:
CREATE DATABASE имя_БД OWNER имя_роли;
Для вывода всех существующих в кластере СУБД PostgreSQL баз данных, можно выполнить запрос к системной таблице pg_database:
SELECT datname FROM pg_database;
Если выполнить этот запрос, то кроме созданных нами БД мы увидим в списке ещё две БД: template1, template0. Это «пустые» схемы (шаблоны), по которым создаются новые БД. В template1 пользователь может добавлять любые объекты, которые автоматически будут появляться во вновь создаваемых БД. В template0 изменения вносить нельзя, этот шаблон используется, если потребуется восстановить исходное состояние шаблона template1. Заметим, что
20
