Файл: Базы данных Учебное пособие.pdf

Добавлен: 28.11.2018

Просмотров: 7751

Скачиваний: 53

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

66 

денный  в  таблице 3.13.  Количество  записей,  выведенных  в  результате  такого 
запроса, будет равно произведению количества записей первой таблицы на ко-
личество записей второй таблицы. 

Таблица 3.13 – Декартово произведение таблиц 

Сту-

дент. 

Номер 

Студент. 

ФИО 

Сту-

дент. 

Группа 

Студент. 

Стипен-

дия, руб. 

Группа. 

Группа 

Группа. 

Специаль-

ность 

Группа. 

Факуль-

тет 

Иванов 

Сергей 

Петрович 

116 

1500 

116 

Электронная 

техника 

ЭТ 

Петров 

Иван  

Сергеевич 

598 

500 

116 

Электронная 

техника 

ЭТ 

Алексеев 

Семен Оле-

гович 

445 

1500 

116 

Электронная 

техника 

ЭТ 

Белов Петр  

Иванович 

116 

2500 

116 

Электронная 

техника 

ЭТ 

Иванов 

Сергей 

Петрович 

116 

1500 

445 

Менеджмент  Эконом. 

Петров 

Иван  

Сергеевич 

598 

500 

445 

Менеджмент  Эконом. 

Алексеев 

Семен Оле-

гович 

445 

1500 

445 

Менеджмент  Эконом. 

Белов Петр  

Иванович 

116 

2500 

445 

Менеджмент  Эконом. 

Иванов 

Сергей 

Петрович 

116 

1500 

598 

Информаци-

онные систе-

мы 

ВС 

Петров 

Иван  

Сергеевич 

598 

500 

598 

Информаци-

онные систе-

мы 

ВС 

Алексеев 

Семен Оле-

гович 

445 

1500 

598 

Информаци-

онные систе-

мы 

ВС 


background image

67 

Сту-

дент. 

Номер 

Студент. 

ФИО 

Сту-

дент. 

Группа 

Студент. 

Стипен-

дия, руб. 

Группа. 

Группа 

Группа. 

Специаль-

ность 

Группа. 

Факуль-

тет 

Белов Петр  

Иванович 

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 

Эконом. 


background image

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 

ВС 

В подобных запросах обычно не выводят значение двух связанных полей, 

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


background image

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 не попадут. 


background image

70 

Запишем предложенный выше запрос о выводе информации о студентах с 

помощью оператора INNER JOIN: 

SELECT  Студент.ФИО,  Студент.Группа,  Группа.Факультет 

FROM  Студент  INNER  JOIN  Группа  ON  Студент.Группа= 
=Группа.Группа; 

Для примера рассмотрим работу с таблицей «Успеваемость» (табл. 3.16), 

которая связана с таблицей «Студент» по полю «Номер Студента». 

Таблица 3.16 – Таблица «Успеваемость» 

Номер Студента (ПК)  Предмет (ПК)  Дата сдачи экзамена  Оценка 

Базы данных 

14.06.2016 

Базы данных 

14.06.2016 

Информатика 

18.06.2016 

Информатика 

18.06.2016 

Осуществим  вывод  информации  из  двух  таблиц  «Студент»  и  «Успевае-

мость», которая будет содержать поля «ФИО», «Предмет» и «Оценка». 

SELECT  Студент.ФИО,  Успеваемость.Предмет,  Успевае-

мость.Оценка  FROM  Студент  JOIN  Успеваемость  ON  Сту-
дент.Номер=Успеваемость.НомерСтудента; 

Результат выполнения подобного запроса – таблица 3.17. 

Таблица 3.17 – Запрос «Успеваемость» 

ФИО 

Предмет 

Оценка 

Иванов Сергей Петрович 

Базы данных 

Белов Петр Иванович 

Базы данных 

Иванов Сергей Петрович 

Информатика 

Белов Петр Иванович 

Информатика 

Вместо  оператора  INNER  можно  также  использовать  операторы  LEFT 

или RIGHT, соответственно левое или правое соединение. Использование LEFT 
JOIN означает, что в результате выполнения запроса будут выведены все запи-
си из первой (левой) таблицы и те записи из второй (правой) таблицы, для ко-
торых есть связанные записи в первой. Если для записей из первой таблицы не