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% зарплату служащим, участвующим более чем в двух проектах.