П. Г. Демидова А. В. Зафиевский А. А. Короткин А. Н. Лататуев Базы данных Учебное пособие
Download 1.32 Mb. Pdf ko'rish
|
Базы данных
3.4.8. Многотабличные запросы
До сих пор мы рассматривали запросы только с одной исход- ной таблицей. Однако основную роль при работе с большими база- ми данных играют запросы с несколькими исходными таблицами. Для иллюстрации многотабличных запросов дополним нашу демонстрационную базу данных еще одной таблицей «Сессия», содержащей сведения о результатах экзаменов. Ее структура имеет следующий вид. Sess nsb disc prep ball Названия столбцов означают следующее: nsb – номер студенческого билета; disc – дисциплина; prep – фамилия преподавателя; ball – оценка. Синтаксис многотабличного запроса почти не отличается от однотабличного: во фразе FROM указывается не одна, а несколько таблиц-источников. Однако, поскольку в разных таблицах могут быть столбцы с одинаковыми именами (в нашем случае – nsb ), имена столбцов в запросах следует писать с именем таблицы в виде префикса: stud.nsb, sess.nsb . В частности, для обозначения всех столбцов таблицы можно использовать звездочку: stud.* . Если же имя столбца уникально в используемых таблицах, то префикс можно не указывать. На первый взгляд простейший запрос с двумя таблицами мог бы иметь вид SELECT * FROM stud, sess . 62 Такой запрос, тем не менее, практически бесполезен, по- скольку выдает произведение таблиц, части которого совершенно не связаны друг с другом. В общем случае такая связь может быть установлена включением в запрос фразы WHERE <условие> , где условие – логическое выражение, содержащее значения из раз- ных таблиц. Чаще всего такое выражение содержит условие ра- венства значений совпадающих по смыслу (но не обязательно по имени) столбцов. В качестве примера приведем запрос SELECT stud.*, disc, prep, ball FROM stud, sess WHERE stud.nsb = sess.nsb . Этот запрос выводит полные результаты сессии, причем для каждой дисциплины, сдававшейся студентом, полностью приво- дится персональная информация об этом студенте. Наряду с условием связи таблиц во фразе WHERE могут присутствовать и другие условия отбора строк результирующей таблицы. Например, запрос SELECT grp, fam, disc, ball FROM stud, sess WHERE (stud.nsb = sess.nsb) AND (grp='МО-33') выводит информацию о результатах сдачи сессии студентами группы МО-33. С точки зрения «правильного» проектирования запросов не вполне корректно смешивать в одном запросе условия связи таблиц и условия, описывающие логику запроса. В дальнейшем (при обсуждении соединений – join) мы увидим, как эта проблема решена в стандарте SQL92. Мы рассмотрели простейший случай двух таблиц с одним столбцом связи. Понятно, что увеличение количества таблиц и столбцов связи не вносит принципиальных изменений в методику построения многотабличных запросов. В некоторых случаях при построении многотабличных запро- сов оказывается полезным использование псевдонимов (алиасов) таблиц. Псевдоним представляет собой идентификатор, который через пробел записывается после имени таблицы во фразе FROM , после чего он используется в качестве префикса имен столбцов. Приведем пример, когда использование псевдонимов позволяет решить задачу, которая без их использования решалась бы гораз- до сложнее. Пусть у нас задана таблица сотрудников предприятия: 63 Pers tabn fio tabnr Названия столбцов означают следующее: tabn – табельный номер сотрудника; fio – фамилия и инициалы сотрудника; tabnr – табельный номер руководителя сотрудника. Требуется вывести таблицу из двух столбцов, которые содер- жат соответственно фамилию и инициалы сотрудников и фамилию и инициалы руководителей. Для этого можно сформировать запрос SELECT a.fio AS fio, b.fio AS fior FROM pers a, pers b WHERE a.tabnr = b.tabn . Его особенностью является то, что таблица pers перекрестно соединяется со своей копией, что и решает поставленную задачу. Download 1.32 Mb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling