前言
数据存储到数据库后,如果不对其进行分析和利用,数据是没有价值的。最终用户对数据库中数据进行的操作大多是查询和修改,其中修改操作包括插入、删除和更改数据。SQL提供了功能强大的数据查询和修改的功能。查询,插入和删除。这种东西还是需要多练,现在总结下来,没事儿了可以练练。分享:数据库文件 ,以下举例的语句都是根据这个数据库文件来操作,如有需要,请自行下载练习。
通过select语句可以返回由行和列组成的结果,但查询操作不会使数据库中的数据发生变化。如果要对数据进行各种更新操作,包括添加新数据、修改数据和删除数据,则需要使用INSERT、UPDATE和DELETE语句来完成,这些语句修改数据库中的数据,但不返回结果集。
插入数据
简单插入语句。将一条新生信息插入到Student表中,该新生学号为0821105,姓名为陈冬,性别为男,1991年6月23日出生,信息管理系学生。
insert into student values ('0821102','陈冬','男','1991/6/23','信息管理系')
插入多行数据。在SC表中插入3条新记录,学号均为0821105,选修的课程号分别为C001、C002、C004,成绩分别为90,80,NULL。由于为SC表提供了所有列的值并按表中各列的顺序列出这些值,因此不必再列表中指定列名。
按与表列顺序不同的顺序插入数据。将一条新生信息插入到Student表中,该新生学号为0811105,姓名为李丽,性别为女,出生日期暂缺,计算机系学生。
insert into sc values ('0821105','C001',90),('0821105','C002',80),('0821105','C004',NULL)
insert into student (Sno,Sname,Sex,Dept) values ('0811105','李丽','女','计算机系')
使用Select语句插入数据。统计每门课程的平均成绩,并把统计结果保存到一个新表中。
1)建新表
create table AvgGrade (Cno Char(6),AvgGrade Smallint)
2)插入数据
insert into AvgGrade select Cno , Avg(Grade) from SC group by Cno
使用Top子句插入数据。建立一个新表Top_Grade,结构包括学生的姓名、所在系、选的课程名和考试成绩
1)建新表
create table Top_Grade (
Dept nvarchar(20),
Cname nvarchar(20),
Grede tinyint
)
2)插入数据,将查询结果的前6行数据插入Top_Grade表中
insert Top (6) into Top_Grade
select Sname,Dept,Cname,Grade from student S join SC on Sc.Sno=S.Sno join Course C on C.Cno = SC.Cno order by Grade DESC
执行完这一语句后,我们发现并不是我们想要的结果,如图所示:
从图中可以看出,Top_Grade表中的数据并不是查询结果的前6行,这是因为与Insert语句结合使用的Top表达式中引用的行并不按任何顺序排列,Top_Grade表中的数据实际是查询语句:select Sname,Dept,Cname,Grade from student S join SC on Sc.Sno=S.Sno join Course C on C.Cno = SC.Cno 的前6行。因此,在使用有Top表达式的Insert语句中,其所包含的Select 语句中的order by子句是没有效果的。如果确实要在Top_Grade表中存放成绩最高的前6位学生信息,则应将对前6行数据的提取放置在Select 语句中,因此可将上面的语句改为:
insert into Top_Grade
select Top (6) Sname,Dept,Cname,Grade from student S join SC on Sc.Sno=S.Sno join Course C on C.Cno = SC.Cno order by Grade DESC
效果如图:
修改数据
一、无条件的更新
将所有学生的成绩加10:
update SC set Grade=Grade+10
二、有条件的更新
当用where子句指定更改数据的条件时,可以分两种情况,一种情况是基于本表条件的更新,即要更新的记录和更新记录的条件在同一张表中;另一种情况是基于其他表条件的更新,即要更新的记录在一张表中,而更新的条件来自另一张表。
基于本表条件的更新。将C001号课程的学分改为5
update Course set Credit = 5 where Cno = 'C001'
基于其他表条件的更新。将计算机系全体学生的成绩加5分
update SC set Grade = Grade + 5 from SC join Student on SC.Sno=Student.Sno where Dept = '计算机系'
同时更改多个列的值。将Java课程改为第2学期开设,3学分
update Course set Semester = 2, Credit = 3 where Cname = 'Java'
使用包含Top子句的Update。设有如下所示的雇员表,从该表中随机选取10个雇员,将其假期小时数增加一倍
Create table Employee ( --雇员表
EmployeeID int not null, --雇员ID
EmployeeName varchar(20) not null, --雇员名
VacationHours smallint --假期小时数
)
Update Top(10) Employee
set VacationHours = VacationHours * 2
删除数据
一、无条件删除
删除一张表的全部数据。删除Employee表中的全部数据
delete from Employee --Employee成空表
二、有条件删除
当用where子句指定要删除记录的条件时,与Update语句一样,也分同一张表和不同一张表两种情况。
基于本表条件的删除。删除所有考试成绩不及格的学生的选课记录
基于其他表条件的删除。删除计算机系考试成绩不及格的学生的选课记录
delete from SC where Grade < 60
delete from SC from SC join Student on SC.Sno = Student.Sno where Dept = '计算机系' and Grade < 60
使用带有Top子句的delete。删除Employee表中前2行的数据
delete top (2) from Employee
注意:在删除数据时,如果表之间有外键引用约束,则在删除主键所在表数据时,系统会自动检查所删除的数据是否被外键表引用,如果有,则根据所定义的外键类别来决定是否能对主键表数据进行删除操作。不仅删除表中语句,而且删除表结构的语句是:drop table 表名。