|
Программирование >> Формирование связанных подзапросов
При использовании левого соединения расширение вхводи-мой таблице! осуществляется за счет записей входной таблиц:, имя которой указано слева от оператора 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
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |