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

Соединение данных из множества таблиц. Рекомендации по выполнению работы и перечень типовых заданий. Учебно–методическое пособие

.pdf
Скачиваний:
0
Добавлен:
15.08.2026
Размер:
1 Мб
Скачать

Министерство транспорта Российской Федерации Федеральное государственное автономное образовательное учреждение высшего образования

«Российский университет транспорта» (МИИТ)

Институт транспортной техники и систем управления

Кафедра «Управление и защита информации»

М. А. Васильева Е. П. Балакина М. В. Васильева

Соединение данных из множества таблиц. Рекомендации по выполнению работы и перечень типовых заданий

Учебно–методическое пособие для бакалавров по направлению

«Управление в технических системах» профиля «Управление и информатика в технических системах», а также специалистов

по специальности «Компьютерная безопасность» специализации «Информационная безопасность объектов информатизации на базе компьютерных систем»

Москва 2024

УДК 681.3.06

В–19

Васильева М. А., Балакина Е. П., Васильева М. В. Соединение данных из множества таблиц. Рекомендации по выполнению работы и перечень типовых заданий. Учебно–методическое пособие. Издание второе, исправленное и дополненное. – М.: РУТ (МИИТ).2024. – 72с.

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

Учебно–методическое пособие предназначено для обучающихся по направлению «Управление в технических системах» профиля «Управление и информатика в технических системах» (27.03.04), а также обучающихся по специальности «Компьютерная безопасность» специализации «Информационная безопасность объектов информатизации на базе компьютерных систем» (10.05.01).

Рецензент:

Ведущий научный сотрудник ФГБУ «ИПГ» к. ф-м. н. Палей А. А.

© Васильева М. А., 2024 © Балакина Е. П., 2024 © Васильева М. В., 2024

Содержание

 

Введение.............................................................................................................

5

Цель работы:...................................................................................................

5

Рекомендации по выполнению работы........................................................

6

Оператор INNER JOIN ................................................................................

6

Оператор OUTER JOIN ..............................................................................

10

 

LEFT OUTER JOIN ................................................................................

10

 

RIGHT OUTER JOIN.................................................................................

13

 

FULL OUTER JOIN ...................................................................................

16

Создание своей базы данных ......................................................................

17

Самосоединение SELF JOIN ....................................................................

23

Оператор CROSS JOIN ..............................................................................

28

Оператор UNION ..........................................................................................

29

Оператор EXEPT ..........................................................................................

33

Оператор INTERSECT.................................................................................

34

Ограничение результирующего набора данных. Операторы LIMIT и

OFFSET ...............................................................................................................

35

Задание на лабораторную работу ..................................................................

38

1

Вариант .................................................................................................

38

2

Вариант .................................................................................................

39

3

Вариант .................................................................................................

40

4

Вариант .................................................................................................

41

5

Вариант .................................................................................................

42

6

Вариант .................................................................................................

43

 

3

 

7

Вариант .................................................................................................

44

8

Вариант .................................................................................................

46

9

Вариант .................................................................................................

47

10

Вариант .................................................................................................

48

11

Вариант .................................................................................................

49

12

Вариант .................................................................................................

50

13

Вариант .................................................................................................

51

14

Вариант .................................................................................................

52

15

Вариант .................................................................................................

54

16

Вариант .................................................................................................

55

17

Вариант .................................................................................................

56

18

Вариант .................................................................................................

57

19

Вариант .................................................................................................

58

20

Вариант .................................................................................................

59

21

Вариант .................................................................................................

61

22

Вариант .................................................................................................

62

23

Вариант .................................................................................................

63

24

Вариант .................................................................................................

64

25

Вариант .................................................................................................

65

Список литературы .........................................................................................

67

4

Введение

В соответствии с Федеральным государственным общеобразовательным стандартом выпускники, освоившие программу специалитета по специальности 10.05.01 Компьютерная безопасность, и программу бакалавриата по направлению подготовки 27.03.04 Управление в технических системах, должны в том числе освоить общепрофессиональные компетенции,

связанные со способностью проектировать базы данных [1], [2], [3]. Для освоения вышеуказанных компетенций в учебном плане имеются соответствующие дисциплины. В рамках преподавания данных дисциплин студенты изучают в том числе язык структурированных запросов SQL

(Structured Query Language).

На кафедре «Управление и защита информации» активно разрабатывается программное обеспечение, которое в том, числе рассчитывает энергооптимальные программы движения с минимизацией электроэнергии на тягу поездов метрополитена [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14].

Программный комплекс имеет базу данных, которая трансформируется вместе с ним [15], [16]. Для того, чтобы обучающиеся могли влиться в команду разработки, серьезное внимание уделяется обучению дисциплине, связанной с проектированием баз данных. За десятилетия преподавания данных дисциплин разработаны методические рекомендации для разных СУБД [17], [18], [19], [20], [21], [22], [23], [24], [25], [26], [27].

Для СУБД PostgreSQL разработаны методические указания [28], [29], [30], [31].

Цель работы:

Изучить операторы SQL диалекта PostgreSQL, необходимые для работы с данными, находящимися в разных таблицах. Научиться создавать запросы на соединение данных из множества таблиц. Отчет по выполненной работе должен быть выполнен с соблюдением ГОСТ по НИР 7.32 [32].

5

Рекомендации по выполнению работы

Работа производится с учебной базой данной

AdwentureWorksPostgrePro [29].

