目录
数据更新
数据更新有三种操作:向表中添加若干行数据、修改表中的数据和删除表中的若干行数据。
1、插入数据
SQL 的数据插入语句 insert 通常有两种形式,一种是插入一个元组,另一种是插入子查询结果。后者可以一次性插入多个元祖。
1)、插入元祖
将新元组插入指定表中,其一般格式为:
insert into <表名> ( 属性列 , 属性列 , ...... ) values ( 常量 , 常量 , ...... )
into子句中没有出现的属性列(即可以指定部分属性列),新元组在这些列上将取空值。但如果表定义时说明了 not null 的属性列不能取空值,不然会报错。如果into子句中没有指定属性列,那么就按照默认的顺序,个数也和表中的相同。属性列的顺序可与表定义中的顺序不一致。values 提供的值的个数和类型必须与 into 子句相匹配。
我们将上面表中数据插入为例:
insert into Student(Sno,Sname,Ssex,Sage,Sdept)
values('201215121' , '李勇' , '男' , 20 , 'CS');
insert into Student(Sno,Sname,Ssex,Sage,Sdept)
values('201215122' , '刘晨' , '女' , 19 , 'CS');
insert into Student(Sno,Sname,Ssex,Sage,Sdept)
values('201215123' , '王敏' , '女' , 18 , 'MA');
insert into Student(Sno,Sname,Ssex,Sage,Sdept)
values('201215125' , '张立' , '男' , 19 , 'IS')
insert into Course(Cno,Cname,Cpno,Ccredit)
values('1' , '数据库' , '5' , 4 );
insert into Course(Cno,Cname,Cpno,Ccredit)
values('2' , '数学' , NULL , 2 );
insert into Course(Cno,Cname,Cpno,Ccredit)
values('3' , '信息系统' , '1' , 4 );
insert into Course(Cno,Cname,Cpno,Ccredit)
values('4' , '操作系统' , '6' , 3 );
insert into Course(Cno,Cname,Cpno,Ccredit)
values('5' , '数据结构' , '7' , 4 );
insert into Course(Cno,Cname,Cpno,Ccredit)
values('6' , '数据处理' , NULL , 2 );
insert into Course(Cno,Cname,Cpno,Ccredit)
values('7' , 'PASCAL语言' , '6' , 4 );
insert into SC(Sno,Cno,Grade)
values('201215121' , '1' , 92);
insert into SC(Sno,Cno,Grade)
values('201215121' , '2' , 85);
insert into SC(Sno,Cno,Grade)
values('201215121' , '3' , 88);
insert into SC(Sno,Cno,Grade)
values('201215122' , '2' , 90);
insert into SC(Sno,Cno,Grade)
values('201215122' , '3' , 80);
在上面的插入元组过程中,需要注意的一点是课程表插入元组时要参照先行课的顺序去插入,不然会报错。
关于指定部分属性插入:
insert into Course(Cno,Cname)
values ( '8','Python');
2)、插入子查询结果
将子查询结果插入到指定表中,其语句格式一般为:
insert into <表名> [ ( <属性列1> [ , <属性列2> ... ) ]
子查询;
注意:into 子句与插入元组类似;子查询中的 select 语句目标列必须与 into 子句匹配 ( 值的个数,值的类型 )
例:
--对每一个系,求学生的平均年龄,并把结果存入数据库的一个新表中:
--先创建一个新表,用来存放结果
create table Dept_age(
Sdept char(10) ,
Avg_age int
)
--向新表中插入需求的结果:
insert into Dept_age
select Sdept , avg(Sage)
from Student
group by Sdept
2、修改数据
修改数据又称为更新操作,其语句一般格式为:
update <表名>
set <列名> = <表达式> [ , <列名> = <表达式> ]
[ where <条件> ] ;
其功能是修改指定表中满足 where 子句条件的元组,其中 set 子句给出的 表达式的值用于取代相应地属性列值。如果省略 where 子句,则表示要修改表中的所有元组。在执行修改语句时,DBMS会检查修改操作是否破坏表上已定义的完整性规则:实体完整性:主码不允许修改 ; 参照完整性 ; 用户定义的完整性 : not null 约束 、 unique 约束 、值域约束 等。
修改数据有三种修改方式:
1)、修改一个元组的值。
例:将学号为 201215121 的学生年龄修改为 22岁 。
update Student
set Sage=22
where Sno='201215121'
2)、修改多个元组的值。
例:将所有学生年龄增加一岁 。
update Student
set Sage = Sage+1
3)、带子查询的修改语句。
例:将 CS 系全体学生的成绩置零。
update SC
set Grade=0
where Sno in (
select Sno
from Student
where Sdept='CS'
)
3、删除数据
删除语句的一般格式为:
delete from <表名>
where <条件> ;
该语句的功能是删除指定表中满足 where 子句条件的元组。如果省略 where子句则表示删除表中全部元组,但表的定义还在字典中。也就是说, delete 语句删除的是表中的数据,而不是关于表的定义,和前面的 drop 语句要分清 。对基本表中数据删除时仍要考虑是否会破坏参照完整性规则,如外键约束等。
删除数据有三种删除方式:
1)、删除一个元组的值。
例:删除学号为 201215128 的学生记录。
delete from Student
where Sno='201215128'
2)、删除多个元组的值。
例:删除所有学生的选课记录。
delete from SC
此时的SC表中没有任何数据,但表的定义还在,成了一个空表。
3)、带子查询的删除语句。
例:删除 CS 系所有学生的选课记录。
delete from SC
where Sno in (
select Sno
from Student
where Sdept='CS'
)
空值的处理
所谓 “空值” 就是 “不知道” 或 “不存在” 或 “无意义” 的值,空值是一个很特殊的值,含有不确定性。SQL 语言中允许某些元组的某些属性在一定情况下取空值, 一般有以下几种情况:1)、该属性应该有一个值,但目前不知道它的具体值。例如某学生的年龄属性,因为学生登记表漏填了,不知道该学生年龄,因此取空值。2)、该属性不应该有值。例如缺考学生的成绩为空,因为他没有参加考试。3)、由于,,某种原因不便于填写。例如一个人的电话号码不想让大家知道,则取空值。
1、空值的产生:
//向 SC 表中插入一个元组,学生号是 “201215126”,课程号是 “1”,成绩为空
insert into SC(Sno,Cno,Grade)
values('201215126','1',null) ;
//或在插入语句中没有赋值的属性,其值为空值
insert into SC(Sno,Cno)
values ('201215126','1') ;
//还可以将表中某一属性改为空值
update Student
set Sdept=null
where Sno='201215200' ;
2、空值的判断:
判断一个属性的值是否为空值,用 is null 或 is not null 来表示。
//从 Student 表中找出漏填了数据的学生信息
select *
from Student
where Sname is null or Ssex is null or Sage is null or Sdept is null ;
3、空值的约束条件:
属性定义(或域定义)中有 not null 约束条件的不能取空值,加了 unique 限制的属性不能取空值,码属性不能取空值。
4、空值的算术运算、比较运算和逻辑运算:
空值与另一个值(包括另一个空值)的算术运算的结果为空值,空值与另一个值(包括另一空值)的比较运算结果为 unknown 。有了 unknown 后,传统的逻辑运算中二值(true,false)逻辑就扩展成了三值逻辑。and 、or 、not 的真值表如下:
x y | x and y | x or y | not x |
T T | T | T | F |
T U | U | T | F |
T F | F | T | F |
U T | U | T | U |
U U | U | U | U |
U F | F | U | U |
F T | F | T | T |
F U | F | U | T |
F F | F | F | F |
其中 T 表示 true ,F 表示 false ,U 表示 unknown 。在查询语句中,只有使 where 和 having 子句中的选择条件为 true 的元组才被选出作为输出结果。
//找出选修 1 号课程的不及格学生
select Sno
from SC
where Grade <60 and Cno='1' ;
//选出的学生是参加了考试而不及格的,不包括缺考的学生
//选出选修 1 号课程的不及格的学生以及缺考的学生
select Sno
from SC
where Cno='1' and (grade<60 or Grade is null);