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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值