Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Anda. ФИО not IN

WHERE№зк NOT IN

WHERE NOT EXISTS

WHEREa.№зкNOT IN

WHERE NOT EXISTS

WHEREa.№зкNOT IN

WHERE NOT EXISTS

WHEREa.№зкIN

WHERE EXISTS

(SELECT *

FROM Экзамен AS b

WHERE a.№зк = b.№зк AND Предмет = ‘БД’)

 

b) SELECT Предмет

FROM Список AS a

(SELECT b.№зк

FROM Экзамен AS b

WHERE Предмет = ‘БД’)

В соответствии с алгеброй

SELECT Предмет

FROM Список AS a INNER JOIN Экзамен AS b ON a.№зк = b.№зк

WHERE Предмет = ‘БД’

 

4. Создать список студентов, которые не сдавали ни одного экзамена.

{t[ФИО] ï ($t) (Список(t)) Ù (Ø$s) (Экзамен(s)) Ù (t[№зк] = s[№зк])}

 

a) SELECT ФИО

FROM Список AS a

(SELECT *

FROM Экзамен AS b

WHERE a.№зк = b.№зк)

 

b) SELECT ФИО

FROM Список AS a

(SELECT b.№зк

FROM Экзамен AS b)

 

Используя правила эквивалентности логических операций, это выражение можно переписать как:

{t[ФИО] ï ($t) (Список(t)) Ù ("s) ((Ø Экзамен(s)) Ú Ø (t[№зк] = s[№зк]))}

 

SELECT ФИО

from Список AS A

where №зк <> ALL (select №зк

from Экзамен AS B

where A.№зк=B.№зк)

Если, например, надо найти тех, кто не сдавал экзамен по нескольким предметам, то необходимо повторить вложенный запрос для каждого предмета, связывая условия поиска оператором AND.

a) SELECT ФИО

FROM Список AS a

(SELECT *

FROM Экзамен AS b

WHERE a.№зк = b.№зк AND Предмет = 'БД') AND NOT EXISTS

(SELECT *

FROM Экзамен AS c

WHERE a.№зк = c.№зк AND Предмет = 'Физика')

 

b) SELECT ФИО

FROM Список AS a

(SELECT b.№зк

ROM Экзамен AS b AND Предмет = 'БД') AND NOT IN

(SELECT b.№зк

ROM Экзамен AS b AND Предмет = 'Физика’)

 

c) SELECT ФИО

from Список AS A

here №зк <> ALL (select №зк

from Экзамен AS B

where A.№зк=B.№зк AND Предмет = 'БД')

№зк <> ALL

(select №зк

from Экзамен AS B

where A.№зк=B.№зк AND Предмет = 'Физика')

 

Использование предиката IN и квантора ALL при реализации операции вычитания можно только в том случае, если операция выполняется по одному компоненту (по одному атрибуту). Если вычитание производится по двум и более компонентам, то необходимо следовать выражению исчисления и, следовательно, в конструкции SQL использовать квантор существования.

Например, если таблица «Список» связана с таблицей «Экзамен» по двум атрибутом ФИО и №зк. Тогда для реализации операции вычитания можно использовать только квантор EXISTS, так как формула исчисления будет иметь вид:

{t[ФИО, №зк] ï ($t) (Список(t)) Ù (Ø$s) (Экзамен(s)) Ù (t[№зк] = s[№зк]) Ù (t[ФИО] = s[ФИО])}

 

и запрос на SQL имеет вид:

 

SELECT ФИО, №зк

FROM Список AS A

(SELECT * FROM Экзамен AS B WHERE A.№зк = B.№зк)

 

Запрос вида:

SELECT ФИО, №зк

FROM Список AS A

(SELECT A.№зк FROM Экзамен AS B WHERE A.№зк = B.№зк)

(SELECT ФИО FROM Экзамен AS C WHERE A.ФИО = C.ФИО)

работать не будет, например, при данных вида:

 

так как проверка связных атрибутов должна проверяться парой, а не отдельными множествами.

 

5. Создать список студентов сдавших все экзамены. Здесь для корректной формулировки предположим, что в схеме БД есть таблица ‘Предмет’, содержащая список всех экзаменов, например

 

Предмет
Название Преподаватель

 

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

 

(t[ФИО] ï ($t) ("u$s) ((Список(t)) Ù (Предмет(u)) Ù (Экзамен(s)) Ù (t[№зк] = s[№зк]) Ù (s[Предмет] = u[Название])))

 

Эквивалентная формулировка данного запроса в реляционной алгебре нельзя выразить одной “фразой”. Данный запрос реализует операцию деления и может быть выражен следующим образом:

 

T1 = p№зк(Список ´ Предметы)

T2 = p№зк, Название(T1 - Экзамен)

T = pФИО(T1 - T2)

 

SELECT №зк, Название

FROM Список, Предметы;

 

SELECT №зк, Название

FROM список_экзамен AS c

<== предыдущая лекция | следующая лекция ==>
Редукция операций реляционной алгебры к реляционному исчислению с переменными - кортежами | Лекция №7
Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 299; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.02 сек.