数据操作语言PPT课件_第1页
数据操作语言PPT课件_第2页
数据操作语言PPT课件_第3页
数据操作语言PPT课件_第4页
数据操作语言PPT课件_第5页
已阅读5页,还剩126页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.,1,数据库基础与实践技术(SQL Server 2008),何玉洁,2,第6章 数据操作语言,6.1 数据查询语句 6.2 数据更改功能,3,6.1 数据查询语句,6.1.1 查询语句基本结构 6.1.2 单表查询 6.1.3 多表连接查询 6.1.4 使用TOP限制结果集 6.1.5 将查询结果保存到新表中,4,6.1.1 查询语句基本结构,SELECT - 需要哪些列 FROM - 来自于哪些表 WHERE - 根据什么条件 GROUP BY HAVING ORDER BY ,5,部分能够包含的内容,SELECT ALL | DISTINCT TOP expression PERCEN

2、T WITH TIES := * | table_name | view_name | table_alias .* | table_name | view_name | table_alias . column_name | $IDENTITY | expression AS column_alias | column_alias = expression ,.n ,6,6.1.2 单表查询,1.选择表中若干列 2.选择表中的若干元组 3.对查询结果排序 4.使用聚合函数统计数据 5.对数据进行分组统计,7,1.选择表中若干列:查询指定列,在SELECT子句的中指定要查询的属性。 例1. 查

3、询全体学生的学号与姓名。 SELECT Sno,Sname FROM Student,8,示例,例2.查询全体学生的姓名、学号和所在系。 SELECT Sname, Sno, Dept FROM Student 说明:查询列表中的列顺序与表中列定义的顺序无关。,9,查询全部列,如果要查询表中的全部列,可以使用两种方法: 在中列出所有的列名; 如果列的显示顺序与其在表中定义的顺序相同,则可以简单地在中写星号“*”。,10,示例,例3 查询全体学生的详细记录。 SELECT Sno, Sname, Sex, Sage, Dept FROM Student 等价于: SELECT * FROM St