Каждый скрипт должен выполняться в отдельном файле и иметь задание в виде комментария. Всю работу необходимо проводить в системе контроля версий [33], [34], [35], [36].

Оператор INNER JOIN

При разработке структуры БД необходимо следовать правилу, что данные должны храниться только один раз. Такое правило позволяет не допустить аномалий добавления, удаления и обновления данных. То есть, вся информация должна быть нормализована. Однако для конечного пользователя такой вид информации в таблицах будет не читаем, так как числовые значения ключей не говорят человеку ни о чем [20], [24].

Для удобочитаемости информации необходимо запрашивать данные из родительских и дочерних таблиц, соединенных по ключевому полю. В

реляционной алгебре таким оператором является оператор естественное соединение, в стандарте SQL – оператор INNER JOIN ... ON:

SELECT

A.Field1

,A.FieldN

,B.Field1

,B.FieldN FROM TableA AS A

INNER JOIN TableB AS B ON A.ID = B.ID_TableA1

Обратите внимание на то, что при работе с несколькими таблицами в

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

имя таблицы или ее псевдоним (alias).

1 Когда вы проектируете БД, следует придерживаться правил именования первичных и вторичных ключей. В данном примере первичный ключ именуется ID, вторичный ключ –

ID_ИмяРодительскойТаблицы.

6

В литературе можно встретить другой способ выборки значений из нескольких таблиц простым перечислением их имен в предложении FROM, а

затем наложением ограничения в предложении WHERE – равенство первичного ключа родительской таблицы и вторичного ключа дочерней таблицы:

SELECT

A.Field1

,A.Field2

,B.Field1

,B.Field2

,...

FROM TableA AS A, TableB AS B

WHERE A.ID = B.ID_TableA

Такой способ лучше не использовать, так как предложение WHERE

является необязательным в данном запросе, и про него легко забыть. Ошибки в синтаксисе не будет, и запрос выполнится. Однако результат запроса не будет правильным. Но не это является самым страшным последствием данной ошибки, а количество результирующих данных и время выполнения запроса.

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

результате получится набор из миллионов строк.

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

INNER2 JOIN ... ON.

2 В PostgreSQL оператор INNER для внутреннего соединения можно опустить.

7

В PostgreSQL существует специальный оператор Декартово произведение CROSS JOIN, работа которого аналогична выполнению

запроса на выборку без фильтрации:

SELECT

A.Field1

,A.Field2

,B.Field1

,B.Field2

,...

FROM TableA AS A, TableB AS B

Воспользуемся примером из [20]. В схеме данных всего две таблицы:

Города (Cities) и Жители (Citizens), которые живут в этих городах. В

таблице Citizensимеется поле ID_City, которое является внешним ключом к таблице City.

Пример 1

Показать, в каком городе живёт каждый житель.

SELECT c."Name"

, c2."FirstName" FROM "Cities" c

INNER JOIN "Citizens" c2 ON c."ID" = c2."ID_City";

Рисунок 1 – Результат выполнения оператора INNER JOIN

Результат выполнения запроса (Пример 1)

8

Пример 2

Показать пол, имя, фамилию, возраст и должность работника.

Пол (Gender), должность (JobTitle) и дата рождения (BithDate)

находятся в таблице Работник (Employee). Имя (FirstName) и фамилия

(LastName) находятся в таблице Персоны (Person). Все персоны имеют имя, однако, не все они являются работниками данного предприятия. Запись о сотруднике хранится в БД только один раз, в таблице Работник (Employee)

имеется ссылка в виде вторичного ключа на таблицу Персона

(Person) – BusinessEntityID.

В таблице хранится информация о дате рождения. Возраст можно рассчитать, как разницу между текущей датой и датой рождения [28].

SELECT

E."Gender"

,AGE(CURRENT_DATE, E."BirthDate") AS "Age"

,E."JobTitle"

,P."FirstName"

,P."LastName"

FROM "HumanResources"."Employee" AS E

INNER JOIN "Person"."Person" AS P

ON P."BusinessEntityID" = E."BusinessEntityID;

Рисунок 2 – Результат выполнения оператора INNER JOIN

Результат выполнения запроса (Пример 2)

Результирующий набор данных можно ограничить в предложении WHERE.

9

Пример 3

Показать имя, фамилию, должность для мужчин, младше 35 лет.

SELECT

E."Gender"

,AGE(CURRENT_DATE, E."BirthDate") AS "Age"

,E."JobTitle"

,P."FirstName"

,P."LastName"

FROM "HumanResources"."Employee" AS E

INNER JOIN "Person"."Person" AS P

ON P."BusinessEntityID" = E."BusinessEntityID"

WHERE EXTRACT

(YEAR FROM AGE(CURRENT_DATE, E."BirthDate")) < 35

AND e."Gender" = 'M';

Рисунок 3 – Результат выполнения оператора INNER JOIN

с предложением WHERE (Пример 3)

Ограничений на количество таблиц в операторе Соединение

(INNER JOIN) нет.

Оператор OUTER JOIN

LEFT OUTER JOIN

Часто возникает необходимость соединить таблицы по неключевому полю.

В случае совпадения, в результирующем наборе останется строка с данными,

принадлежащими обеим таблицам. Если нет совпадения по выбранному полю,

то в результирующем наборе остается строка, содержащая данные из левой таблицы (той, к которой происходит соединение), и значения NULL для всех

10

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]