Материал: Using_MySql,_MS_SQL_Server_and_Oracle(1)

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Генерация и наполнение базы данных

Выполним ещё один запрос, чтобы посмотреть человекочитаемую информацию о том, кто и какие книги брал в библиотеке (подробнее об этом запросе сказано в примере 11{66}):

MySQL

1SELECT `b_name`,

2`s_id`,

3`s_name`,

4`sb_start`,

5`sb_finish`

6 FROM `books`

7JOIN `subscriptions`

8ON `b_id` = `sb_book`

9JOIN `subscribers`

10ON `sb_subscriber` = `s_id`

MS SQL

1SELECT [b_name],

2[s_id],

3[s_name],

4[sb_start],

5[sb_finish]

6 FROM [books]

7JOIN [subscriptions]

8ON [b_id] = [sb_book]

9JOIN [subscribers]

10ON [sb_subscriber] = [s_id]

Oracle

1SELECT "b_name",

2"s_id",

3"s_name",

4"sb_start",

5"sb_finish"

6FROM "books"

7JOIN "subscriptions"

8ON "b_id" = "sb_book"

9JOIN "subscribers"

10ON "sb_subscriber" = "s_id"

Врезультате выполнения этих запросов получится такой результат:

b_name

s_id

s_name

sb_start

sb_finish

Евгений Онегин

1

Иванов И.И.

2011-01-12

2011-02-12

Сказка о рыбаке и рыбке

1

Иванов И.И.

2012-06-11

2012-08-11

Искусство программирования

1

Иванов И.И.

2014-08-03

2014-10-03

Психология программирования

1

Иванов И.И.

2015-10-07

2015-11-07

Основание и империя

1

Иванов И.И.

2011-01-12

2011-02-12

Основание и империя

3

Сидоров С.С.

2012-05-17

2012-07-17

Язык программирования С++

3

Сидоров С.С.

2014-08-03

2014-10-03

Евгений Онегин

3

Сидоров С.С.

2014-08-03

2014-09-03

Язык программирования С++

4

Сидоров С.С.

2012-06-11

2012-08-11

Евгений Онегин

4

Сидоров С.С.

2015-10-07

2015-03-07

Психология программирования

4

Сидоров С.С.

2015-10-08

2025-11-08

Обратите внимание, что «Сидоров С.С.» на самом деле — два разных человека (с идентификаторами 3 и 4).

Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016–2018 Стр: 15/545

Генерация и наполнение базы данных

В базу данных «Большая библиотека» поместим следующее количество автоматически сгенерированных записей:

в таблицу authors — 10’000 имён авторов (допускается дублирование имён);

в таблицу books — 100’000 названий книг (допускается дублирование названий);

в таблицу genres — 100 названий жанров (все названия уникальны);

в таблицу subscribers — 1’000’000 имён читателей (допускается дублирование имён);

в таблицу m2m_books_authors — 1’000’000 связей «автор-книга» (допускается соавторство);

в таблицу m2m_books_genres — 1’000’000 связей «книга-жанр» (допускается принадлежность книги к нескольким жанрам);

в таблицу subscriptions — 10’000’000 записей о выдаче/возврате книг (возврат всегда наступает не раньше выдачи, допускаются ситуации, когда один и тот же читатель брал одну и ту же книгу много раз — даже не вернув предыдущий экземпляр).

При проведении экспериментов по оценке скорости выполнения запросов все операции с СУБД будут выполняться в небуферизируемом режиме (когда результаты выполнения запросов не передаются в пространство памяти приложения, их выполнявшего), а также перед каждой итерацией (кроме исследования 2.1.3.EXP.A{21}) кэш СУБД будет очищен следующим образом:

MySQL

1 RESET QUERY CACHE;

MS SQL

1DBCC FREEPROCCACHE;

2DBCC DROPCLEANBUFFERS;

Oracle

1ALTER SYSTEM FLUSH BUFFER_CACHE;

2ALTER SYSTEM FLUSH SHARED_POOL;

Итак, наполнение баз данных успешно завершено и можно переходить к решению задач.

Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016–2018 Стр: 16/545

Раздел 2: Запросы на выборку и модификацию данных

Раздел 2: Запросы на выборку и модификацию данных

2.1. Выборка из одной таблицы

2.1.1. Пример 1: выборка всех данных

 

Задача 2.1.1.a{17}: показать всю информацию обо всех читателях.

 

Ожидаемый результат 2.1.1.a.

 

 

 

s_id

s_name

 

1

Иванов И.И.

 

2

Петров П.П.

 

3

Сидоров С.С.

 

