在前面提到的大多数多事对数据库的信息抽取上,数据库的本质,其实就是对文件的封装,文件最基本的功能就是要有增删改查四种,而数据库也应该有。
1、删除
对于删除我们前面也有提到过,那时提到的是删除关系中的所有元组,而显然大多数情况我们会要求删除特定的元组,这时候就需要添加谓词来限定。
通式:
#在以后我们会用r来代表关系(relationship),A表示属性(attribute),p表示谓词(predicate)
#如果省略了P,就是前面提到的删除所有元组
delete from r
where P;
注:delete命令只能作用于一个关系。P谓词可以嵌入子查询,相信读者很容易做到。
2、插入(增加)
在前面也有提到过插入的基本形式,就不介绍了。
我们可能会想,在查询结果的基础上插入元组。假设我们想让cs系每个修满190学分的学生成为cs系的教师,其工资为18000,我们可以这样写:
INSERT INTO instructor
SELECT id,name,dept_name,18000
FROM student
WHERE (dept_name,tol_cred)=('computer science',190);
和基本形式不同,没有指定特定的元组,而是用select选出一个元组集合。
3、更新(修改)
有时候,我们希望只改变元组的某些属性值时,这个时候就用到更新命令update。待更新的元组可用查询语句找到。
通式:
update r
set A1 = new_value1,A2 = new_value2...
where P;
例如我们给工资低于12001的教师涨工资:
UPDATE instructor
SET salary = salary*1.05
WHERE salary<12001;
假设要给工资少于30000的教师涨3%的工资,其余教师涨5%,我们可能会写两句update:
UPDATE instructor
SET salary = salary*1.03
WHERE salary>30000;
UPDATE instructor
SET salary = salary*1.05
WHERE salary<=30000;
不过若是我们将两句的顺序颠倒,工资少于3000的教师的工资将增长>8%的工资。
为了减少这种错误,可以使用SQL提供的case结构,例如上面的例子可以写成:
UPDATE instructor
SET salary = CASE
WHEN salary <=30000 THEN salary*1.05
ELSE salary * 1.03
END ;
case语句的一般格式如下:
case
when p1 then result1
when p2 then result2
...
when pn then resultn
else result_t
end
当i第一个满足的p1,p2,……pn时,此操作就会返回result(i);如果没有一个谓词可以满足,则返回result_t。case语句可以用在任何应该出现值得地方。