前面看的是查詢,現在來看看增、刪、改操作
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