Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
8
Добавлен:
15.01.2021
Размер:
14.96 Mб
Скачать

2020

Работа с MySQL, MS SQL Server и Oracle

в примерах

РЕФЕРАТ НА ТЕМУ "СОВРЕМЕННЫЕ СУБД"

B.MARCHUK@ISTU.EDU.UA

МАРЧУК БОГДАН | група к81

Работа с MySQL, MS SQL Server и Oracle

в примерах

Практическое пособие для программистов и тестировщиков

2020

Работа с MySQL, MS SQL Server и Oracle в примерах

Содержание

ПРЕДИСЛОВИЕ..........................................................................................................................................

4

РАЗДЕЛ 1: МОДЕЛЬ, ГЕНЕРАЦИЯ И НАПОЛНЕНИЕ БАЗЫ ДАННЫХ..............................................

5

1.1.

ОБЩЕЕ ОПИСАНИЕ МОДЕЛИ ......................................................................................................

5

1.2.

МОДЕЛЬ ДЛЯ MYSQL.....................................................................................................................

7

1.3. МОДЕЛЬ ДЛЯ MS SQL SERVER....................................................................................................

9

1.4.

МОДЕЛЬ ДЛЯ ORACLE ................................................................................................................

11

1.5. ГЕНЕРАЦИЯ И НАПОЛНЕНИЕ БАЗЫ ДАННЫХ ......................................................................

12

РАЗДЕЛ 2: ЗАПРОСЫ НА ВЫБОРКУ И МОДИФИКАЦИЮ ДАННЫХ ...............................................

17

2.1. ВЫБОРКА ИЗ ОДНОЙ ТАБЛИЦЫ ..............................................................................................

17

2.1.1.

ПРИМЕР 1: ВЫБОРКА ВСЕХ ДАННЫХ .....................................................................................

17

2.1.2.

ПРИМЕР 2: ВЫБОРКА ДАННЫХ БЕЗ ПОВТОРЕНИЯ................................................................

18

2.1.3.ПРИМЕР 3: ИСПОЛЬЗОВАНИЕ ФУНКЦИИ COUNT И ОЦЕНКА ЕЁ ПРОИЗВОДИТЕЛЬНОСТИ .21

2.1.4.

ПРИМЕР 4: ИСПОЛЬЗОВАНИЕ ФУНКЦИИ COUNT В ЗАПРОСЕ С УСЛОВИЕМ .......................

29

2.1.5.

ПРИМЕР 5: ИСПОЛЬЗОВАНИЕ ФУНКЦИЙ SUM, MIN, MAX, AVG ..........................................

31

2.1.6.

ПРИМЕР 6: УПОРЯДОЧИВАНИЕ ВЫБОРКИ.............................................................................

35

2.1.7.

ПРИМЕР 7: ИСПОЛЬЗОВАНИЕ СОСТАВНЫХ УСЛОВИЙ .........................................................

39

2.1.8.

ПРИМЕР 8: ПОИСК МНОЖЕСТВА МИНИМАЛЬНЫХ И МАКСИМАЛЬНЫХ ЗНАЧЕНИЙ..............

43

2.1.9.

ПРИМЕР 9: ВЫЧИСЛЕНИЕ СРЕДНЕГО ЗНАЧЕНИЯ АГРЕГИРОВАННЫХ ДАННЫХ ..................

55

2.1.10.

ПРИМЕР 10: ИСПОЛЬЗОВАНИЕ ГРУППИРОВКИ ДАННЫХ .......................................................

61

2.2. ВЫБОРКА ИЗ НЕСКОЛЬКИХ ТАБЛИЦ ......................................................................................

66

2.2.1.

ПРИМЕР 11:

ЗАПРОСЫ НА ОБЪЕДИНЕНИЕ КАК СПОСОБ ПОЛУЧЕНИЯ

ЧЕЛОВЕКОЧИТАЕМЫХ ДАННЫХ .66

 

 

2.2.2.

