数据库-SQL语言(数据更新)

本文详细介绍了SQL中的数据更新操作,包括如何插入数据(插入元组、插入子查询结果)、修改数据以及删除数据。同时,讨论了空值的处理,包括空值的产生、判断和在运算中的特殊行为。

目录

数据更新

1、插入数据

1)、插入元祖

2)、插入子查询结果

2、修改数据

3、删除数据

空值的处理


 

数据更新

数据更新有三种操作:向表中添加若干行数据、修改表中的数据和删除表中的若干行数据。

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   yx  and  yx  or  y not  x
T  TTTF
T  UUTF
T  FFTF
U  TUTU
U  UUUU
U  FFUU
F  TFTT
F  UFUT
F  FFFF

其中 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);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值