double arrow

Многотабличные запросы


Дело в том, что пользователю обычно необходимо извлечь как можно более полную информацию из базы данных, а в реляционных базах данных для этого зачастую приходится обращаться к нескольким таблицам одновременно. Для этого необходимо указать какие столбцы и из какой таблицы нужно выбрать. Для Access'а синтаксис обращения к столбцам таблицы выглядит таким образом: Имя_таблицы.Имя_столбца (если столбцы имеют уникальные названия в пределах запроса, то имя таблицы указывать необязательно).

Но это еще не все! Предположим, что нам необходимо выполнить следующий запрос: выбрать все факультеты и соответствующие им группы из базы данных Library Казалось бы идеальный запрос -

Select Faculties.Name, Groups.Name

From Faculties, Groups

выдает следующие результаты (см. рисунок)

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




Вот как должен был выглядеть предыдущий запрос:

Select Faculties.Name, Groups.Name

From Faculties, Groups

Where Faculties.Id = Groups.Id_Faculty

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

Задача: необходимо узнать студенты каких групп и с какой частотой посещают библиотеку

SELECT Groups.Name, Count(S_cards.Id_student) As [Частота посещений]

From Students, Groups, S_cards

Where Groups.Id = Students.Id_Group And Students.Id = S_cards.Id_student

Group By Groups.Name

Order By 2 Desc

В этом запросе нам понадобилась таблица Students, как промежуточное звено между карточками студентов и группами. Здесь была использована самая естественная и распространенная связка между таблицами - через внешний ключ. Результат выполнения запроса изображен на следующем рисунке

Заметим, что хотя названия таблиц перед именами столбцов достаточно хорошо информируют пользователя о протыкаемом процессе, постоянно переписывать их, временами довольно громоздкие, названия напрягает. Для облегчения жизни, но не понимания, в SQL существует понятие альянсов (Alias) - псевдонимов имен таблиц. Псевдонимы используются, в основном, для визуального упрощения текста запросов.

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



Select T1.Name

From Books T1, S_cards T2, T_cards T3

Where

T1.Id = T2.Id_book

And

T1.Id = T3.Id_book

And

Abs(T2.DateOut - T3.DateOut) < 366 / 2

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

Еще один пример: предположим, что нам необходимо получить информацию о книгах, число которых в библиотеке максимально

Select B.Name, A.FirstName & " " & A.LastName As Автор,

P.Name, C.Name, T.Name, B.Quantity

From Books B, Authors A, Press P, Categories C, Themes T

Where P.Id = B.Id_press And T.Id = B.Id_themes

And A.Id = B.Id_Author And C.Id = B.Id_Category

And B.Quantity = (Select Max(Quantity) From Books)

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

Замечание: знак & используется в Access'е для конкатенации строк

И, наконец, необходимо упомянуть об еще одной особенности многотабличных запросов в Access'е - они немодифицируемы (то есть операции insert, update и delete к результатам таких запросов применить невозможно).







Сейчас читают про: