ВУЗ: Томский государственный университет систем управления и радиоэлектроники
Категория: Учебное пособие
Дисциплина: Базы данных
Добавлен: 28.11.2018
Просмотров: 7751
Скачиваний: 53
66
денный в таблице 3.13. Количество записей, выведенных в результате такого
запроса, будет равно произведению количества записей первой таблицы на ко-
личество записей второй таблицы.
Таблица 3.13 – Декартово произведение таблиц
Сту-
дент.
Номер
Студент.
ФИО
Сту-
дент.
Группа
Студент.
Стипен-
дия, руб.
Группа.
Группа
Группа.
Специаль-
ность
Группа.
Факуль-
тет
1
Иванов
Сергей
Петрович
116
1500
116
Электронная
техника
ЭТ
2
Петров
Иван
Сергеевич
598
500
116
Электронная
техника
ЭТ
3
Алексеев
Семен Оле-
гович
445
1500
116
Электронная
техника
ЭТ
4
Белов Петр
Иванович
116
2500
116
Электронная
техника
ЭТ
1
Иванов
Сергей
Петрович
116
1500
445
Менеджмент Эконом.
2
Петров
Иван
Сергеевич
598
500
445
Менеджмент Эконом.
3
Алексеев
Семен Оле-
гович
445
1500
445
Менеджмент Эконом.
4
Белов Петр
Иванович
116
2500
445
Менеджмент Эконом.
1
Иванов
Сергей
Петрович
116
1500
598
Информаци-
онные систе-
мы
ВС
2
Петров
Иван
Сергеевич
598
500
598
Информаци-
онные систе-
мы
ВС
3
Алексеев
Семен Оле-
гович
445
1500
598
Информаци-
онные систе-
мы
ВС
67
Сту-
дент.
Номер
Студент.
ФИО
Сту-
дент.
Группа
Студент.
Стипен-
дия, руб.
Группа.
Группа
Группа.
Специаль-
ность
Группа.
Факуль-
тет
4
Белов Петр
Иванович
116
2500
598
Информаци-
онные систе-
мы
ВС
Подобные запросы на практике используются крайне редко, поскольку
фактически лишены смысла. Тем не менее, важно понимать, что в любом слу-
чае, когда в операторе SELECT используется более одной таблицы, всегда про-
исходит операция декартова произведения всех записей таблиц. Если в запросе
используется 3 и более таблицы, то выполнение этого запроса приведет к
«умножению» первой таблицы на вторую, а затем полученная таблица будет
«умножена» на третью и т. д. Смысл большинство подобных запросов приобре-
тает благодаря использованию необходимых условий после оператора WHERE.
Видоизменим наш запрос, исключив из него лишние поля, и попробуем
вывести список студентов, а также группы и факультеты, на которых они обу-
чаются. Для наглядности и понимания в запросе оставим поля «Группа» из
обеих таблиц.
Без применения оператора WHERE будет использоваться следующий за-
прос: SELECT Студент.ФИО, Студент.Группа, Группа.Группа,
Группа.Факультет FROM Студент, Группа.
Результатом выполнения запроса будет таблица 3.14.
Таблица 3.14 – Запрос «Студент – Группа – Факультет»
Студент.ФИО
Сту-
дент.Группа
Груп-
па.Группа
Груп-
па.Факультет
Иванов Сергей Петрович
116
116
ЭТ
Петров Иван Сергеевич
598
116
ЭТ
Алексеев Семен Олегович
445
116
ЭТ
Белов Петр Иванович
116
116
ЭТ
Иванов Сергей Петрович
116
445
Эконом.
Петров Иван Сергеевич
598
445
Эконом.
Алексеев Семен Олегович
445
445
Эконом.
Белов Петр Иванович
116
445
Эконом.
68
Студент.ФИО
Сту-
дент.Группа
Груп-
па.Группа
Груп-
па.Факультет
Иванов Сергей Петрович
116
598
ВС
Петров Иван Сергеевич
598
598
ВС
Алексеев Семен Олегович
445
598
ВС
Белов Петр Иванович
116
598
ВС
Полученная в результате запроса таблица практически аналогична
предыдущей и отличается от неё только отсутствием некоторых полей. Как
видно, сформированный запрос не совсем корректно отображает информацию о
студентах вуза, их группах и факультетах, поскольку по-прежнему просто осу-
ществляет «умножение» всех записей. Тем не менее, среди всех полученных в
результате запроса записей, имеются 4 «правильные» записи, отображающие
корректную информацию о студентах. К таковым записям относятся только те,
у которых значения полей «Студент.Группа» и «Группа.Группа» совпадают.
В результате можно сделать вывод, что для формирования корректного
запроса на выборку из нескольких таблиц необходимо добавить в исходный за-
прос условие о равенстве значений двух связанных полей таблиц:
SELECT Студент.ФИО, Студент.Группа, Группа.Группа,
Группа.Факультет FROM Студент, Группа WHERE Сту-
дент.Группа=Группа.Группа;
Результатом выполнения подобного запроса будет таблица 3.15.
Таблица 3.15 – Запрос «Студент – Группа – Факультет» с условием
ФИО
Сту-
дент.Группа
Группа.Группа Факультет
Иванов Сергей Петрович
116
116
ЭТ
Белов Петр Иванович
116
116
ЭТ
Алексеев Семен Олегович
445
445
Эконом.
Петров Иван Сергеевич
598
598
ВС
В подобных запросах обычно не выводят значение двух связанных полей,
как в данном примере, однако пользователю всегда необходимо указывать, из
какой таблицы он будет выводить значение связанного поля.
69
В итоге можно сформулировать правильный синтаксис оператора SE-
LECT для вывода связанных записей из двух и более таблиц.
SELECT Список_полей из Таблицы1, Таблицы2, .. , Таб-
лицыN
FROM Таблица1, Таблица2, .. , ТаблицаN
WHERE Таблица1.ПолеСвязи1=Таблица2.ПолеСвязи2 AND ...
Таблица2.ПолеСвязи3=ТаблицаN.ПолеСвязиM;
3.7.2 Соединение таблиц
Операции соединения таблиц возвращают пользователю набор записей,
являющийся некоторой комбинацией записей соединяемых таблиц и обяза-
тельно содержащий оператор JOIN (от англ. «соединить»).
Существует целый набор разновидностей соединения таблиц, реализовать
который помогают специальные операторы, добавляемые к ключевому опера-
тору JOIN.
Базовый синтаксис оператора выглядит следующим образом:
SELECT Список_полей
FROM Таблица1 JOIN Таблица2 ON Табли-
ца1.ПолеСвязи1=Таблица2.ПолеСвязи2;
Вместо ключевого слова JOIN можно применять следующие комбинации
операторов:
• INNER JOIN (или просто JOIN);
• LEFT OUTER JOIN (LEFT JOIN);
• RIGHT OUTER JOIN (RIGHT JOIN);
• FULL OUTER JOIN (FULL JOIN);
• CROSS JOIN.
Самым используемым из приведенного списка оператором является IN-
NER JOIN, который чаще всего используется без ключевого слова INNER.
Фактически этот оператор является аналогом использования оператора SELECT
для связи двух и более таблиц, приведенного выше. Оператор INNER JOIN
осуществляет вывод только тех строк в итоговый запрос, данные для которых
есть в обеих связываемых таблицах. То есть для каждой записи из первой таб-
лицы обязательно должна быть связанная запись из второй, и наоборот. Строки,
для которых связываемые записи отсутствуют, в итоговый запрос с оператором
INNER JOIN не попадут.
70
Запишем предложенный выше запрос о выводе информации о студентах с
помощью оператора INNER JOIN:
SELECT Студент.ФИО, Студент.Группа, Группа.Факультет
FROM Студент INNER JOIN Группа ON Студент.Группа=
=Группа.Группа;
Для примера рассмотрим работу с таблицей «Успеваемость» (табл. 3.16),
которая связана с таблицей «Студент» по полю «Номер Студента».
Таблица 3.16 – Таблица «Успеваемость»
Номер Студента (ПК) Предмет (ПК) Дата сдачи экзамена Оценка
1
Базы данных
14.06.2016
4
2
Базы данных
14.06.2016
5
1
Информатика
18.06.2016
4
2
Информатика
18.06.2016
4
Осуществим вывод информации из двух таблиц «Студент» и «Успевае-
мость», которая будет содержать поля «ФИО», «Предмет» и «Оценка».
SELECT Студент.ФИО, Успеваемость.Предмет, Успевае-
мость.Оценка FROM Студент JOIN Успеваемость ON Сту-
дент.Номер=Успеваемость.НомерСтудента;
Результат выполнения подобного запроса – таблица 3.17.
Таблица 3.17 – Запрос «Успеваемость»
ФИО
Предмет
Оценка
Иванов Сергей Петрович
Базы данных
4
Белов Петр Иванович
Базы данных
5
Иванов Сергей Петрович
Информатика
4
Белов Петр Иванович
Информатика
4
Вместо оператора INNER можно также использовать операторы LEFT
или RIGHT, соответственно левое или правое соединение. Использование LEFT
JOIN означает, что в результате выполнения запроса будут выведены все запи-
си из первой (левой) таблицы и те записи из второй (правой) таблицы, для ко-
торых есть связанные записи в первой. Если для записей из первой таблицы не