前面看的是查询,现在来看看增、删、改操作
3.9.1 Delete
1. Delete语句的写法类似于查询语句
2. 只能删除整个元组,不能只删除某个属性。
3. delete from r
where P;
4. 其中,P是谓系,r是关系,r中满足谓词P的元组都会被删除。没有谓词的话删除全部元组。
5. 一个Delete语句只能删除一个关系中的元组,要删除多个关系中的元组的话,得对每个关系都使用delete语句。
6. 但是Where子句中可以使用别的关系,也可以以嵌套子查询的形式引用要删除元组的关系的属性。
7. 比如删除工资低于平均水平的老师:
8. delete from instructor
where salary< (select avg (salary)
from instructor);
9. 这个语句先检查每个老师的工资是否低于平均水平,最后把所有工资低于平均水平的老师都删掉,先一个一个比较完之后,再集中进行删除是有道理的,如果检查一个删一个的话,删掉一个老师之后剩余部分的平均值就变了,那么最终结果就取决于执行顺序了。
3.9.2插入
10. 插入的时候要么直接写出要插入的元组,要么构造一个其结果为要插入的元组的查询语句。
11. 基本插入语句:
12. insert into course
values (’CS-437’, ’Database Systems’, ’Comp. Sci.’, 4);
13. insert into course (course id, title, dept name, credits)
values (’CS-437’, ’Database Systems’, ’Comp. Sci.’, 4);
14. insert into instructor
select ID, name, dept name, 18000
from student
where dept name = ’Music’ and tot cred > 144;
15. 使用查询语句来表示要插入的元组的集合时,应当注意执行的顺序——首先把查询语句执行完,获得要插入的全部元组,最后才插入——如果查询语句还没执行完就执行插入操作的话,像下面这个语句:
16. insert into student
select *
from student;
17. 如果没有主键约束的话,会插入无限多条元组。
18. 插入时没有赋值的属性会取值null。
19. 多数数据库都提供了批量导入工具,这些工具能从文本文件中读取元组再进行插入,其效率一般都比顺序执行多个插入语句快上许多倍。
3.9.3 更新
20. update instructor
set salary = salary * 1.05
where salary < 70000;
21. 谓词的写法和在查询语句中一样,比如也可以在Where子句中使用要更新的关系:
22. 为工资低于平均水平的老师涨薪5%:
23. update instructor
set salary = salary * 1.05
where salary < (select avg (salary)
from instructor);
24. 同样地这个语句也是先确定所有涨薪的老师,再一一涨薪,不然又要乱套了。
25. 假设要分别加薪:年薪低于100000的加5%,高于100000的加3%,则我们需要2个语句,并且这两个语句的顺序也很重要(不按下面这个顺序的话,某个年薪低于100000的老师可能会加薪8%):
26. update instructor
set salary = salary * 1.03
where salary > 100000;
update instructor
set salary = salary * 1.05
where salary <= 100000;
27. 也可以使用case语句来把上面的两个语句合到一起:
28. update instructor
set salary = case
when salary <= 100000 then salary * 1.05
elsesalary * 1.03
end
29. case语句的结构:
30. case
when pred1 then result1
when pred2 then result2
. . .
when predn then resultn
else result0
end
31. 该语句可用于任何需要表达式的地方。
32. 在update语句的set 子句中也可使用标量子查询。
33. 计算每个学生的总成绩:
34. update student S
set tot cred = (
select sum(credits)
from takes natural join course
where S.ID= takes.ID and
takes.grade <> ’F’ and
takes.grade is not null);
35. 另外如果总成绩为null时要返回0的话,可以再使用个case语句:
36. select case
when sum(credits) is not null then sum(credits)
else 0
end