3.9更改數據庫

前面看的是查詢,現在來看看增、刪、改操作

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章