4

Сидоров С.С.

 

Решение 2.1.1.a{17}.

В данном случае достаточно самого простого запроса — классического SELECT *. Для всех трёх СУБД запросы совершенно одинаковы.

MySQL Решение 2.1.1.a

1SELECT *

2FROM `subscribers`

MS SQL Решение 2.1.1.a

1SELECT *

2FROM [subscribers]

Oracle Решение 2.1.1.a

1SELECT *

2FROM "subscribers"

Задание 2.1.1.TSK.A: показать всю информацию:

об авторах;

о жанрах.

Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016–2018 Стр: 17/545

Пример 2: выборка данных без повторения

2.1.2. Пример 2: выборка данных без повторения

Задача 2.1.2.a{18}: показать без повторений идентификаторы читателей, бравших в библиотеке книги.

Задача 2.1.2.b{19}: показать поимённый список читателей с указанием количества полных тёзок по каждому имени.

Ожидаемый результат 2.1.2.a.

sb_subscriber

1

3

4

Ожидаемый результат 2.1.2.b.

s_name

people_count

Иванов И.И.

1

Петров П.П.

1

Сидоров С.С.

2

Решение 2.1.2.a{18}.

Важным для получения правильного результата является использование ключевого слова DISTINCT, которое предписывает СУБД убрать из результирующей выборки все повторения.

MySQL Решение 2.1.2.a

1SELECT DISTINCT `sb_subscriber`

2FROM `subscriptions`

MS SQL Решение 2.1.2.a

1SELECT DISTINCT [sb_subscriber]

2FROM [subscriptions]

Oracle Решение 2.1.2.a

1SELECT DISTINCT "sb_subscriber"

2FROM "subscriptions"

Если ключевое слово DISTINCT удалить из запроса, результат выполнения будет таким (поскольку читатели брали книги по несколько раз каждый):

sb_subscriber

1

1

1

1

1

3

3

3

4

4

4

Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016–2018 Стр: 18/545

Пример 2: выборка данных без повторения

Важно понимать, что СУБД в DISTINCT-режиме выполнения запроса производит сравнение между собой не отдельных полей, а строк целиком, а потому, если хотя бы в одном поле между строками есть различие, строки не считаются идентичными.

Типичная ошибка — попытка использовать DISTINCT «как функцию». Допустим, мы хотим увидеть без повторений все имена читателей (напомним, «Сидоров С.С.» у нас встречается дважды), выбрав не только имя, но и идентификатор. Следующий запрос составлен неверно.

MySQL

Пример неверно составленного запроса 2.1.2.ERR.A

1

SELECT

DISTINCT(`s_name`),

2

 

 

`s_id`

3

FROM

`subscribers`

 

MS SQL

Пример неверно составленного запроса 2.1.2.ERR.A

1

SELECT

DISTINCT([s_name]),

2

 

 

[s_id]

3

FROM

[subscribers]

 

 

 

Oracle

 

Пример неверно составленного запроса 2.1.2.ERR.A

1

SELECT

DISTINCT("s_name"),

2

 

 

"s_id"

3

FROM

"subscribers"

В результате выполнения такого запроса мы получим результат, в котором «Сидоров С.С.» представлен дважды (дублирование не устранено) из-за того, что у этих записей разные идентификаторы (3 и 4), которые и не позволяют СУБД посчитать две соответствующие строки выборки совпадающими. Результат выполнения запроса 2.1.2.ERR.A будет таким:

s_name

s_id

Иванов И.И.

1

Петров П.П.

2

Сидоров С.С.

3

Сидоров С.С.

4

Частый вопрос: а как тогда решить эту задачу, как показать записи без повторения строк, в которых есть поля с различными значениями? В общем случае никак, т.к. сама постановка задачи неверна (мы просто потеряем часть данных).

Если задачу сформулировать несколько иначе (например, «показать поимённый список читателей с указанием количества полных тёзок по каждому имени»), то нам помогут группировки и агрегирующие функции. Подробно мы рассмотрим этот вопрос далее (см. пример 10{61}), а пока решим только что упомянутую задачу, чтобы показать разницу в работе запросов.

Решение 2.1.2.b{18}.

Используем конструкцию GROUP BY для группировки рядов выборки и функцию COUNT для подсчёта количества записей в каждой группе.

MySQL Решение 2.1.2.b

1SELECT `s_name`,

2COUNT(*) AS `people_count`

3

 

FROM

`subscribers`

4

 

GROUP

BY `s_name`

 

 

 

 

Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016–2018 Стр: 19/545

Источник: https://studfile.net/preview/16418462/