Программирование >>  Формирование связанных подзапросов 

1 ... 4 5 6 [ 7 ] 8 9 10 ... 15


При использовании левого соединения расширение вхводи-мой таблице! осуществляется за счет записей входной таблиц:, имя которой указано слева от оператора JOIN.

Следует заметить, что нотация запросов с внешним соединением в СУБД Oracle отличается от приведенной нотации, задаваемой стандартом язтка SQL. В нотации, используемой в Oracle, этот же запрос будет иметь вид:

SELE SURNAME, MARK, SUBJID FROM STUDENT,EXAM MARKS

WHERE STUDENT.STUDENT ID = EXAM MARKS.STUDENT ID(+);

Знак (+) ставится у той таблиц:, которая дополняется записями с NULL-значениями, чтобы при соединении таблиц в в1ходное отношение попали и те записи другой таблиц:, для которых в таблице со знаком (+) не находится строк с соответствующими значениями атрибутов, используемхх для соединения. То есть для левого внешнего соединения (по нотации стандарта SQL) в запросе Oracle-SQL указатель (+) ставится у правой таблиц!.

Приведенный выше запрос может быть реализован и с применением правого внешнего соединения. Он будет иметь следующий вид:

SELECT SURNAME, MARK

FROM EXAM MARKS RIGHT OUTER JOIN STUDENT

ON EXAM MARKS.STUDENT ID = STUDENT.STUDENT ID;

Здесь таблица STUDENT, за счет записей которой осуществляется расширение выводимой таблицы, указана справа от оператора JOIN.

В нотации Oracle этот запрос будет выглядеть следующим образом:

SELECT SURNAME, MARK, SUBJ ID

FROM STUDENT,EXAM MARKS

WHERE EXAM MARKS.STUDENT ID(+) = STUDENT.STUDENT ID;

Видно, что использование внешнего правого или левого соединения позволяет существенно упростить запрос, сделать его запись более компактной.



Упражнения

1. Напишите запрос, который выполняет вывод данных о фамилиях сдававших экзамены студентов (вместе с идентификаторами каждого сданного ими предмета обучения).

2. Напишите запрос, который выполняет выборку значений фамилии всех студентов с указанием для студентов, сдававших экзамены, идентификаторов сданных ими предметов обучения.

3. Напишите запрос, который выполняет вывод данных о фамилиях студентов, сдававших экзамены, вместе с наименованиями каждого сданного ими предмета обучения.

4. Напишите запрос на выдачу для каждого студента названий всех предметов обучения, по которым этот студент получил оценку 4 или 5.

5. Напишите запрос на выдачу данных о названиях всех предметов, по которым студенты получили только хорошие (4 и 5) оценки. В выходных данных должны быть приведены фамилии студентов, названия предметов и оценка.

6. Напишите запрос, который выполняет вывод списка университетов с рейтингом, превышающим 300, вместе со значением максимального размера стипендии, получаемой студентами в этих университетах.

7. Напишите запрос на выдачу списка фамилий студентов (в алфавитном порядке) вместе со значением рейтинга университета, где каждый из них учится, включив в список и тех студентов, для которых в базе данных не указано место их учебы.

2.19.3. Использование псевдонимов при соединении таблиц

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

Иногда возникает необходимость включения в результат запроса записей из обеих (правой и левой) соединяемых таблиц, для которхх не удовлетворяется условие соединения. Такое соединение назхвается полным внешним соединением и осуществляется указанием в запросе ключевых слов FULL OUTER JOIN или UNION JOIN.



Упражнения

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

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

3. Написать запрос, который позволяет получить данные о названиях университетов и городов, в которых они расположены, с рейтингом, равным или превышающим рейтинг ВГУ.

наковые имена. При соединении таблицы с ее же копией вводят псевдонимы (алиасы) таблицы. Запрос для поиска фамилий студентов, имеющих одинаковые имена, выглядит следующим образом:

SELECT FIRST.SURNAME, SECOND.SURNAME FROM STUDENT FIRST, STUDENT SECOND WHERE FIRST.NAME = SECOND.NAME

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

{ SELECT FIRST.SURNAME, SECOND.SURNAME

ft FROM STUDENT FIRST, STUDENT SECOND

;! WHERE FIRST.NAME = SECOND.NAME

AND FIRST.SURNAME < SECOND.SURNAME



1 ... 4 5 6 [ 7 ] 8 9 10 ... 15

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика