数据库系统原理:数据插入
SQL命令包括数据定义、查询、操纵和控制四大类。SQL数据操纵包括数据插入、数据删除和数据修改。数据操作即SQL的数据更新命令。也就是说要完成向表中添加若干行数据、修改表中的数据和删除表中的若干行数据这样的功能。
首先学习数据插入命令的用法。
SQL的数据插入命令有两种形式:一种是用Values子句向表中插入一行数据;一种是用子查询向表中插入多行数据。
一、用Values子句向表中插入数据(一次插入一行数据)
语法:
Insert into<基本表名>[(列名表)]
Values(元组值);
将VALUES后面的元组值依次插入到基本表中,即将元组值依次赋值给表名后面给出的各个列。
以学生表S(sno,sname,age,sex)为例。
例1:Insert into S(sno,sname,age)
Values('s1’,'李涛’,19);
例1的插入命令是将“'s1’,'李涛’,19”这三个数,依次地赋给S表中的学号列、姓名列和年龄列。
可以看到S表实际是有四个属性列的。那么如果没有给性别列赋值的话,性别列将自动置空。这也要求当建S表时,性别列是允许为空的,否则就会出错。
例2:Insert into S
Values('s1','李涛’,19,'男’);
例2的插入命令是将“'s1’,'李涛’,19,'男’”这四个数,依次地赋给S表中的各个列。但是S表后面没有给出这四个列的名字,意味着这四个属性值将依次地赋给建表时S表的四个列,也就是说“s1”赋给学号、 “李涛”赋给姓名、 “19”赋给年龄、 “男”赋给性别,与建表时这四个列是顺序的一致的。这样的话,可以省略表名后面各个列的名字。
二、用子查询向表中插入数据(一次可插入多行数据)
语法:
Insert into<表名>(<列名表>)
Select 查询语句
可以将子查询的结果插入到另一个已知表中。
子查询的结果是一个集合,将集合的数据插入到“into”后面的表名,依次地赋给表名后面的各个属性列名。
例3:把成绩不及格的学生的学号、姓名、课程号和成绩存入另一个已知基本表NoPass(sno,sname,cno,grade)中。
Insert into NoPass
Select S.sno,sname ,cno, grade
From S,SC
Where S.sno =SC.sno and grade <60;
在例3中,首先要把成绩不及格的学生的学号、姓名、课程号和成绩这四列的数值获取出来,因此需要一个子查询。
因为姓名列只能在S表中出现,而成绩列又只能在SC表中出现,所以子查询中是一个连接查询,S表和SC表做连接查询,连接条件是“S表的学号等于SC表的学号”,选择条件是“成绩小于60” ,获得的就是成绩不及格的学生的学号、姓名、课程号和成绩这四列信息。(S表和SC表的共有属性需要前面加表名。)
需要将获得的结果插入到一个已知基本表NoPass,这就要求已知基本表NoPass事先已经建成了,CREATE语句已经创建好基本表NoPass了、基本表NoPass已经存在,才能够用子查询向表中插入数据的方式插入数据。假设该表不存在,例3的SQL语句也是错误的语句。
三、总结
SQL的数据插入是用INSERT命令来实现的,它既可以一次插入一行数据,也可以使用子查询插入多行数据。
需要注意的是,在数据插入的时候,DBMS会控制它的操作使之符合完整性约束条件。无论增加、删除、修改,只要是更新操作,DBMS就会有一个控制的策略。
例如向子表SC插入数据时,当用户执行:
Insert into SC Values( 's1'' c1',90)
在插入之前,系统会检查主表S和主表C,因为在SC表创建的时候,定义了它的学号和课程号是外键,要引用基本表S和基本表C的取值;因此,当系统检查若表S中没有学号为s1的学生,或者表C中没有课程号为c1的课程,则系统默认的处理策略是拒绝用户插入。