Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
2
Добавлен:
15.01.2021
Размер:
389.35 Кб
Скачать

4.3. Вариант 3

1) + По каждому преподавателю выведите его имя и сумму hiredate + salary (столбец с именем

«Дата»). Что получается в результате вычисления hiredate + salary?

SELECT Name as TEACHER_NAME, Hiredate + SalaryFROM TEACHER;

2) +

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

SELECT s.Name, f.Name FROM FACULTY f, DEPARTMENT d, SGROUP g, LECTURE l, SUBJECT s WHERE f.FacPK = d.FacFK AND d.DepPK=g.DepFK AND g.GrpPK = l.GrpFK AND l.SbjFK=s.SbjPK AND g. Course = 3

3) +- Вывести названия кафедр, преподаватели которых преподают студентам кафедры ИПО

SELECT f.Name FROM DEPARTMENT source, TEACHER t, LECTURE l, SGROUP g, DEPARTMENT result, FACULTY f WHERE source.DepPK=g.DepFK AND g.GrpPK=l.GrpFK AND l.TchFK=t.TchPK AND t.DepFK= result.DepPK AND result.FacFK=f.FacPK AND source.Name= 'ИПО'

Снова рисуем на схеме путь этого запроса:

Здесь мы видим, что таблица Кафедра (DEPARTMENT) вступает 2 раза в соединение. Первый раз, когда нам нужно найти всех студентов кафедры ИПО и второй раз, чтобы узнать преподаватели каких кафедр преподают именно этим студентам. Поэтому в запросе эту таблицу DEPARTMENT нужно вызвать 2 раза.

Запрос нужно было написать так:

4) + (ошибка на рисунке пути этого запроса) Вывести названия кафедр, на которых непосредственные подчиненные заведующих кафедр

имеют зарплату (salary+commission) в диапазоне 2000-3000

SELECT d.Name FROM DEPARTMENT d, TEACHER boss, TEACHER subord WHERE d.HeadFK=boss.TchPK AND boss.TchPK= subord.ChiefFK AND subord.Salary+ subord.Commission BETWEEN 2000 AND 3000

И снова рисуем путь этого запроса:

По первому соединению находим заведующих кафедр, по второму, их (этих заведующих подчиненных). Здесь таблица TEACHER входит в соединение 2 раза. Поэтому ее надо назвать по-разному, как 2 разные таблицы. Запрос надо было сформулировать так:

5) +Вывести названия дисциплин, которые читаются преподавателями-профессорами кафедр,

расположенных в корпусах 1, 4, 6, 7 , 9, 10

SELECT s.Name FROM DEPARTMENT d, TEACHER t, LECTURE l, SUBJECT s WHERE d.DepPK=t.DepFK AND t.TchPK=l.TchFK AND l.SbjFK=s.SbjPK AND LOWER(t.Post)= 'профессор' AND d.Building IN ('1', '4', '6', '7', '9', '10')

Путь запроса здесь такой:

6) - Вывести имена преподавателей и номера групп и курсов, в которых они являются кураторами. Причем, если какой-то преподаватель не является куратором никакой группы, то его имя все равно выводится, а вместо номера группы и курса выводятся цифры 0.

Путь этого запроса:

Думаю, что здесь нужно применить правое внешнее соединение, если считать таблицу TEACHER как B (откуда мы выводим все записи о преподавателях, даже если они не являются кураторами), а таблицу SGROUP как А. То на диаграмме Венна такой запрос можно показать так.

Ну, а в синаксисе SQL Oracle, правое и левое внешнее соединение можно показывать при помощи (+):

7) + Вывести номера групп и их курс факультета с фондом финансирования больше 20000 ирейтингом больше 10 ИЛИ группы факультета из корпуса 6 и с рейтингом меньше 70 ИЛИ группы факультета из корпуса 5 и с рейтингом больше 40

SELECT g.Num, g.Course

FROM FACULTY f, DEPARTMENT d, SGROUP g

WHERE f.FacPK=d.FacFK AND d.DepPK=g.DepFK

AND (f.Fund > 20000 AND g.Rating > 10

OR f.Building = '6'AND g.Rating < 70

OR f.Building = '5'AND g.Rating > 40)

Снова строим путь запроса (путь соединения наших таблиц, что попали в запрос):

Соседние файлы в папке Бази даних-20210115T104840Z-001