Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SQL97-4E.DOC
Скачиваний:
3
Добавлен:
05.11.2018
Размер:
3.3 Mб
Скачать

4.2. Выборка данных из нескольких таблиц

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

Допустим, что мы хотим получить в текстовой форме (а не в виде числовых кодов!) сведения о преподавателях с указанием их фамилий, а также должностей и факультетов, на которых они работают. В этой ситуации мы должны в предложении FROM перечислить наименования всех нужных таблиц - FROM Teacher, Depart, Post. Однако при попытке формирования такого запроса мы столкнемся со следующей проблемой - в таблицах Teacher, Depart, Post все интересующие нас поля имеют одинаковые наименования - Cname. Как в запросе различать их между собой? SQL позволяет решить эту проблему очень просто - необходимо указывать полное имя каждого поля, состоящее из имени таблицы и отделенного от нее точкой имени поля, например, Teacher.Cname, Depart.Cname и т.д.

Однако если мы сделаем запрос вида:

SELECT Teacher.Cname, Depart.Cname, Post.Cname

FROM Teacher, Depart, Post

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

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

SELECT Teacher.Cname, Depart.Cname, Post.Cname

FROM Teacher, Depart, Post

WHERE Teacher.Npost=Post.Npost AND

Teacher.Ndep=Depart.Ndep

ORDER BY 2, 1

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

нованиям факультетов и фамилиям преподавателей в алфавитном порядке:

Cname_A Cname_B Cname_C

Бердино Н.Ю. Математический Ст. преподаватель

Кузнецов В.А. Математический Доцент

Поляков В.В. Математический Доцент

Порывайло К.М. Физический Преподаватель

Стефанович Г.Б. Физический Доцент

Дмитриева Л.Н. Экономический Зав. кафедрой

Литвинас А.П. Экономический Профессор

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

SELECT A.Cname, B.Cname FROM Student A, Student B

WHERE A.Niq=B.Niq AND A.Cname<B.Cname

Cname_A Cname_B

Середняков А.Д. Хвостов П.П.

Обратите внимание, что в предложении WHERE условие A.Niq=B.Niq дополнено условием A.Cname<B.Cname, которое должно выполняться одновременно с первым. Это необходимо для того, чтобы каждая пара студентов включалась в результат только один раз. Причем если мы вторую операцию отношения заменим на A.Cname<>B.Cname, то не получим тождественного первому запросу результата, поскольку каждая пара студентов с одинаковыми Niq будет включаться в результат дважды, с разным порядком следования фамилий. Проверьте это утверждение самостоятельно.

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

SELECT DISTINCT A.Cname, B.Cname

FROM Teacher A, Student B, Student C

WHERE A.Nteach=B.Nteach

AND B.Nteach=C.Nteach

AND B.Nstud<>C.Nstud

Cname_A Cname_B

Дмитриева Л.Н. Двоечников Н.Е.

Дмитриева Л.Н. Дубинин У.У.

Дмитриева Л.Н. Хвостов П.П.

Стефанович Г.Б. Папуасов М.Ю.

Стефанович Г.Б. Середняков А.Д.

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

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

SELECT DISTINCT A.Cname, E.Cname, D.Cname, B.Cname, F.Cname

FROM Teacher A, Student B, Student C, Depart D, Post E, Depart F

WHERE A.Nteach=B.Nteach AND A.Ndep<>B.Ndep

AND A.Npost=E.Npost

AND A.Ndep=D.Ndep

AND B.Ndep=F.Ndep

Cname_A Cname_B Cname_C Cname_D Cname_E

Дмитриева Л.Н. Зав. кафедрой Экономический Дубинин У.У. Математический

Упражнения к разделу 4.2

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

2. Сформулируйте запрос, который позволит определить, есть ли преподаватели, которые ведут занятия более чем по одному предмету. Результатом должны быть фамилии таких преподавателей (без дублирования).

3. Сформулируйте запрос, который позволит проверить уникальность кодов предметов в таблице Subject.

4. Сформулируйте запрос, который позволит получить сведения о всех предметах, занятия по которым ведут преподаватели математического и физического факультетов (считать известными коды факультетов). В результирующей таблице должны указываться наименования предметов, объем часов, фамилия преподавателя, его должность, наименование факультета.

5. Сформулируйте запрос, который позволит получить список преподавателей математического и экономического факультета (считать известными коды факультетов), общий объем занятий у которых не более 60 часов. В результирующей таблице должны указываться фамилии преподавателей, объемы занятий, наименования факультетов.

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