ПРИМЕР12: ЗАПРОСЫ НА ОБЪЕДИНЕНИЕ И ПРЕОБРАЗОВАНИЕ СТОЛБЦОВ В СТРОКИ ...

71

2.2.3.

ПРИМЕР13: ЗАПРОСЫ НА ОБЪЕДИНЕНИЕ И ПОДЗАПРОСЫ С УСЛОВИЕМ IN ....................

82

2.2.4.ПРИМЕР14: НЕТРИВИАЛЬНЫЕ СЛУЧАИ ИСПОЛЬЗОВАНИЯ УСЛОВИЯ IN И ЗАПРОСОВ НА

ОБЪЕДИНЕНИЕ .......................................................................................................................................................................

92

2.2.5.

ПРИМЕР 15: ДВОЙНОЕ ИСПОЛЬЗОВАНИЕ УСЛОВИЯ IN........................................................

97

2.2.6.

ПРИМЕР 16: ЗАПРОСЫ НА ОБЪЕДИНЕНИЕ И ФУНКЦИЯ COUNT........................................

102

2.2.7.ПРИМЕР 17: ЗАПРОСЫ НА ОБЪЕДИНЕНИЕ, ФУНКЦИЯ COUNT И АГРЕГИРУЮЩИЕ ФУНКЦИИ

114

2.2.8. ПРИМЕР 18: УЧЁТ ВАРИАНТОВ И КОМБИНАЦИЙ ПРИЗНАКОВ ............................................

127

2.2.9.ПРИМЕР 19: ЗАПРОСЫ НА ОБЪЕДИНЕНИЕ И ПОИСК МИНИМУМА, МАКСИМУМА,

 

 

ДИАПАЗОНОВ

132

 

2.2.10.

ПРИМЕР 20: ВСЕ РАЗНОВИДНОСТИ ЗАПРОСОВ НА ОБЪЕДИНЕНИЕ В ТРЁХ .................

СУБД

 

 

149

 

 

2.3.

МОДИФИКАЦИЯ ДАННЫХ ........................................................................................................

 

182

2.3.1.

ПРИМЕР 21: ВСТАВКА ДАННЫХ ............................................................................................

 

182

2.3.2.

ПРИМЕР 22: ОБНОВЛЕНИЕ ДАННЫХ ....................................................................................

 

190

2.3.3.

ПРИМЕР 23: УДАЛЕНИЕ ДАННЫХ .........................................................................................

 

193

2.3.4.

ПРИМЕР 24: СЛИЯНИЕ ДАННЫХ...........................................................................................

 

195

2.3.5.

ПРИМЕР 25: ИСПОЛЬЗОВАНИЕ УСЛОВИЙ ПРИ МОДИФИКАЦИИ ДАННЫХ..........................

200

РАЗДЕЛ 3: ИСПОЛЬЗОВАНИЕ ПРЕДСТАВЛЕНИЙ ..........................................................................

 

210

3.1.

ВЫБОРКА ДАННЫХ С ИСПОЛЬЗОВАНИЕМ ПРЕДСТАВЛЕНИЙ.......................................

 

210

3.1.1. ПРИМЕР 26:ВЫБОРКА ДАННЫХ С ИСПОЛЬЗОВАНИЕМ НЕКЭШИРУЮЩИХ ПРЕДСТАВЛЕНИЙ 210

3.1.2. ПРИМЕР 27: ВЫБОРКА ДАННЫХ С ИСПОЛЬЗОВАНИЕМ КЭШИРУЮЩИХ ПРЕДСТАВЛЕНИЙ И

Работа с MySQL, MS SQL Server и Oracle в примерах © Богдан Марчук Стр: 2/545

Работа с MySQL, MS SQL Server и Oracle в примерах

ТАБЛИЦ 215 3.1.3. ПРИМЕР 28: ИСПОЛЬЗОВАНИЕ ПРЕДСТАВЛЕНИЙ ДЛЯ СОКРЫТИЯ ЗНАЧЕНИЙ И СТРУКТУР

ДАННЫХ241

