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

Глава 5. Дополнительные возможности 5.5. Работа со строками
X
TEXT DATA
Функция INITCAP
Функция INITCAP(str) возвращает строку str, в которой первые буквы всех слов преобразованы в прописные. Функция удобна
для форматирования полного имени при построении отчетов.
Пример:
SELECT INITCAPИваноВ(’ петр сиДорович’) X;
X
Иванов Петр Сидорович
Функции LTRIM и RTRIM
Функция LTRIM(str [,set]) удаляет все символы с начала
строки до первого символа, которого нет в наборе символов set.
По умолчанию set состоит из одного пробела и может не указываться. Функция RTRIM(str [,set]) аналогична LTRIM, но удаляет символы, начиная от конца строки. Рассмотрим несколько примеров:
SELECT LTRIM(’ TeXt DATA’) X1,
LTRIM(’ _ # TeXt DATA’, ’ #_’) X2,
LTRIM(’ 1234567890 TeXt DATA’, ’ 1234567890’) X3
UNION ALL
SELECT RTRIM(’TeXt DATA ’) X1,
RTRIM(’TeXt DATA _ # ’, ’ #_’) X2,
RTRIM(’TeXt DATA 1234567890 ’, ’ 1234567890’) X3;
X1 X2 X3
TeXt DATA TeXt DATA TeXt DATA
TeXt DATA TeXt DATA TeXt DATA
Функция REPLACE
Функция REPLACE(str, search_str, replace_str) осуществляет
поиск образца search_str в строке str и каждое найденное вхож-
101

5.5. Работа со строками Глава 5. Дополнительные возможности
дение заменяет на replace_str. Поиск подстроки ведется с учетом
регистра.
Пример:
SELECT REPLACEУ(’ попа была собака’, собака’’, кошка’’) X1,
REPLACEУ(’ попа была злая собака’, злая’’, ’’) X2,
REPLACEУ(’ попа была собака’, Собака’’, Кошка’’) X3;
X1 X2 X3
У попа была кошка У попа была собака У попа была собака
Функция TRANSLATE
Функция TRANSLATE(str, from_mask, to_mask) анализирует
строку str и заменяет в ней все символы, встречающиеся в строке
from_mask, на соответствующие символы из to_mask. Для корректной
работы функции строки from_mask и to_mask должны иметь
одинаковую длину или строка from_mask должна быть длиннее,
чем to_mask. Если from_mask длиннее, чем to_mask, и в процессе
обработки строки str обнаружатся символы, соответствующие
одному из символов from_mask, и при этом им не найдется
соответствия в to_mask, то такие символы будут удалены из строки
str. Если передать from_mask или to_mask значение, равное NULL,
то функция возвратит значение NULL. Сравнение производится с
учетом регистра.
Примеры:
SELECT TRANSLATE(’Test 12345’, ’e2’, ’E!’) X1,
TRANSLATE(’Test 12345’, ’e234’, ’E’) X2;
X1 X2
TEst 1!345 TEst 15
Данная функция удобна для решения ряда практических задач, связанных с перекодировкой символов или с поиском запрещенных символов. Например, необходимо проанализировать пароль и выяснить, содержит ли он хотя бы одну цифру. Реализация
данной проверки при помощи TRANSLATE имеет вид:
102

Глава 5. Дополнительные возможности 5.5. Работа со строками
CREATE OR REPLACE FUNCTION is_password_correct(
password IN char)
RETURNS int AS $is_password_correct$
BEGIN
IF TRANSLATE(password, ’0123456789’, ’*’) = password THEN
RAISE WARNING
Пароль’ должен содержать хотя бы одну цифру!’;
RETURN 0;
END IF;
RAISE INFO Корректный’ пароль!’;
RETURN 1;
END;
$is_password_correct$ LANGUAGE plpgsql;
Другой пример: идет подготовка числа к его преобразованию
в NUMBER. Необходимо заменить разделители десятичных знаков ’,’
на ’.’ и удалить пробелы. Реализация данной операции при помощи
TRANSLATE имеет вид:
SELECT TRANSLATE(’123 455,23’, ’., ’, ’..’) X1,
TRANSLATE(’-123 455.23’, ’., ’, ’..’) X2;
X1 X2
123455.23 –123455.23
Функция SUBSTR
Функция SUBSTR(str, m [,n]) возвращает фрагмент строки
str, начиная с символа m длиной n символов. Длину можно не
указывать – в этом случае возвращается строка от символа m и до
конца строки str. Нумерация символов идет с 1. Если указать m
равное 0, то копирование все равно начнется с первого символа.
Задание отрицательного значения m приводит к тому, что символы
отсчитываются от конца строки, а не от начала. Задание значений
m, превышающих по абсолютному значению длину строки, приводит
к тому, что функция возвращает NULL.
103

5.5. Работа со строками Глава 5. Дополнительные возможности
Пример:
SELECT SUBSTRУ(’ попа была собака’, 13) X1,
SUBSTRУ(’ попа была собака’, -6) X2,
SUBSTRЭто(’ тестовый текст’, 5, 8) X3,
SUBSTRУ(’ попа была собака’, 150) X4;
X1 X2 X3 X4
собака собака текстовый NULL
Функция LENGTH
Функция LENGTH(str) возвращает длину строки str в символах.
Для пустой строки функция вернет 0, а для значения NULL – NULL.
Пример:
SELECT LENGTHУ(’ попа была собака’) X1,
LENGTH(’’) X2,
LENGTH(NULL) X3;
X1 X2 X3
18 0 NULL
Функция ASCII
Функция ASCII(str) возвращает ASCII-код первого символа
строки str в случае применения кодировок ASCII и UTF-8.
Пример:
SELECT
ASCII(’Test’) X1,
ASCIIТест(’’) X2;
X1 X2
84 1058
104

Глава 5. Дополнительные возможности 5.6. Работа с датой и временем
Функция CHR
Функция CHR(n) возвращает символ по его коду.
Пример:
SELECT
CHR(84) X1,
CHR(1058) X2,
CHR(80) X3,
CHR(1060) X4;
X1 X2 X3 X4
T Т P Ф
5.6 Функции работы с датой и временем
В данном подразделе речь пойдет о функциях работы с датой и
временем, а также функциями преобразования типов для даты. Для
хранения даты и времени в PostgreSQL предусмотрен специальный
тип timestamp. С физической точки зрения это дробное число, целая
часть которого хранит количество дней с некоторой базовой даты,
а дробная – время. Это позволяет совершать над датами арифметические операции – сложение и вычитание.
Функция NOW
Это одна из самых часто употребляемых функций, она возвращает текущую дату и время по часам сервера.
Пример:
SELECT NOW();
NOW
2016-09-05 21:31:10.095806+04
105

5.6. Работа с датой и временем Глава 5. Дополнительные возможности
Функция JUSTIFY_INTERVAL
Функция JUSTIFY_INTERVAL(interval) преобразует интервал
(тип interval), указанный в виде строки в соответствующее значение типа timestamp.
Пример:
SELECT NOW() D1,
NOW() + JUSTIFY_INTERVAL(’30 DAYS 1 HOUR 2 MINUTE’) D2,
NOW() - JUSTIFY_INTERVAL(’30 DAYS 1 HOUR 2 MINUTE’) D3;
D1 D2 D3
2016-09-05 21:39:08...+04 2016-10-05 22:41:08...+04 2016-08-05 20:37:08...+04
Функция DATE_TRUNC
Функция DATE_TRUNC(timestamp) используется для обрезки даты или интервала (DATE_TRUNC(interval)) до определенной точности.
Пример:
SELECT
DATE_TRUNC(’HOUR’, NOW()) D1,
DATE_TRUNC(’DAY’, NOW()) D2,
DATE_TRUNC(’MONTH’, NOW()) D3;
D1 D2 D3
2016-09-05 22:00:00+04 2016-09-05 00:00:00+04 2016-09-01 00:00:00+04
Получение начала и конца месяца
Для получения дат соответствующих началу и концу месяца
необходимо использовать функции DATE_TRUNC и JUSTIFY_INTERVAL.
Пример:
SELECT
DATE_TRUNC(’MONTH’, NOW()) D1,
DATE_TRUNC(’MONTH’, NOW())
+ JUSTIFY_INTERVAL(’1 MONTH - 1 DAY’) D2;
106

Глава 5. Дополнительные возможности 5.6. Работа с датой и временем
D1 D2
2016-09-01 00:00:00+04 2016-09-30 00:00:00+04
Данные функции также могут быть использованы для опреде-
ления количества дней в заданном месяце.
Например:
SELECT NOW() D1,
TO_CHAR(DATE_TRUNC(’MONTH’, NOW())
+ JUSTIFY_INTERVAL(’1 MONTH - 1 DAY’), ’DD’) D2;
D1 D2
2016-09-05 21:51:19.727702+04 30
Функция AGE
Функция AGE([end_date, ]start_date) возвращает разницу
между датами, обозначенными как end_date и start_date. Если параметр end_date опущен, то используется значение глобальной переменной CURRENT_DATE, которая содержит текущую дату (тип date,
дата без времени).
Пример:
SELECT
CURRENT_DATE D1,
AGE(MAKE_TIMESTAMP(2013, 7, 15, 8, 15, 23.5)) D2,
AGE(MAKE_DATE(2016, 3, 3),
MAKE_TIMESTAMP(2013, 7, 15, 8, 15, 23.5)) D3;
D1 D2 D3
2016-09-05 3 years 1 mon 20 days 15:44:36.5 2 years 7 mons 18 days 15:44:36.5
В данном примере также используются функции
MAKE_TIMESTAMP и MAKE_DATE, которые возвращают значения типов
timestamp и date соответственно.
Функция EXTRACT
Функция EXTRACT(field FROM timestamp) извлекает элемент даты field из значения типа timestamp. Также существует функ-
107

5.6. Работа с датой и временем Глава 5. Дополнительные возможности
ция EXTRACT(field FROM interval) для работы со значениями типа
interval.
Пример:
SELECT
NOW() D1,
EXTRACT(MONTH FROM NOW()) D2,
EXTRACT(YEAR FROM NOW()) D3,
EXTRACT(MINUTE FROM NOW()) D4;
D1 D2 D3 D4
2016-09-05 22:37:54.6046+04 9 2016 37
Количество месяцев между двумя датами
Функции EXTRACT, AGE и DATE_TRUNC могут быть использованы
для нахождения количества месяцев между двумя датами.
Пример:
SELECT
NOW() D1,
EXTRACT(MONTH FROM AGE(DATE_TRUNC(’MONTH’, NOW()),
DATE_TRUNC(’MONTH’, MAKE_DATE(2016, 3, 3)))) D2;
D1 D2
2016-09-05 22:41:08.68334+04 6
Функция TO_DATE
Функция TO_DATE(str, mask) преобразует строку str в дату.
Преобразование ведется по маске mask.
Пример:
SELECT
TO_DATE(’05 Dec 2000’, ’DD Mon YYY’) D1,
TO_DATE(’15.12.2000’, ’dd.mm.yy’) D2;
D1 D2
2000-12-05 2000-12-05
108

Глава 5. Дополнительные возможности 5.7. Контрольные вопросы
Функция TO_CHAR
Функция TO_CHAR(date, mask) преобразует дату date в символьную строку в соответствии с заданной маской.
Пример:
SELECT NOW() D1,
TO_CHAR(NOW(), ’DD.MM.YY HH24:MI’) D2;
Например:
D1 D2
2016-09-05 22:49:37.044199+04 05.09.16 22:49
Некоторые форматные маски представлены в таблице 5.1.
Полный список масок и их описание представлен в [6].
Таблица 5.1
Маски для форматирования даты и времени
Маска Назначение
СС Номер века
YYYY, или YY Четыре или последние две цифры номе-
ра года
Q Номер квартала
MONTH, или MON, или MM Строковое или числовое представление
номера месяца
WW Номер недели в году
W Номер недели в месяце
DDD Номер дня в году
DD Номер дня в месяце
DAY, или DY, или ID Номер дня недели
HH, или HH12, или HH24 Час
MI Минута
5.7 Контрольные вопросы
1. Перечислите основные функции PostgreSQL для работы с числами.
2. Перечислите основные тригонометрические функции
PostgreSQL.
109

5.7. Контрольные вопросы Глава 5. Дополнительные возможности
3. Перечислите основные функции PostgreSQL для работы со
строками.
4. Перечислите основные функции PostgreSQL для работы с датой
и временем.
110
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
