前言    




       数据存储到数据库后,如果不对其进行分析和利用,数据是没有价值的。最终用户对数据库中数据进行的操作大多是查询和修改,其中修改操作包括插入、删除和更改数据。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


       执行完这一语句后,我们发现并不是我们想要的结果,如图所示:


sql server 更新 null SQL server 更新操作_数据

      

sql server 更新 null SQL server 更新操作_数据库_02


       从图中可以看出,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


效果如图:


sql server 更新 null SQL server 更新操作_数据库_03


修改数据


一、无条件的更新


       将所有学生的成绩加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 表名。