4、udent,11,查询经过计算的列,SELECT子句中的可以是表中存在的属性列,也可以是表达式、常量或者函数。 例4 查询全体学生的姓名及其出生年份。 SELECT Sname, year(getdate() - year(Birthdate) FROM Student getdate():得到系统的当前日期和时间 year():得到日期数据中年的部分,12,示例,例5. 含字符串常量的列。 SELECT Sname, 出生年份, year(getdate() FROM Student,13,指定列别名, 列名 | 表达式 AS 列别名 或 列别名 列名 | 表达式 例: SELECT Sna

5、me, year(getdate() - year(Birthdate) AS 年龄 FROM Student,14,指定列别名后的查询结果,SELECT Sname, year(getdate() - year(Birthdate) AS 年龄 FROM Student,15,用DISTINCT去掉结果中的重复行,SELECT DISTINCT Sno FROM SC,Sno,DISTINCT Sno,16,注意,SELECT语句不会自动去掉结果中的重复行,如果要求结果中不出现行,必须要明确地指出 DISTINCT是确保检索后的每一行是唯一的,这种唯一性是相对于其他行来说的。,17,2. 选

6、择表中的若干元组,查询满足条件的元组可通过 WHERE子句实现。,18,常用的查询条件,19,(1)比较大小,例7查询计算机系全体学生。 SELECT Sname FROM Student WHERE Dept = 计算机系 例8查询所有年龄20岁以下的学生的姓名及年龄。 SELECT Sname, year(getdate() - year(Birthdate) AS 年龄 FROM Student WHERE year(getdate()-year(Birth)20,20,示例,例9.查询成绩不及格学生的学号。 SELECT DISTINCT Sno FROM SC WHERE Grade

7、 60,21,(2)确定范围,BETWEENAND NOT BETWEENAND 作用:查找属性值在或不在指定范围内的元组。 说明: BETWEEN后是范围的下限(低值) AND后是范围的上限(高值),22,示例,例10查询考试成绩在8090之间的学生学号、课程号和成绩。,SELECT Sno, Cno, Grade FROM SC WHERE Grade BETWEEN 80 AND 90,等价于: SELECT Sno, Cno, Grade FROM SC WHERE Grade =80 AND Grade =90,23,示例,例11查询考试成绩不在8090之间的学生学号、课程号和成绩。

8、,SELECT Sno, Cno, Grade FROM SC WHERE Grade NOT BETWEEN 80 AND 90,等价于: SELECT Sno, Cno, Grade FROM SC WHERE Grade 90,24,示例:日期比较,例12. 设有图书表(titles),其中包含书号(title_id)、类型(type)、价格(price)和出版日期(pubdate)列,查询1991年6月出版的图书信息: SELECT title_id, type, price, pubdate FROM titles WHERE pubdate BETWEEN 1991/6/1 AND

9、 1991/6/30,25,(3)确定集合(IN),作用:用来查找属性值属于指定集合的元组。 格式: 列名 NOT IN (常量1, 常量2, ),26,示例,SELECT Sname, Sex FROM Student WHERE Dept IN( 信息管理系, 通信工程系, 计算机系),例13查询信息管理系、通信工程系和计算机系学生的姓名和性别。,等价于: SELECT Sname, Sex FROM Student WHERE Dept 信息管理系, OR Dept 通信工程系, OR Dept 计算机系,27,示例,例14.查询信息管理系、通信工程系和计算机系三个系之外的其他系学生的姓

10、名和性别。 SELECT Sname, Sex FROM Student WHERE Dept NOT IN ( 信息管理系, 通信工程系, 计算机系) 等价于: SELECT Sname, Sex FROM Student WHERE Dept!= 信息管理系 AND Dept!= 通信工程系 AND Dept!= 计算机系,28,(4)字符串匹配(LIKE),列名 NOT LIKE ESCAPE 匹配串中可包含如下通配符: %(百分号):匹配0个或多个字符。 _(下划线):匹配一个字符。 :匹配方括号中的任何一个字符。 :不匹配方括号中的任何一个字符。 若要比较的字符是连续的,则可以用连字

11、符“-”表达,例如,要匹配b、c、d、e中的任何一个字符,则可以表示为:b-e,29,示例,例15.查询姓“张”的学生详细信息。 SELECT * FROM Student WHERE Sname LIKE 张%,30,示例,例16.查询姓“张”、姓“李”和姓“刘”的学生的详细信息。 SELECT * FROM Student WHERE Sname LIKE 张李刘%,31,示例,例17.查询名字的第2个字为“小”或“大”的学生的姓名和学号。 SELECT Sname, Sno FROM Student WHERE Sname LIKE _小大% 例18查询所有不姓“刘”的学生姓名。 SEL

12、ECT Sname FROM Student WHERE Sname NOT LIKE 刘%,32,示例,例19.在Student表中查询学号的最后一位不是2、3、5的学生信息。 SELECT * FROM Student WHERE Sno LIKE %235,33,转义字符,如果要查找的字符串正好含有通配符,比如下划线或百分号,就需要用ESCAPE来说明。 ESCAPE 转义字符 其中“转义字符”是任何一个有效的字符,在匹配串中也包含这个字符,表明位于该字符后面的那个字符将被视为普通字符,而不是通配符。,34,示例,查找field1字段中包含字符串“30%”的记录: WHERE field

13、1 LIKE %30!% ESCAPE ! 查找field1字段中包含下划线(_)的记录: WHERE field1 LIKE %!_% ESCAPE !,35,(5)涉及空值的查询,空值是未确定的值或其值尚不知道。 例如,学生选课,在开学初学生只有选课记录,没有修课成绩,这时成绩成绩一项的值就是空值。 判断列取值为空的语句格式为: 列名IS NULL 判断列取值不为空的语句格式为: 列名 IS NOT NULL,36,示例,例20.查询还没有考试的学生的学号和相应的课程号。 SELECT Sno, Cno FROM SC WHERE Grade IS NULL,37,注意,空值不是一个确定的

14、值,所以不可以用等于或不等于来比较或衡量; 空值只能说是空值(IS NULL)或不是空值(IS NOT NULL)。,38,(6)多重条件查询,当需要多个查询条件时,可以在WHERE子句中使用逻辑运算符AND和OR来组成多条件查询。 例21.查询计算机系男生的姓名。 SELECT Sname FROM Student WHERE Dept = 计算机系 AND Sex = 男,39,示例,例22.查询C002和C003课程中考试成绩在8090的学生的学号、课程号和成绩。 SELECT Sno, Cno, Grade FROM SC WHERE Cno IN( C002, C003) AND G

15、rade BETWEEN 80 AND 90 注:OR的优先级小于AND,要改变运算的顺序可以通过加括号的方式实现。 SELECT Sno, Cno, Grade FROM SC WHERE (Cno = C001 OR Cno = C002) AND Grade BETWEEN 80 AND 90,40,3. 对查询结果排序,可用ORDER BY子句对查询结果进行排序。 ORDER BY ASC | DESC , 说明:按进行升序(ASC)或降序(DESC)排序。 当用多个列排序时,这些列在该子句中出现的顺序决定了对结果集进行排序的方式。,41,示例,例23.查询修了“C002”课程的学生的

16、学号及成绩,查询结果按成绩降序排列。 SELECT Sno, Grade FROM SC WHERE Cno = C002 ORDER BY Grade DESC,42,示例,例24.查询全体学生详细信息,结果按系名升序排列,同一个系的学生按出生日期降序排列。 SELECT * FROM Student ORDER BY Dept ASC, Birthdate DESC,43,例24执行结果,ORDER BY Dept, Birthdate DESC,44,4使用聚合函数汇总数据,也称为集合函数或聚合函数, 其作用是对一组值进行计算并返回一个统计结果。,45,聚合函数,COUNT(*):统计表

17、中元组的个数。 COUNT(DISTINCT ):统计列值个数 SUM():计算列值的和值(必须是数值型列)。 AVG():计算列值的平均值(必须是数值型列)。 MAX():得到列值的最大值。 MIN():得到列值的最小值。 除COUNT(*)外,其他函数在计算过程中均忽略NULL值。,46,示例,例25. 统计学生总人数。 SELECT COUNT(*) FROM Student,10,47,示例,例26.统计选修了课程的学生人数。 SELECT COUNT(DISTINCT Sno) FROM SC,4,48,示例,例. 计算学号为“0811101”的学生的考试总成绩。 SELECT SU

18、M(Grade) FROM SC WHERE Sno = 0811101,322,49,示例,例28.计算“0831103”学生的平均成绩。 SELECT AVG(Grade) FROM SC WHERE Sno = 0831103,71,50,示例,例28.查询“C001”课程考试成绩的最高分和最低分。 SELECT MAX(Grade) 最高分, MIN(Grade) 最低分 FROM SC WHERE Cno = C001,96,50,51,注意,聚合函数不能出现在WHERE子句中。 例如,查询学分最高的课程名,如下写法是错误的: SELECT Cname FROM Course WHE

19、RE Credit = MAX(Credit),52,5对数据进行分组统计,作用:可以控制计算的级别:对全表还是对一组。 目的:细化聚合函数的作用对象。 分组语句的一般形式: GROUP BY HAVING ,53,使用GROUP BY子句,例29.统计每门课程的选课人数,列出课程号和选课人数。 SELECT Cno, COUNT(Sno) FROM SC GROUP BY Cno 对查询结果按Cno的值分组,所有具有相同Cno值的元组为一组,然后再对每一组使用COUNT计算,求出每组的学生人数。,54,示例,例30.统计每个学生的选课门数和平均成绩。 SELECT Sno 学号, COUNT

20、(*) 选课门数, AVG(Grade) 平均成绩 FROM SC GROUP BY Sno,55,注意,GROUP BY子句中的分组依据列必须是表中存在的列名,不能使用AS子句指派的列别名。 带有GROUP BY 子句的SELECT语句的查询列表中只能出现分组依据列和统计函数,因为分组后每个组只返回一行结果。,56,示例,例31. 带WHERE子句的分组。统计每个系的女生人数。 SELECT Dept, Count(*) 女生人数 FROM Student WHERE Sex = 女 GROUP BY Dept,57,示例,例32 按多个列分组。统计每个系的男生人数和女生人数以及男生的最大年

21、龄和女生的最大年龄。结果按系名的升序排序。 SELECT Dept, Sex, Count(*) 人数, Max(Sage) 最大年龄 FROM Student GROUP BY Dept, Sex ORDER BY Dept,58,使用HAVING子句,HAVING用于对分组自身进行限制,它有点象WHERE子句,但它用于组而比是对单个记录。,59,示例,例33. 查询选课门数超过3门的学生的学号和选课门数。 SELECT Sno, Count(*) 选课门数 FROM SC GROUP BY Sno HAVING COUNT(*) 3 处理过程为:先执行GROUP BY子句对SC表数据按Sn

22、o进行分组,然后再用统计函数COUNT分别对每一组进行统计,最后筛选出统计结果满足大于3的组。,60,示例,例34. 查询选课门数大于等于4门的学生的平均成绩和选课门数。 SELECT Sno, AVG(Grade) 平均成绩, COUNT(*) 选课门数 FROM SC GROUP BY Sno HAVING COUNT(*) = 4,61,一些说明,WHERE子句用来筛选FROM子句中指定的数据源所产生的行数据。 GROUP BY子句用来对经WHERE子句筛选后的结果数据进行分组。 HAVING子句用来对分组后的统计结果再进行筛选。,62,一些说明,可以在分组操作之前应用的筛选条件,在WH

23、ERE子句中指定更有效。 在HAVING子句中指定的筛选条件应该是那些必须在执行分组操作之后应用的筛选条件。 将所有应该在分组之前进行的筛选条件放在WHERE子句中而不是HAVING子句中。,63,示例,例35. 查询计算机系和信息管理系每个系的学生人数。 SELECT Dept, COUNT(*) FROM Student GROUP BY Dept HAVING Dept in (计算机系, 信息管理系) SELECT Dept, COUNT (*) FROM Student WHERE Dept in ( 计算机系, 信息管理系) GROUP BY Dept,X,64,示例,例36查询每

24、个系的男生人数。 SELECT Dept, COUNT(*) FROM Student WHERE Sex = 男 GROUP BY Dept 该查询语句不能写成: SELECT Dept, COUNT(*) FROM Student GROUP BY Dept HAVING Sex = 男,65,6.1.3 多表连接查询,若一个查询同时涉及两个或两个以上的表,则称之为连接查询。 连接查询是关系数据库中最主要的查询,主要包括: 内连接 外连接:左外连接、右外连接,66,内连接,是一种最常用的连接类型。使用内连接时,如果两个表的相关字段满足连接条件,则从这两个表中提取数据并组合成新的记录。 在非

25、ANSI标准的实现中,连接操作是在WHERE子句中执行的theta连接 在ANSI SQL-92中,连接是在JOIN子句中执行的ANSI连接。 我们介绍ANSI方式的连接格式: FROM 表1 INNER JOIN 表2 ON ,67,连接基础知识,连接查询中用于连接两个表的条件称为连接条件或连接谓词。 一般格式为: =,必须是可比列,68,执行连接操作的大致过程,首先取表1中的第1个元组,然后从头开始扫描表2,逐一查找满足连接条件的元组, 找到后就将表1中的第1个元组与该元组拼接起来,形成结果表中的一个元组。 表2全部查找完毕后,再取表1中的第2个元组,然后再从头开始扫描表2, 重复这个过程

26、,直到表1中的全部元组都处理完毕为止。,69,示例,SELECT * FROM Student INNER JOIN SC ON Student.Sno=SC.Sno,70,去掉重复列,SELECT Student.Sno, Sname, Sex, Sage, Dept, Cno, Grade FROM Student JOIN SC ON Student.Sno = SC.Sno,71,示例,例38. 查询计算机系学生的修课情况,要求列出学生的名字、所修课的课程号和成绩。 SELECT Sname, Cno, Grade FROM Student JOIN SC ON Student.Sno

27、 = SC.Sno WHERE Dept = 计算机系,72,指定列别名, AS 为表指定别名可以简化表的书写。 SELECT Sname, Cno, Grade FROM Student S JOIN SC ON S.Sno = SC.Sno WHERE Dept = 计算机系 注意:当为表指定了别名时,在查询语句中的其他地方,所有用到表名的地方都要使用别名,而不能再使用原表名。,73,示例,例39. 查询“信息管理系”修了“计算机文化学” 的学生姓名和成绩。 SELECT Sname, Grade FROM Student s JOIN SC ON s.Sno = SC. Sno JOIN

28、 Course c ON c.Cno = SC.Cno WHERE Dept = 信息管理系 AND Cname = 计算机文化学,74,示例,例40. 查询所有选修了Java课程的学生情况,列出学生姓名和所在系。 SELECT Sname, Dept FROM Student S JOIN SC ON S.Sno = SC. Sno JOIN Course C ON C.Cno = SC.cno WHERE Cname = Java,75,示例,例41.有分组的多表连接查询。统计每个系的学生的考试平均成绩。 SELECT Dept, AVG(grade) as AverageGrade FR

29、OM student S JOIN SC ON S.Sno = SC.Sno GROUP BY Dept,76,示例,例42. 有分组和行选择条件的多表连接查询。统计计算机系学生每门课程的选课人数、平均成绩、最高成绩和最低成绩。 SELECT Cno, COUNT(*) AS Total, AVG(Grade) as AvgGrade, MAX(Grade) as MaxGrade, MIN(Grade) as MinGrade FROM Student S JOIN SC ON S.Sno = SC.Sno WHERE Dept = 计算机系 GROUP BY Cno,77,自连接,是特殊的

30、内连接。 相互连接的表物理上为同一张表。 必须为两个表取别名,使之在逻辑上成为两个表。 FROM 表1 AS T1 - 在内存中生成“T1” JOIN 表1 AS T2 - 在内存中生成“T2”,78,示例,例43. 查询与刘晨在同一个系学习的学生的姓名和所在的系。 SELECT S2.Sname, S2.Dept FROM Student S1 JOIN Student S2 ON S1.Dept = S2.Dept WHERE S1.Sname = 刘晨 AND S2.Sname != 刘晨,79,示例,例44. 查询与“数据结构”在同一个学期开设的课程的课程名和开课学期 SELECT C

31、1.Cname, C1.Semester FROM Course C1 JOIN Course C2 ON C1.Semester = C2.Semester WHERE C2.Cname = 数据结构,80,示例,例45. 查询至少被两个学生选的课程的课程号。 SELECT DISTINCT a.Cno FROM SC a JOIN SC b ON a.Cno = b.Cno AND a.Sno != b.Sno 或者: SELECT Cno FROM SC GROUP BY Cno HAVING COUNT(*) 1,81,外连接,外连接会返回FROM子句中提到的至少一个表的所有行,只要这

32、些行符合任何WHERE或HAVING搜索条件。 左外连接 FROM 表1 LEFT OUTER JOIN 表2 ON 右外连接 FROM 表1 RIGHT OUTER JOIN 表2 ON ,82,内连接与外连接示意图,A与B的左外连接结果: A + C,A与B的右外连接结果: B+ C,A与B的内连接结果: C,83,示例,例46 查询全体学生的选课情况,包括选修了课程的学生和没有选修课程的学生。 SELECT Student.Sno, Sname, Cno, Grade FROM Student LEFT JOIN SC ON Student.Sno = SC.Sno 或: SELECT

33、Student.Sno, Sname, Cno, Grade FROM SC RIGHT JOIN Student ON Student.Sno = SC.Sno,84,例46执行部分结果示例,85,示例,例47. 查询没人选的课程的课程名。 SELECT Cname FROM Course C LEFT JOIN SC ON C.Cno = SC.Cno WHERE SC.Cno IS NULL,86,示例,例48. 查询计算机系没有选课的学生,列出学生姓名和性别。 SELECT Sname,Dept,Cno,grade FROM Student S LEFT JOIN SC ON S.Sn

34、o = SC.Sno WHERE Dept = 计算机系 AND SC.Sno IS NULL,87,示例,例49. 统计计算机系每个学生的选课门数,包括没有选课的学生。 SELECT S.Sno AS 学号, COUNT(SC.Cno) AS 选课门数 FROM Student S LEFT JOIN SC ON S.Sno = SC.Sno WHERE Dept = 计算机系 GROUP BY S.Sno,88,示例,例50. 查询信息管理系选课门数少于3门的学生的学号和选课门数,包括没有选课的学生。查询结果按选课门数递增排序。 SELECT S.Sno AS 学号,COUNT(SC.Cn

35、o) AS 门数 FROM Student S LEFT JOIN SC ON S.Sno = SC.Sno WHERE Dept = 信息管理系 GROUP BY S.Sno HAVING COUNT(SC.Cno) 3 ORDER BY COUNT(SC.Cno) ASC,89,说明,当外连接与内连接混合使用时,对侧的概念的理解就非常重要。 所有查询语句中JOIN左侧或之前的所有表只作为一个表(这个表有可能是多个连接操作产生的结果表),同样,所有查询语句中JOIN右侧或之后的表也只作为一个表。,90,示例:设有三张表,91,查询1,查询全部供应商的VendorName及其在Vendors和

36、VendorAddress两个表中的VendorID。 SELECT v.VendorID, v.VendorName, va.VendorID FROM Vendors v LEFT OUTER JOIN VendorAddress va ON v.VendorID = va.VendorID,92,查询2,查询全部供应商的VendorName及其Address。由于并不要求返回全部的地址,因此对Address表可以采用内连接 SELECT v.VendorName, a.Address FROM Vendors v LEFT OUTER JOIN VendorAddress va ON v

37、.VendorID = va.VendorID JOIN Address a ON va.AddressID = a.AddressID,丢失了Vendor3,93,修改查询2,(1)添加一个外连接操作 SELECT v.VendorName, a.Address FROM Vendors v LEFT OUTER JOIN VendorAddress va ON v.VendorID = va.VendorID LEFT OUTER JOIN Address a ON va.AddressID = a.AddressID (2)改变连接操作顺序 SELECT v.VendorName, a.

38、Address FROM VendorAddress va JOIN Address a ON va.AddressID = a.AddressID RIGHT OUTER JOIN Vendors v ON v.VendorID = va.VendorID,94,4全外连接,若要保留两个表中都不满足连接条件的数据行,则可使用完全外部连接(简称全外连接)。 SQL Server 提供的全外连接运算符为: FULL OUTER JOIN 该操作的结果将包含两个表中的所有行,不论另一个表中是否有匹配的值。,95,实例,select * from T1 full join T2 on T1.T1_C

39、11 = T2.T2_C11,96,6.1.4 使用TOP限制结果集行数,TOP (expression) percent WITH TIES expression :指定返回行数的数值表达式。 TOP n percnet:取查询结果的前n%行。 WITH TIES:包括并列的结果。 TOP谓词写在SELECT单词的后边,97,示例,例52.查询考试成绩最高的三个成绩,列出学号、课程号和成绩。 SELECT TOP 3 Sno, Cno, Grade FROM SC ORDER BY Grade DESC,98,示例,例53. 查询Java考试成绩最高的前三名的学生的姓名、所在系和VB考试成绩

40、。 SELECT TOP 3 WITH TIES Sname, Dept, Grade FROM Student S JOIN SC on S.Sno = SC.Sno JOIN Course C ON C.Cno = SC.Cno WHERE Cname = Java ORDER BY Grade DESC 注意:如果在TOP子句中使用了WITH TIES谓词,则要求必须使用ORDER BY子句对查询结果进行排序,99,示例,例54. 查询选课人数最少的两门课程(不包括没有人选的课程),列出课程号和选课人数。 SELECT TOP 2 WITH TIES Cno, COUNT(*) 选课人数

41、 FROM SC GROUP BY Cno ORDER BY COUNT(Cno) ASC,100,示例,例55. 查询计算机系选课门数超过2门的学生中,考试平均成绩最高的前2名(包括并列的情况)学生的学号、选课门数和平均成绩。 SELECT TOP 2 WITH TIES S.Sno, COUNT(*) 选课门数,AVG(Grade) 平均成绩 FROM Student S JOIN SC ON S.Sno = SC.Sno WHERE Dept = 计算机系 GROUP BY S.sno HAVING COUNT(*) 2 ORDER BY AVG(Grade) DESC,101,6.1.

42、5 将查询结果保存到新表中,如果希望将查询结果保存到一个表中,则可以通过在SELECT语句中使用INTO子句实现。 包含INTO子句的SELECT语句的简单语法格式可描述为: SELECT 查询列表序列 INTO FROM 数据源 - 其他行过滤、分组等语句,102,语句功能,根据查询列表序列的内容创建一个新表,新表中各列的列名就是查询结果中显示的列标题,列的数据类型是这些查询列在原表中定义的数据类型。 执行查询语句并将查询的结果按列对应顺序保存到该新表中。,103,局部临时表和全局临时表,局部临时表在表名前加一个#来标识。局部临时表的生存期为创建此局部临时表的连接的生存期,它只能在创建此局部

43、临时表的当前连接中使用; 全局临时表在表名前加两个#来标识。全局临时表的生存期为创建全局临时表的连接的生存期,并且在生存期内可以被所有的连接使用。,104,示例,例56将计算机系的学生信息保存到#ComputerStudent局部临时表中。 SELECT Sno, Sname, Sex, Sage INTO #ComputerStudent FROM Student WHERE Dept = 计算机系,105,示例,例57将选了Java课程的学生的学号及成绩存入永久表Java_Grade中。 SELECT Sno, Grade INTO Java_Grade FROM SC JOIN Cour

44、se C ON C.Cno = SC.Cno WHERE Cname = Java 例58统计每个学期开设的课程总门数,将结果保存到永久表Cno_Count表中 SELECT Semester, COUNT(*) C_Count INTO Cno_Count FROM Course GROUP BY Semester,106,示例,例59利用例57生成的新表,查询第2学期开设的课程名、学分和课程总门数。 SELECT Cname, Credit, C_Count FROM Cno_Count JOIN Course ON Cno_Count.Semester= Course.Semester

45、WHERE Course.Semester = 2,107,6.2 数据更改功能,6.2.1 插入数据 6.2.2 更新数据 6.2.3 删除数据,108,6.2.1 插入数据,INSERT TOP ( expression ) PERCENT INTO table_or_view_name ( column_list ) VALUES ( ( DEFAULT | NULL | expression ,.n ) ,.n ) | SELECT statement ,109,说明,值与列名按顺序对应,要求值类型与列数据类型一致。 对语句中无值对应的列名赋NULL。 如果没有指明列名表,则新插入记录

46、的值的顺序必须与表中列的顺序一致,且每一列均有值(可为空)。,110,示例,例1.简单插入语句。将一个新生插入到Student表中,其学号为:0821105,姓名为:陈冬,性别为:男,年龄18岁,信息管理系学生。 INSERT INTO Student VALUES (0821105, 陈冬, 男, 18, 信息管理系),111,示例,例2插入多行数据。在SC表中插入3条新记录,学号均为“0821105”,选修的课程号分别为“C001”、“C002”和“C004”,成绩分别为:90、88和NULL。 INSERT INTO SC VALUES (0821105, C001, 90), (082

47、1105, C002, 80), (0821105, C004, NULL),112,示例,例3. 按与表列顺序不同的顺序插入数据。将一新学生插入到Student表中,其学号为:0811105,姓名为:李丽,性别为:女,出生日期暂缺,计算机系学生。 INSERT INTO Student(Sno,Sname,Sex,Dept) VALUES (0821105, 陈冬, 男, 信息管理系),113,示例,例4. 将数据插入到含标识列的表中。 (1)创建含标识列的表。 CREATE TABLE T1 ( column_1 int IDENTITY, column_2 VARCHAR(10); (2

48、)插入2行数据。 INSERT T1 VALUES (Row #1); INSERT T1 (column_2) VALUES (Row #2);,114,示例,例5. 使用 SELECT语句插入数据。统计每门课程的平均成绩,并把统计结果保存到一个新表中。 (1)建新表 CREATE TABLE AveGrade( Cno CHAR(6), AvgGrade SMALLINT ) (2)插入数据 INSERT INTO Deptage SELECT Cno, AVG(Grade) FROM SC GROUP BY Cno,115,示例,例6通过使用TOP子句插入数据。建立一个新表Top_Gra

49、de,结构包括学生姓名、所在系、选的课程名和考试成绩。 (1)建新表 CREATE TABLE Top_Grade( Sname nchar(5), Dept nvarchar(20), Cname nvarchar(20), Grade 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,116,6.2.2 更新数据,UPDATE TOP ( expression ) PERCENT table_or_view_name SET column_name = expression | DEFAULT | N

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论