3.2. МОДИФИКАЦИЯ ДАННЫХ С ИСПОЛЬЗОВАНИЕМ ПРЕДСТАВЛЕНИЙ ............................

245

3.2.1.

 

ПРИМЕР 29: МОДИФИКАЦИЯ ДАННЫХ С ИСПОЛЬЗОВАНИЕМ «ПРОЗРАЧНЫХ»

ПРЕДСТАВЛЕНИЙ ....

245

 

3.2.2.

ПРИМЕР 30: МОДИФИКАЦИЯ ДАННЫХ С ИСПОЛЬЗОВАНИЕМ ТРИГГЕРОВ

НА

ПРЕДСТАВЛЕНИЯХ

257

 

РАЗДЕЛ 4: ИСПОЛЬЗОВАНИЕ ТРИГГЕРОВ......................................................................................

272

4.1. АГРЕГАЦИЯ ДАННЫХ С ИСПОЛЬЗОВАНИЕМ ТРИГГЕРОВ................................................

272

4.1.1.

 

ПРИМЕР .....................................................................................................................

31:

ОБНОВЛЕНИЕ КЭШИРУЮЩИХ ТАБЛИЦ И ПОЛЕЙ....................................................................................

272

4.1.2.

ПРИМЕР 32: ОБЕСПЕЧЕНИЕ КОНСИСТЕНТНОСТИ ДАННЫХ...............................................

292

4.2.

КОНТРОЛЬ

ОПЕРАЦИЙ С ДАННЫМИ С ИСПОЛЬЗОВАНИЕМ ТРИГГЕРОВ...................

315

4.2.1.

 

ПРИМЕР .....................................................................................................................

33:

КОНТРОЛЬ ОПЕРАЦИЙ МОДИФИКАЦИИ ДАННЫХ ...................................................................................

315

4.2.2.

ПРИМЕР 34: КОНТРОЛЬ ФОРМАТА И ЗНАЧЕНИЙ ДАННЫХ..................................................

338

4.2.3.

ПРИМЕР 35: ПРОЗРАЧНОЕ ИСПРАВЛЕНИЕ ОШИБОК В ДАННЫХ........................................

344

РАЗДЕЛ 5: ИСПОЛЬЗОВАНИЕ ХРАНИМЫХ ФУНКЦИЙ И ПРОЦЕДУР..........................................

352

5.1.

ИСПОЛЬЗОВАНИЕ ХРАНИМЫХ ФУНКЦИЙ............................................................................

352

5.1.1.ПРИМЕР 36: ВЫБОРКА И МОДИФИКАЦИЯ ДАННЫХ С ИСПОЛЬЗОВАНИЕМ ХРАНИМЫХ ФУНКЦИЙ 352

5.1.2.ПРИМЕР 37: КОНТРОЛЬ ОПЕРАЦИЙ С ДАННЫМИ С ИСПОЛЬЗОВАНИЕМ ХРАНИМЫХ ФУНКЦИЙ 370

5.2. ИСПОЛЬЗОВАНИЕ ХРАНИМЫХ ПРОЦЕДУР..........................................................................

375

5.2.1.ПРИМЕР 38: ВЫПОЛНЕНИЕ ДИНАМИЧЕСКИХ ЗАПРОСОВ С ПОМОЩЬЮ ХРАНИМЫХ ПРОЦЕДУР 375

5.2.2.ПРИМЕР 39: ОПТИМИЗАЦИЯ ПРОИЗВОДИТЕЛЬНОСТИ С ПОМОЩЬЮ ХРАНИМЫХ ПРОЦЕДУР

388

5.2.3.ПРИМЕР 40: УПРАВЛЕНИЕ СТРУКТУРАМИ БАЗЫ ДАННЫХ С ПОМОЩЬЮ ХРАНИМЫХ ПРОЦЕДУР 400

РАЗДЕЛ 6: ИСПОЛЬЗОВАНИЕ ТРАНЗАКЦИЙ ..................................................................................

408

6.1.

УПРАВЛЕНИЕ НЕЯВНЫМИ И ЯВНЫМИ ТРАНЗАКЦИЯМИ................................................

408

6.1.1.

ПРИМЕР 41: УПРАВЛЕНИЕ НЕЯВНЫМИ ТРАНЗАКЦИЯМИ ...................................................

408

6.1.2.

ПРИМЕР 42: УПРАВЛЕНИЕ ЯВНЫМИ ТРАНЗАКЦИЯМИ ........................................................

419

6.2.

КОНКУРИРУЮЩИЕ ТРАНЗАКЦИИ ...........................................................................................

428

6.2.1.

ПРИМЕР 43: УПРАВЛЕНИЕ УРОВНЕМ ИЗОЛИРОВАННОСТИ ТРАНЗАКЦИЙ ........................

428

6.2.2.

ПРИМЕР 44: ВЗАИМОДЕЙСТВИЕ КОНКУРИРУЮЩИХ ТРАНЗАКЦИЙ ....................................

434

6.2.3.

ПРИМЕР 45: УПРАВЛЕНИЕ ТРАНЗАКЦИЯМИ В ТРИГГЕРАХ, ХРАНИМЫХ ФУНКЦИЯХ И

ПРОЦЕДУРАХ .465

 

РАЗДЕЛ 7: РЕШЕНИЕ ТИПИЧНЫХ ЗАДАЧ И ВЫПОЛНЕНИЕ ТИПИЧНЫХ ОПЕРАЦИЙ ............

474

7.1. РАБОТА С ИЕРАРХИЧЕСКИМИ И СВЯЗАННЫМИ СТРУКТУРАМИ ....................................

474

7.1.1. ПРИМЕР 46: ФОРМИРОВАНИЕ И АНАЛИЗ ИЕРАРХИЧЕСКИХ СТРУКТУР..............................

474

7.1.2. ПРИМЕР 47: ФОРМИРОВАНИЕ И АНАЛИЗ СВЯЗАННЫХ СТРУКТУР .....................................

490

7.2. ОПЕРАЦИИ С БАЗАМИ ДАННЫХ.............................................................................................

516

7.2.1. ПРИМЕР 48: РЕЗЕРВНОЕ КОПИРОВАНИЕ И ВОССТАНОВЛЕНИЕ БАЗЫ ДАННЫХ ...............

516

7.3.

ОПЕРАЦИИ С СУБД....................................................................................................................

522

Работа с MySQL, MS SQL Server и Oracle в примерах © Богдан Марчук Стр: 3/545

Работа с MySQL, MS SQL Server и Oracle в примерах

 

7.3.1. ПРИМЕР 49: УПРАВЛЕНИЕ ПОЛЬЗОВАТЕЛЯМИ, ЗАПУСК И ОСТАНОВКА СУБД..................

522

7.3.2. ПРИМЕР 50: ОПРЕДЕЛЕНИЕ И ИЗМЕНЕНИЕ КОДИРОВОК....................................................

525

7.4. ПОЛЕЗНЫЕ ОПЕРАЦИИ С ДАННЫМИ ...................................................................................

528

7.4.1. ПРИМЕР 51: ВЫЧИСЛЕНИЕ ДАТ ............................................................................................

528

7.4.2. ПРИМЕР 52: ПОЛУЧЕНИЕ КОМБИНАЦИИ НЕПОВТОРЯЮЩИХСЯ ИДЕНТИФИКАТОРОВ ......

536

РАЗДЕЛ 8: КРАТКОЕ СРАВНЕНИЕ MYSQL, MS SQL SERVER, ORACLE ......................................

541

РАЗДЕЛ 9: ЛИЦЕНЗИЯ И РАСПРОСТРАНЕНИЕ ...............................................................................

545

Работа с MySQL, MS SQL Server и Oracle в примерах © Богдан Марчук Стр: 4/545

Предисловие

Предисловие

.

Все примеры представлены в виде постановки задачи и её решения с использованием MySQL, MS SQL Server и Oracle, а также снабжены пояснениями и разбором типичных ошибок.

Этот материал в первую очередь будет полезен тем, кто:

