Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
БД лекции.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
845.82 Кб
Скачать

Использование оператора exists.

Exists – булева функция, которая для данного запроса определяет, есть ли у него что-нибудь на выходе. Это реализация квантора существования в БД.

Пример: вывести список служащих, работающих над несколькими проектами.

Select distinct enum

From works t1

Where exists (select * from works t2

Where (t1.enum=t2.enum)

and (t1.pnum)<>(t2.pnum) )

Первое вхождение таблицы works помечено псевдонимом t1, второе – t2, т.е. выбираем того служащего, у которого номера проектов отличаются. Подзапрос связанный.

Оператор exists можно включать в различные булевские выражения, часто используется конструкция not exists. Пример: посчитать сотрудников, которые работают только над одним проектом.

Select distinct enum

From works t1

Where not exists (select * from works t2

Where (t1.enum=t2.enum)

and (t1.pnum)<>(t2.pnum) )

Операторы any и some – один и тот же оператор по смыслу. Они используются только для построения правильного, с точки зрения английской грамматики, предложения.

Оператор any, как и оператор exists, в качестве аргумента использует подзапрос, результат которого включается в оператор сравнения. Результат выполнения оператора сравнения истинен, если истинно какое-либо значение из результатов подзапроса.

Пример: найти всех сотрудников, занятых в проекте №1.

Select name

From empl

Where empno = ANY (select enum

From works

Where pnum=1)

Еще пример: вывести сотрудников, которые будут участвовать в проектах после 31 декабря 2012 года.

Select name

From empl

Where ‘12/31/2012’ < any (select finish from works

Where empl.empno=works.enum )

Оператор All. Оператор сравнения, использующий all, принимает значение «истина», если каждое значение, выбранное подзапросом, удовлетворяет его условию.

Пример: вывести, у кого из сотрудников участие во всех проектах заканчивается в конце 2012 года.

Select name

From works

Where ‘12/31/2012’>all (select finish from works

Where empl.empno=works.enum )

Операторы обновления данных – insert, update, delete. Занесение информации:

Insert into <имя таблицы>

Values (<значение 1>,<значение 2>,…)

Insert into <имя таблицы> (<атрибут 1>, <атрибут 2>, …)

Values (<значение 1>, <значение 2>, …)

Количество значений и количество атрибутов должно быть одинаково.

В таблицу можно вставить результат запроса:

Insert into empl_dep21

Select name, salary

From empl

Where depno=21

Create table empl_dep21 (

Name char(20),

Salary int)

Удаление записей.

Можно удалить все записи: delete from empl_dep21

Можно удалить одну или несколько записей: delete from Empl where depno=21

Обновление полей. Пример: увеличить зарплату всем сотрудникам отдела 21 на 20%.

Update empl

Set salary=salary*1,2

Where depno=21

Оператор занесения данных с подзапросом.

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

Пример: построить таблицу служащих, работающих над проектом.

Insert into B_empl

Select * from empl

Where empno in ( select enum from works

Where pnum=(select pnum from project

Where pname = ‘Имя проекта’))

Оператор удаления с подзапросом.

Правило: в подзапросе в разделе from нельзя ссылаться на таблицу, из которой производится удаление, но в условие where можно ссылаться на текущую строку – кандидата на удаление, то есть можно использовать связанные подзапросы с таблицей, из которой идет удаление.

Пример: удалить из базы данных отделы, в которых есть служащие, получающие меньше 200$.

Delete from depart

Where 200>ANY ( select salary from empl

Where depart.depno=Empl.Depno)

Оператор модификации с подзапросом.

У оператора update такие же ограничения, как и у delete, также могут использоваться связные подзапросы.

Пример: увеличить на 20% зарплату служащим, участвующим более чем в двух проектах.

Update empl

Set salary = salary*1.2

Where 2<(select count(*) from works

Where empl.empno=works.enum)