删除

删除(delete)请求的表达方式与查询非常类似。我们只能删除整个元组,而不能只删除某些属性上的值。SQL用如下语句表示删除:

delete from r
where P;

其中P代表一个谓词,而r代表一个关系。delete语句首先从r中找出使P(t)为真的所有元组t然后把他们从r中删除。where子句可以忽略,在省略的情况下r中的所有元组都将被删除。
注意,一条delete命令只能作用于一个关系。如果我们想从多个关系中删除元组,必须为每个关系使用一条delete命令。where子句中的谓词可以和select命令的where子句中的谓词一样复杂。在另一种极端情况下,where子句可以为空,请求

delete from instructor;

将删除instructor关系中的所有元组。instructor关系本身仍然存在,但它们变成空的了
注意,虽然我们一次只能从一个关系中删除元组,但是在delete的where子句中嵌套的select-from-where中,可以引用任意数量的关系。delete请求可以包含嵌套的select,该select引用待删除的元组的关系。
在执行任何删除之前先进行所有元组的测试是至关重要的,如果有些元组在另一些元组未被测试前先被删除,那么会影响最终的结果(比如删除工资大于平均值的那些职员),这样delete的最后结果将依赖于元组被处理的顺序


插入

要往关系中插入数据,有两种形式:

  • 指定待插入的元组
  • 写一条查询语句来生成待插入的元组集合

待插入元组的属性值必须在相应属性的域中存在。类似地,待插入元组的属性数量也必须是正确的
元组属性值的排列顺序和关系模式中对应属性的排列顺序一致。为了方便那些不记得关系属性排列顺序的用户,SQL允许insert语句中指定属性
例如,下列SQL insert语句功能相同:

insert into course(course_id,title,dept_name,credits)
            values('CS-417','Database Systems','Comp.Sci',4);
insert into course(title,course_id,credits,dept_name)
            values('Database Systems','CS-417',4,'Comp.Sci');

我们用select指定了一个元组的集合,而不是指定一个元组。SQL 首先执行这条select语句,求出将要插入关系中的元组集合
系统在执行任何插入之前先执行完select语句是非常重要的
例:

insert into student
       select *
       from student;

如果是边计算要插入得元组集合边插入的话,只要在student上没有主码约束,这样的请求就可能会插入无数元组
有可能对待插入元组只给出了模式中某些属性的值,其余属性将被赋空值,用null表示
大部分关系数据库产品都有特殊的“bulk loader”工具,它可以向关系中插入一个非常大的元组集合。这些工具允许从格式化的文本文件中读出数据,并且它们的执行速度比等价的插入语句序列要快得多


更新

在某些情况下,我们可能希望在不改变一个元组所有值的情况下改变其某个属性的值。为达到这一目的,可以使用update语句。与使用insert、delete类似,我们可以通过使用查询来选出待更新的元组
update语句的where子句可以包含select语句的where子句中的任何合法结构(包括嵌套的select)。和insert、delete类似,update语句中嵌套的select可以引用待更新的关系。同样,SQL首先检查关系中的所有元组,看它们是否应该被更新,然后才执行更新
SQL提供case结构,我们可以利用它在单条update语句中执行多种更新,以避免更新次序引发的问题
case语句的一般格式如下:

case
when pred1 then result1
when pred2 then result2

when predn then resultn
else result0
end

当i是第一个满足的pred1,pred2,…,predn时,此操作就会返回resulti;如果没有一个谓词可以满足,则运算返回result0case语句可以用在应该出现值的任何地方

Logo

华为云1024程序员节送福利,参与活动赢单人4000元礼包,更有热门技术干货免费学习

更多推荐