когда-то изучал базы данных, но многое забыл;

имеет опыт работы с одной СУБД, но хочет быстро переключиться на другую;

хочет в предельно сжатые сроки научиться писать типичные SQL-запросы.

Все решения выполнены на MySQL Community Server 5.6, Microsoft SQL Server Express 2012, Oracle 11gR2 Express Edition и, скорее всего, успешно будут работать на более новых версиях этих СУБД, но не на более старых.

В большинстве решений со сложной логикой алгоритм пояснён на примере MySQL, а для двух других СУБД лишь приведён код с небольшими комментариями, потому желательно рассматривать решения для всех трёх СУБД, даже если вам интересна только одна из них.

Исходные материалы (схемы, скрипты и т.д.) можно получить по этой ссылке: http://svyatoslav.biz/database_book_download/src.zip

Условные обозначения, используемые в этой книге:

Постановка задачи. Сразу отметим, что почти в каждом рассмотренном примере приведено несколько задач. Поскольку решение задачи в некоторых случаях будет размещено далеко от её формулировки, рядом с но-

мером задачи в фигурных скобках будет приведена {ссылка} на решение. Ожидаемый результат. Сначала мы будем показывать, что должно получаться при правильном решении задачи, а потом — само решение. Решение задачи. Решение всегда будет приведено для MySQL, MS SQL Server и Oracle. Иногда решения будут похожими, иногда очень разными. Поскольку решение задачи в некоторых случаях будет размещено далеко

от её формулировки, рядом с номером решения в фигурных скобках будет приведена {ссылка} на формулировку задачи.

Исследование. Это — тоже задача, но уже не на получение неких данных, а на проверку того, как ведёт себя СУБД в некоторых условиях. Предостережение. Мы будем рассматривать типичные ошибки и приводить пояснения их причин и последствий.

Задание для самостоятельной проработки. Настоятельно рекоменду-

ется выполнять эти задания. Даже если вам кажется, что всё очень просто. Если, напротив, вам кажется, что всё очень сложно — сначала попробуйте самостоятельно решить уже разобранные примеры, обращаясь к готовому

решению лишь для самопроверки.

Раздел 1: Модель, генерация и наполнение базы данных

Раздел 1: Модель, генерация и наполнение базы данных 1.1. Общее описание модели

Для решения задач и рассмотрения примеров мы будем использовать три базы данных: «Библиотека», «Большая библиотека» и «Исследование». База данных «Исследование» будет состоять из множества разрозненных таблиц, необходимых для демонстрации особенностей поведения СУБД, и мы будем формировать

Работа с MySQL, MS SQL Server и Oracle в примерах © Богдан Марчук Стр: 5/545

её постепенно по мере проведения экспериментов. Также в ней будет физически расположена база данных «Большая библиотека».

Модели баз данных «Библиотека» и «Большая библиотека» полностью идентичны (отличаются эти базы данных только количеством записей). Здесь всего семь таблиц:

genres — описывает литературные жанры:

og_id — идентификатор жанра (число, первичный ключ);

og_name — имя жанра (строка);

books — описывает книги в библиотеке:

ob_id — идентификатор книги (число, первичный ключ);

ob_name — название книги (строка);

ob_year — год издания (число);

ob_quantity — количество экземпляров книги в библиотеке (число);

authors — описывает авторов книг:

oa_id — идентификатор автора (число, первичный ключ);

oa_name — имя автора (строка);

subscribers — описывает читателей (подписчиков) библиотеки:

os_id — идентификатор читателя (число, первичный ключ);

os_name — имя читателя (строка);

subscriptions — описывает факты выдачи/возврата книг (т.н. «подписки»):

osb_id — идентификатор подписки (число, первичный ключ);

osb_subscriber — идентификатор читателя (подписчика) (число, внешний ключ);

osb_book — идентификатор книги (число, внешний ключ);

osb_start — дата выдачи книги (дата);

osb_finish — запланированная дата возврата книги (дата);

osb_is_active — признак активности подписки (содержит значение Y, если книга ещё на руках у читателя, и N, если книга уже возвращена в библиотеку);

m2m_books_genres — служебная таблица для организации связи «многие ко многим» между таблицами books и genres:

ob_id — идентификатор книги (число, внешний ключ, часть составного

первичного ключа);

og_id — идентификатор жанра (число, внешний ключ, часть составного первичного ключа);

m2m_books_authors — служебная таблица для организации связи «многие ко многим» между таблицами books и authors:

ob_id — идентификатор книги (число, внешний ключ, часть составного

первичного ключа);

o a_id — идентификатор автора (число, внешний ключ, часть состав ного первичного ключа).

Общее описание модели

В таблицах m2m_books_genres и m2m_books_authors оба внешних ключа входят в составной первичный ключ, чтобы исключить ситуацию, когда, например, принадлежность некоторой книги некоторому жанру будет указана более одного раза (такие ошибки приводят к неверной работе запросов вида «посчитать, к скольким жанрам относится книга»).

Общая схема базы данных представлена на рисунке 1.a. Скрипты генерации

Работа с MySQL, MS SQL Server и Oracle в примерах © Богдан Марчук Стр: 6/545

баз данных для каждой СУБД вы можете найти в исходном материале, ссылка на который приведена в предисловии*4*.

class Library_data_model

Рисунок 1 .a — Общая схема базы данных

Работа с MySQL, MS SQL Server и Oracle в примерах © Богдан Марчук Стр: 7/545

Модель для MySQL

1.2. Модель для MySQL

Модель базы данных для MySQL представлена на рисунках 1.b и 1.c. Обратите внимание на следующие важные моменты:

Первичные ключи представлены беззнаковыми целыми числами для расширения максимального диапазона значений.

Строки представлены типом varchar длиной до 150 символов (чтобы гарантированно уложиться в ограничение 767 байт на длину индекса; 150*4 = 600, MySQL выравнивает символы UTF-строк на длину в четыре байта на символ при операциях сравнения).

Поле sb_is_active представлено характерным для MySQL типом данных enum (позволяющим выбрать одно из указанных значений и очень удобным для хранения заранее известного предопределённого набора значений — Y и N в нашем случае).

Поле g_name сделано уникальным, т.к. существование одноимённых жанров недопустимо.

Поля sb_start и sb_finish представлены типом date (а не более полными, например, datetime), т.к. мы храним дату выдачи и возврата книги с точностью до дня.

class MySQL_schema

Рисунок 1.b — Модель базы данных для MySQL в Sparx EA

Работа с MySQL, MS SQL Server и Oracle в примерах © Богдан Марчук Стр: 8/545

Модель для MySQL

genres

I books

gJdlNT(lO)

bjd INT(IO)

 

 

zg name VARCHAR(150)

4>b_name VARCHAR(150)

 

 

\>b_year SMALLINT(5)

PRIMARY

>>b_quantity SMA_LINT(5)

UQ genres g name

 

 

 

PRIMARY

 

 

 

 

 

 

 

 

 

Ж 7Г

I m2m_books_genres

t bjd INTC10)

» gjd INT(10)

A

Isubscriptions

'sbjd INT(10)

sb_subscri ber INT (10)

sb_book INT (10)

>sb_start DATE >sb_finish DATE >sb_is_active ENUMfY’/N’)

PRIMARY

FK_subscri ptions_book s FK subscri ptions subscri bers

I m2m._books_.authors

PRIMARY

t bjd INT(10)

FKjn 2m books genres genres

t ajd INr(10)

□ subscribers

sjd INT(10)

s>s_name VARCHAR(150)

Indexes

PRIMARY

J authors

ajd INT(IO)

44- > a name VAR CH AR (150)

Indexes

PRIMARY

>-

Indexes

PRIMARY

FK m 2m books authors authors

Рисунок 1.c — Модель базы данных для MySQL в MySQL Workbench

Работа с MySQL, MS SQL Server и Oracle в примерах © Богдан Марчук Стр: 9/545