第5章 数据更新与查询 课件(共68张PPT)-《SQL Server数据库应用案例教程》同步教学(上海交通大学出版社)

资源下载
  1. 二一教育资源

第5章 数据更新与查询 课件(共68张PPT)-《SQL Server数据库应用案例教程》同步教学(上海交通大学出版社)

资源简介

(共68张PPT)
5
数据更新与查询


本章导读
在实际应用中,数据的更新与查询是最常用的操作。数据更新包括插入、修改及删除数据,是数据查询的基础与前提;数据查询是数据库管理系统的重要功能,它能够根据需要对数据库中的数据进行筛选,并将其以特定格式输出。
本章将介绍使用SSMS与T-SQL对数据进行更新,以及使用T-SQL对数据进行查询的方法。
知识目标
了解各种查询语句的结构。
能力目标
能够使用SSMS与T-SQL更新数据。
能够使用T-SQL查询数据。
素质目标
培养良好的工作习惯。
项目导航
数据更新
1
简单查询
2
连接查询
3
嵌套查询
4
01
数据更新
5.1.1插入数据——1.使用SSMS插入数据【例 5-1】根据表5-1所示数据,使用SSMS向数据库scs的数据表student中添加学生信息。snosnsexdeptage11001冯明男计算机1811002陈月女通信1912001褚共男计算机1812002卫潮男自动化2012003蒋生女通信20表5-1数据表student的数据——步骤1 打开SSMS,在“对象资源管理器”窗口中右击数据库“scs”的“表”节点中的“dbo.student”节点,在弹出的快捷菜单中选择“编辑前200行”菜单项,如图5-1所示。步骤2 打开数据表student的表编辑窗口,从左到右依次选中不同字段的默认值“NULL”,分别输入“11001”“冯明”“男”“计算机”与“18”,然后按Enter键,如图5-2所示。图5-1编辑数据图5-2插入第一行数据5.1.1插入数据1.使用SSMS插入数据——步骤3 使用同样的方法,继续输入其余数据,如图5-3所示。图5-3插入其余数据5.1.1插入数据1.使用SSMS插入数据5.1.1插入数据——2.使用T-SQL插入数据插入数据的T-SQL命令为INSERT INTO,具体语法格式如下:INSERT INTO <表名>[(<列名1>[ ,<列名2>,…])] VALUES(<值列表>)[ , … n]提示<值列表>中的值可以是常量,也可以是NULL,各值之间用“,”隔开,且字符型数据要用单引号引起来。其中,列名就是字段名,它可以省略,省略时表示插入所有字段的数据,若只插入部分字段的数据,则必须指明对应的列名。当指定列名时,列名的排列顺序与个数不一定要与表的结构相同,但VALUES子句中值的排列顺序与个数必须和指定列名的排列顺序与个数完全一致。——【例 5-2】根据表5-2所示数据,使用T-SQL向数据库scs的数据表teacher中添加教师信息。tnotnsexprofdeptsal01001赵乾女讲师计算机600001002钱坤男讲师自动化600001003孙震女副教授自动化700002011李离女教授通信800002013周巽男教授计算机8000表5-2数据表teacher的数据5.1.1插入数据2.使用T-SQL插入数据——步骤1 在“对象资源管理器”窗口中单击“scs”节点,然后单击工具栏中的“新建查询”按钮,打开查询编辑窗口,在其中输入如下代码。INSERT INTO teacherVALUES('01001','赵乾','女','讲师','计算机',6000),('01002','钱坤','男','讲师','自动化',6000),('01003','孙震','女','副教授','自动化',7000),('02011','李离','女','教授','通信',8000),('02013','周巽','男','教授','计算机',8000)5.1.1插入数据2.使用T-SQL插入数据——步骤2 单击工具栏中的“执行”按钮,运行结果如图5-4所示。图5-4插入数据代码的运行结果步骤3 右击“dbo.teacher”节点,在弹出的快捷菜单中选择“选择前1000行”菜单项,查看数据表teacher的数据,可见数据已成功插入,如图5-5所示。图5-5查看数据表teacher的数据5.1.1插入数据2.使用T-SQL插入数据——【例 5-3】使用T-SQL向数据表teacher中添加一条教师信息(01011,林一,女)。INSERT INTO teacher(tno,tn,sex) VALUES ('01011','林一','女')如果不指定列名,则须将该记录中prof、dept与sal字段值设置为NULL(空值),具体T-SQL语句如下:INSERT INTO teacher VALUES('01011','林一','女',NULL,NULL,NULL)5.1.1插入数据2.使用T-SQL插入数据5.1.2修改数据——1.使用SSMS修改数据使用SSMS修改数据与插入数据的操作基本相同,以修改数据表student的数据为例,参照例5-1的步骤1打开数据表student的表编辑窗口后,直接修改相应记录的字段值即可。5.1.2修改数据——2.使用T-SQL修改数据修改数据的T-SQL命令为UPDATE,具体语法格式如下:UPDATE <表名>SET <列名1>=<数据1>[,<列名2>=<数据2>,…][WHERE <条件>]其中,WHERE子句用于指定修改的记录须满足的条件,省略时表示修改表中所有记录。——【例 5-4】使用T-SQL将学生“冯明”转入自动化系。UPDATE studentSET dept='自动化'WHERE sn='冯明'本例使用了WHERE子句,只对满足sn='冯明'的记录进行修改。【例 5-5】使用T-SQL将所有学生的年龄增加1岁。UPDATE studentSET age=age+1本例没有使用WHERE子句,表示对表中所有记录进行修改。5.1.2修改数据2.使用T-SQL修改数据5.1.3删除数据——1.使用SSMS删除数据【例 5-6】使用SSMS删除数据表teacher中教师“林一”的记录。打开数据表teacher的表编辑窗口,选中想要删除的记录所在行(即第4行),右击该行,在弹出的快捷菜单中选择“删除”菜单项,如图5-6所示。图5-6删除数据提示如果要删除多条记录,可同时选中相应记录所在行后再进行删除操作。5.1.3删除数据——2.使用T-SQL删除数据删除数据的T-SQL命令为DELETE,具体语法格式如下:DELETE FROM <表名>[WHERE <条件>]其中,WHERE子句用于指定删除的记录须满足的条件,省略时表示删除表中的所有记录。【例 5-7】使用T-SQL删除学生“冯明”的记录。DELETE FROM studentWHERE sn='冯明'本例使用了WHERE子句,只删除满足sn='冯明'的记录。——【例 5-8】使用T-SQL删除数据表student的所有记录。DELETE FROM student本例没有使用WHERE子句,表示删除数据表中的所有记录,但数据表结构仍然存在。5.1.3删除数据2.使用T-SQL删除数据——使用SSMS或T-SQL在数据库scs的数据表course、teaching与sgrade中插入数据,数据具体内容可参照表5-3、表5-4及表5-5。练一练cnocncredit c0201数据库原理及应用5 p0101高等数学6 c0203数据结构6 c0204计算机网络5 c0302算法设计与分析4d0101信息安全基础4c0103计算机组成原理4表5-3数据表course的数据5.1.3删除数据2.使用T-SQL删除数据——tnocno01001c020101001c020301002c020401002c030201003p010101003c030202011c020102013c0203snocnograde11001c02018511001c02048011002c03026512001c02017012001d01017612002c02038012003c02018512003d010195表5-4数据表teaching的数据表5-5数据表sgrade的数据5.1.3删除数据2.使用T-SQL删除数据
02
简单查询
5.2.1单表查询的结构——查询数据的T-SQL命令为SELECT,具体语法格式如下:SELECT [ALL|DISTINCT] <列名> [[AS] <列别名>] [ , … n]FROM <表名> [[AS] <表别名>][WHERE <条件1>][GROUP BY <列名1> [HAVING <条件2>] ][ORDER BY <列名2> [ASC|DESC]]单表查询是只对一个数据表进行查询的操作,也是其他查询的基础。——(1)ALL表示显示所有记录;DISTINCT表示显示不重复的记录,当不需要此项操作时可使用ALL关键字或省略;当查询数据表中全部列时,可在“<列名>”处使用“*”符号;AS关键字表示将字段以设置的别名显示,当不需要此项操作时可省略。(2)FROM指定所查询的数据表;AS关键字表示将数据表以设置的别名显示,当不需要此项操作时可省略。(3)WHERE指定查询的条件,该条件通常为条件表达式。(4)GROUP BY根据指定的字段值对结果集进行分组;HAVING根据设定的条件对FROM、WHERE及GROUP BY子句输出的中间结果集进行筛选。(5)ORDER BY表示对结果集的记录进行排序;ASC关键字表示升序,DESC关键字表示降序,省略时默认为升序。5.2.1单表查询的结构5.2.2无条件查询与条件查询——1.无条件查询无条件查询是指只包含SELECT和FROM关键字的查询。【例 5-9】从数据表student中查询所有学生的学号、姓名和性别。SELECT sno,sn,sexFROM student本例查询了数据表student中的所有记录,并按照SELECT子句中指定的字段顺序sno、sn和sex输出查询结果,如图5-7所示。图5-7例5-9的查询结果5.2.2无条件查询与条件查询——2.条件查询条件查询是指使用了WHERE子句的查询。WHERE子句指定的条件通常由3部分组成,分别为列名、运算符与常数。查询条件运 算 符比较>(大于)、<(小于)、=(等于)、>=(大于等于)、<=(小于等于)、< >(不等于)多重条件AND(逻辑与)、OR(逻辑或)、NOT(取反)确定范围BETWEEN AND(在某范围内)、NOT BETWEEN AND(不在某范围内)确定集合IN(值在列表中)、NOT IN(值不在列表中)字符匹配LIKE(字符相匹配)、NOT LIKE(字符不匹配)空值IS NULL(值为空)、IS NOT NULL(值不为空)表5-6 WHERE子句中常用的运算符——比较查询1【例 5-10】从数据表sgrade中查询成绩大于80分的学生选课信息。SELECT *FROM sgradeWHERE grade>80本例使用grade>80作为查询条件,查询数据表sgrade中成绩大于80分的记录,然后按照数据表sgrade中原来的字段顺序输出查询结果,如图5-8所示。图5-8例5-10的查询结果5.2.2无条件查询与条件查询2.条件查询——多重条件查询2【例 5-11】从数据表sgrade中查询选修了课程“c0201”并且成绩高于80分的学生的学号与成绩。SELECT sno,gradeFROM sgradeWHERE cno='c0201' AND grade>80本例使用cno='c0201'与grade>80作为查询条件,并在它们之间使用AND关键字连接表示并列关系,查询数据表sgrade中课程编号为c0201且成绩大于80分的记录,然后按照字段sno、grade的顺序输出查询结果,如图5-9所示。图5-9例5-11的查询结果5.2.2无条件查询与条件查询2.条件查询——确定范围查询3【例 5-12】从数据表teacher中查询工资在5000元到7000元之间的教师信息,包括教师编号、姓名与职称。SELECT tno,tn,profFROM teacherWHERE sal BETWEEN 5000 AND 7000BETWEEN AND表示“包含在……之中”,用于查询字段值在指定范围内的记录,前面加NOT则表示“不包含在……之中”。本例使用sal BETWEEN 5000 AND 7000作为查询条件,查询数据表teacher中字段sal在5000~7000的记录,然后按照字段tno、tn与prof的顺序输出查询结果,如图5-10所示。图5-10例5-12的查询结果5.2.2无条件查询与条件查询2.条件查询——确定集合查询4【例 5-13】从数据表sgrade中查询选修了课程“c0204”或“d0101”的学生选课信息。SELECT *FROM sgradeWHERE cno IN ('c0204','d0101')IN表示查询字段值属于指定集合的记录,前面加NOT则表示查询字段不属于指定集合的记录。本例使用cno IN ('c0204','d0101')作为查询条件,查询数据表sgrade中字段cno的值属于集合('c0204','d0101')的记录,然后按照数据表sgrade中原来的字段顺序输出查询结果,如图5-11所示。图5-11例5-13的查询结果5.2.2无条件查询与条件查询2.条件查询——字符匹配查询5前面各例均属于完全匹配查询,当查询条件无法确定精确的值时,可以使用LIKE关键字进行部分匹配查询,即模糊查询。具体语法格式如下:<列名> LIKE <字符串常量>其中,<列名>中指定的列的数据类型必须为字符型;<字符串常量>中的字符串通常需使用通配符对数据进行模糊查询。当不使用通配符时,LIKE相当于“=”。常用的通配符及其功能如表5-7所示。通 配 符功能%表示任意多个字符(如%h%表示包含“h”的字符串,h%表示以“h”为首字符的字符串)_表示一个字符(如H_表示以“H”为首字符且其后只含有一个字符的字符串)[ ]表示在某一范围的字符(如[A-G]%表示以A到G之间任意字符为首字符的字符串)[^ ]表示不在某一范围的字符(如[^A-G]%表示以不是A到G之间任意字符为首字符的字符串)表5-7常用的通配符及其功能5.2.2无条件查询与条件查询2.条件查询——字符匹配查询5【例 5-14】从数据表teacher中查询所有李姓教师的教师编号与姓名。SELECT tno,tnFROM teacherWHERE tn LIKE '李%'本例使用tn LIKE '李%'作为查询条件,查询数据表teacher中字段tn的值符合以“李”为首字符的记录,然后按照字段tno、tn的顺序输出查询结果,如图5-12所示。图5-12例5-14的查询结果5.2.2无条件查询与条件查询2.条件查询——空值查询6【例 5-15】从数据表sgrade中查询考试成绩有效的学生选课信息。SELECT *FROM sgradeWHERE grade IS NOT NULL本例使用grade IS NOT NULL作为查询条件,查询数据表sgrade中字段grade的值不为空的记录,然后按照数据表sgrade中原来的字段顺序输出查询结果,如图5-13所示。图5-13例5-15的查询结果5.2.2无条件查询与条件查询2.条件查询5.2.3利用聚合函数统计汇总——【例 5-16】从数据表teacher中查询计算机系教师的人数,以及这些教师工资的总和及平均值。SELECT COUNT(*) AS num,SUM(sal) AS sumsal,AVG(sal) AS avgsalFROM teacherWHERE dept='计算机'本例在SELECT语句后分别使用COUNT(*)、SUM()及AVG()函数统计中间结果集中的记录数、字段sal的总和及平均值,并使用AS关键字将它们以列别名num、sumsal与avgsal为新列名输出查询结果,如图5-14所示。图5-14例5-16的查询结果提示(1)使用COUNT(*)函数时,无法使用DISTINCT关键字消去重复行。(2)使用函数查询数据时,如果不设置列别名,输出结果的列名将显示为“(无列名)”。——【例 5-17】从数据表sgrade中查询选修了课程“c0201”且有成绩的学生人数,以及这些成绩中的最高分和最低分。SELECT COUNT(grade) AS num,MAX(grade) AS maxgrade,MIN(grade) AS mingradeFROM sgradeWHERE cno='c0201'本例在SELECT语句后分别使用COUNT()、MAX()及MIN()函数统计中间结果集中的列值不为空的记录数、字段grade最大值及最小值,并使用AS关键字将它们以列别名num、maxgrade及mingrade为新列名输出查询结果,如图5-15所示。图5-15例5-17的查询结果5.2.3利用聚合函数统计汇总5.2.4分组查询——【例 5-18】从数据表sgrade中查询选修每门课程的学生人数。SELECT cno,COUNT(sno) AS numFROM sgradeGROUP BY cno本例使用GROUP BY子句将中间结果集按照字段cno进行分组,再使用COUNT()函数分别统计各组中字段sno不为空的记录数,并使用AS关键字将它以列别名num为新列名输出查询结果,如图5-16所示。图5-16例5-18的查询结果分组查询是指使用GROUP BY子句的查询。GROUP BY子句表示将查询结果按一个或多个列值进行分组。5.2.4分组查询——【例 5-19】从数据表sgrade中查询选修两门及以上课程的学生学号及选课门数。SELECT sno,COUNT(*) AS numFROM sgradeGROUP BY snoHAVING (COUNT(*)>=2)本例使用GROUP BY子句将中间结果集按照字段sno进行分组,再使用COUNT(*)函数分别统计各组的记录数,接着使用HAVING子句筛选记录数大于等于2的组,最后使用AS关键字将记录数以列别名num为新列名输出查询结果,如图5-17所示。图5-17例5-19的查询结果5.2.4分组查询——提示在进行分组查询时,SELECT语句指定的每一列都应写在GROUP BY子句后,除非对这一列使用了聚合函数。这是因为在使用GROUP BY对SELECT后的多个列中的某一列进行分组时,可能会在其他列出现多个数据共同占用一个数据栏的情况,这时SQL Server将会给出错误提示。而聚合函数正是将多个数据转化成单个数据输出的查询方式,所以聚合函数所调用的列可不包含在GROUP BY子句中。5.2.5排序查询——【例 5-20】从数据表teacher中查询每个教师的教师编号、姓名及年薪,并按照年薪值降序排列。SELECT tno,tn,sal*12 AS incomeFROM teacherORDER BY income DESC本例使用ORDER BY子句将查询的中间结果集以“sal*12”的值为基准降序排列。查询结果如图5-18所示。图5-18例5-20的查询结果排序查询是指使用ORDER BY子句的查询。ORDER BY子句表示对数据表或查询的中间结果集进行排序,排序的方式可以指定为DESC、ASC或省略。提示只有ORDER BY子句可以调用列的别名。5.2.5排序查询——【例 5-21】从数据表sgrade中查询选修了课程“c0201”或“d0201”的学生选课信息,查询结果按照学号升序排列,若学号相同再按照成绩降序排列。SELECT *FROM sgradeWHERE cno IN ('c0201','d0101')ORDER BY sno,grade DESC本例使用ORDER BY子句将查询的中间结果集以字段sno的值为基准升序排列,在sno的值相同时再以字段grade的值为基准降序排列。查询结果如图5-19所示。图5-19例5-21的查询结果
03
连接查询
5.3.1连接查询的结构——连接查询是关系数据库中重要的查询方式,具体语法格式如下:SELECT [ALL|DISTINCT] <列名> [[AS] <列别名>] [ , … n][INTO <新表名>]FROM<表名1> [[AS] <表别名1>][INNER|LEFT|RIGHT|FULL|CROSS] JOIN<表名2> [[AS] <表别名2>]ON <连接条件>[WHERE <条件1>][GROUP BY <列名1> [HAVING <条件2>] ][ORDER BY <列名2> [ASC|DESC] ]——(1)INTO表示将查询结果装入新表,<新表名>即为新表的名称。(2)INNER JOIN称为内连接,用于查询满足连接条件的记录。当JOIN前的关键字省略时,默认为此连接。(3)LEFT JOIN称为左外连接,用于查询左侧数据表的全部记录和右侧数据表满足连接条件的记录,不符合连接条件的数据自动填入NULL。(4)RIGHT JOIN称为右外连接,用于查询右侧数据表的全部记录和左侧数据表满足连接条件的记录,不符合连接条件的数据自动填入NULL。(5)FULL JOIN称为全外连接,用于查询左右两侧数据表中的所有记录(各只出现一次),不符合连接条件的数据自动填入NULL。(6)CROSS JOIN称为交叉查询,用于将两个数据表的记录逐个匹配,并生成新的记录。(7)ON指定连接条件,连接条件是一个特殊的条件表达式,用于将两个数据表的同义字段使用比较运算符连接起来,当使用“=”连接时称为等值连接;使用其他比较运算符连接时称为非等值连接。5.3.1连接查询的结构5.3.2内连接查询——【例 5-22】从数据表teacher与teaching中查询教师编号为“01001”的教师所教授的课程,并列出其姓名和所教授课程的课程编号。SELECT teacher.tn,cnoFROM teacher INNER JOIN teachingON teacher.tno=teaching.tnoWHERE tno='01001'本例使用teacher.tno=teaching.tno作为连接条件(tno为连接字段),将数据表teacher和teaching连接起来,查询字段tno为01001的记录,然后按照数据表teacher的字段tn、数据表teaching的字段cno的顺序输出查询结果,如图5-20所示。图5-20例5-22的查询结果内连接查询是指使用INNER JOIN关键字的查询。5.3.2内连接查询——除了使用上述语法格式实现连接查询外,还可以使用类似单表查询的语法格式实现连接查询。首先在FROM子句中指明连接的表名,然后在WHERE子句中指明连接条件。以实现例5-22的功能为例,T-SQL代码如下:SELECT teacher.tn,cnoFROM teacher,teachingWHERE teacher.tno=teaching.tno AND teacher.tno='01001'本例在FROM子句中指明了连接的数据表teacher与teaching;在WHERE子句中指明了连接条件,并用AND关键字与查询条件连接,查询中间结果集中字段tno的值为01001的记录,然后按照数据表teacher的字段tn、数据表teaching的字段cno的顺序输出查询结果,如图5-20所示。连接查询中同样可以使用聚合函数。5.3.2内连接查询——【例 5-23】从数据表course与sgrade中查询每门课程的课程编号、课程名称及选课人数。SELECT o,cn,COUNT(sgrade.sno) AS numFROM course,sgradeWHERE o=oGROUP BY o,cn本例在WHERE子句中使用o=o作为连接条件,在GROUP BY子句中将中间结果集按字段cno和cn进行分组,然后按照数据表course的字段cno、cn、统计后的新字段num的顺序输出查询结果,如图5-21所示。图5-21例5-23的查询结果5.3.3外连接查询——【例 5-24】从数据表course与sgrade中查询所有选课信息,并列出课程名称。SELECT sno,o,cn,gradeFROM course RIGHT JOIN sgrade ON o=o由题干可知,查询选课信息需要将数据表sgrade与数据表course进行连接。本例可使用前面讲过的内连接查询,也可使用上文给出的右外连接查询,以数据表sgrade为基准匹配数据表course中的数据,将符合条件的字段cn返回到查询结果中,如图5-22所示。图5-22例5-24的查询结果5.3.3外连接查询——【例 5-25】从数据表course与sgrade中查询所有课程的课程名称,并分别列出它们的选课信息。SELECT cn,o,sno,gradeFROM course LEFT JOIN sgrade ON o=o由题干可知,查询选课信息需要将数据表sgrade与数据表course进行连接。本例可使用前面讲过的内连接查询,也可使用上文给出的右外连接查询,以数据表sgrade为基准匹配数据表course中的数据,将符合条件的字段cn返回到查询结果中,如图5-22所示。图5-22例5-24的查询结果5.3.4交叉查询——【例 5-26】对数据表student与teacher进行交叉查询。SELECT *FROM student CROSS JOIN teacher本例在FROM子句中使用CROSS JOIN关键字对数据表student与teacher进行交叉查询,查询结果的行数是两个数据表行数的乘积,列数是两个数据表列数之和,如图5-24所示。交叉查询是指使用CROSS JOIN关键字的查询,进行交叉查询的数据表可以没有相同的字段,因此,任意两个数据表都可以进行交叉查询。图5-24例5-26的查询结果5.3.5自连接查询——【例 5-27】从数据表student中查询所有年龄比“陈月”大的学生姓名、年龄。SELECT a.sn,a.ageFROM student AS a,student AS bWHERE a.age>b.age AND b.sn='陈月'本例在FROM子句中使用AS关键字将数据表student分别命名为a、b,在WHERE子句中对数据表a、b中的字段age进行比较,并设置限制条件b.sn='陈月',实现一个数据表的自连接查询。查询结果如图5-25所示。自连接查询是对单个数据表进行的连接查询,它通过在FROM子句中定义表别名的方式与自身进行连接。图5-25例5-27的查询结果
04
嵌套查询
5.4.1普通子查询——普通子查询是指子查询可独立完成的查询,它的执行过程为,先执行子查询,然后将子查询的结果用于构造父查询的查询条件,再由父查询根据查询条件确定结果集。子查询执行后只返回一个值时,可在子查询与父查询之间使用比较运算符进行连接。1【例 5-28】从数据表teacher中查询与教师“赵乾”同系的教师姓名与职称。SELECT tn,profFROM teacherWHERE dept=(SELECT deptFROM teacherWHERE tn='赵乾')5.4.1普通子查询——本例在父查询的WHERE子句中将字段dept与子查询之间用“=”连接,将子查询所输出的值用于构造父查询的查询条件。本例在执行时,先查询出子查询的结果,即教师赵乾的系别编号,再将此编号返回给父查询的查询条件,接着查询出系别编号与子查询结果相等的教师姓名与职称。查询结果如图5-26所示。图5-26例5-28的查询结果5.4.1普通子查询——子查询执行后返回一组值时,可在比较运算符与子查询之间添加关键字ANY或ALL来实现查询过程。2【例 5-29】从数据表student、sgrade中查询选修了课程“c0201”的学生姓名。SELECT snFROM studentWHERE sno=ANY(SELECT snoFROM sgradeWHERE cno='c0201')①ANY的含义为任意一个,它与比较运算符连接并写在子查询之前,表示与查询结果中的任意值进行比较。5.4.1普通子查询——本例使用子查询在数据表sgrade中查询选修了课程编号为c0201的学生学号,接着使用该查询结果构造父查询的查询条件,查询这些学生学号在数据表student中对应的学生姓名。查询结果如图5-27所示。图5-27例5-29的查询结果当ANY前的比较运算符为“=”时,可用IN关键字代替“=ANY”。以实现例5-29的功能为例,使用IN关键字的T-SQL语句如下:SELECT snFROM studentWHERE sno IN(SELECT snoFROM sgradeWHERE cno='c0201')5.4.1普通子查询——对于实现例5-29的功能,还有更简洁的方式,其T-SQL语句如下:SELECT snFROM student,sgradeWHERE student.sno=sgrade.sno AND o='c0201'高手点拨与例5-29类似,有些嵌套查询也可以使用其他查询方式实现,它们在使用上各有利弊,读者可根据实际情况与个人习惯选取合适的查询方式。5.4.1普通子查询——子查询执行后返回一组值时,可在比较运算符与子查询之间添加关键字ANY或ALL来实现查询过程。2【例 5-30】从数据表teacher中查询其他系中比自动化系所有教师的工资都高的教师姓名与工资。SELECT tn,salFROM teacherWHERE dept< >'自动化' AND sal>ALL(SELECT sal FROM teacher WHERE dept='自动化')②ALL的含义为全部,它与比较运算符连接并写在子查询之前,表示与查询结果中的所有值进行比较。5.4.1普通子查询——本例使用子查询在数据表teacher中查询自动化系所有教师的工资,接着使用该查询结果构造父查询的查询条件,查询数据表teacher中不属于自动化系且工资大于子查询结果中所有工资值的教师记录,最后按照字段tn、sal的顺序输出查询结果,如图5-28所示。图5-28例5-30的查询结果本例也可以通过聚合函数实现,T-SQL语句如下:SELECT tn,salFROM teacherWHERE dept<>'自动化' AND sal>(SELECT MAX(sal)FROM teacherWHERE dept='自动化')本例使用MAX()函数直接查询出自动化系教师的最高工资,并将其作为一个结果值直接与比较运算符连接,从而省略ALL关键字。5.4.2相关子查询——相关子查询是指子查询的查询条件需要引用父查询中相关字段值的查询,是特殊的嵌套查询。【例 5-31】从数据表student与sgrade中查询没有选修课程“c0201”的学生姓名。SELECT snFROM studentWHERE 'c0201'< >ALL(SELECT cnoFROM sgradeWHERE sno=student.sno)本例使用子查询在数据表sgrade中查询学生选课的课程编号,接着将该查询结果与数据表student中的数据进行对比,查询课程编号中没有c0201的学生记录,然后将符合条件的字段sn输出,如图5-29所示。图5-29例5-31的查询结果5.4.2相关子查询——“< >ALL”表示不等于子查询结果中的任何一个值,可以使用“NOT IN”代替。本例还可以使用EXISTS关键字实现,T-SQL语句如下:SELECT snFROM studentWHERE NOT EXISTS(SELECT *FROM sgradeWHERE sno=student.sno AND cno='c0201')EXISTS表示存在,用于判断子查询的查询结果是否为空,如果查询结果不为空即返回逻辑值“真”,否则返回逻辑值“假”。在EXISTS前加上NOT表示不存在,其返回值与EXISTS的返回值相反。小技巧因为EXISTS与NOT EXISTS的返回值不含任何数据,只有逻辑值“真”或“假”,所以一般在子查询的SELECT语句后用“*”简写列名。实战训练——在订货管理系统数据库中添加并查询数据1.实战目的(1)熟练掌握在数据表中插入、修改及删除数据的操作。(2)熟练掌握对数据表中数据进行查询的操作。2.实战内容(1)分别为数据库ordersys的数据表customer、goods及ordering添加信息,数据内容参照表5-8~表5-10。cidcnaddstel0145沈风东街甜品店139xxxx41450132韩雅西城烘焙店136xxxx03340268杨颂中街商城158xxxx5552表5-8数据表customer的数据实战训练——在订货管理系统数据库中添加并查询数据gidgngdateprice0114蛋挞2022-8-1150117椰蓉球2022-8-11100275羊角包2022-8-12200213三明治2022-8-12150235鲜花饼2022-8-13200316鲜牛奶2022-8-13100384吐司面包2022-8-13100347风味酸奶2022-8-146oidcidgidordatenum220810c301014501172022-8-1020220810c302014502132022-8-1010220810c303013201142022-8-1015220810c304013202752022-8-1010220810c305026801172022-8-1020220810c306026802352022-8-1010220811d101014503162022-8-1110220812d102013203842022-8-125220812d103013203472022-8-1220220813d104026803842022-8-135220813d105026803162022-8-1310表5-10数据表ordering的数据表5-9数据表goods的数据实战训练——在订货管理系统数据库中添加并查询数据在数据库ordersys的查询编辑窗口中输入如下代码并执行。INSERT INTO customer VALUES /*向数据表customer中插入数据*/('0145','沈风','东街甜品店','139xxxx4145'),('0132','韩雅','西城烘焙店','136xxxx0334'),('0268','杨颂','中街商城','158xxxx5552')INSERT INTO goods VALUES /*向数据表goods中插入数据*/('0114','蛋挞','2022-8-11',5),('0117','椰蓉球','2022-8-11',10),('0275','羊角包','2022-8-12',20),('0213','三明治','2022-8-12',15),('0235','鲜花饼','2022-8-13',20),('0316','鲜牛奶','2022-8-13',10),('0384','吐司面包','2022-8-13',10),实战训练——在订货管理系统数据库中添加并查询数据('0347','风味酸奶','2022-8-14',6)INSERT INTO ordering VALUES /*向数据表ordering中插入数据*/('220810c301','0145','0117','2022-8-10','20'),('220810c302','0145','0213','2022-8-10','10'),('220810c303','0132','0114','2022-8-10','15'),('220810c304','0132','0275','2022-8-10','10'),('220810c305','0268','0117','2022-8-10','20'),('220810c306','0268','0235','2022-8-10','10'),('220811d101','0145','0316','2022-8-11','10'),('220812d102','0132','0384','2022-8-12','5'),('220812d103','0132','0347','2022-8-12','20'),('220813d104','0268','0384','2022-8-13','5'),('220813d105','0268','0316','2022-8-13','10')实战训练——在订货管理系统数据库中添加并查询数据(2)将数据表goods中的商品“风味酸奶”的生产日期修改为“2022-8-15”。UPDATE goodsSET gdate='2022-8-15'WHERE gn='风味酸奶'(3)从数据表customer中查询客户“沈风”的联系电话。SELECT telFROM customerWHERE cn='沈风'查询结果如图5-30所示。图5-30实战内容(3)的查询结果实战训练——在订货管理系统数据库中添加并查询数据(4)查询所有订购单。SELECT ordering.oid AS '订单编号', AS '客户姓名',goods.gn AS '商品名称',goods.price AS '商品价格',ordering.num AS '订购数量',goods.price*ordering.num AS '商品总价',ordering.ordate AS '订购日期'FROM ordering JOIN goods ON ordering.gid=goods.gidJOIN customer ON customer.cid=ordering.cid查询结果如图5-31所示。图5-31实战内容(4)的查询结果实战训练——在订货管理系统数据库中添加并查询数据(5)删除数据表ordering中订单编号为“220813d105”的订购记录。DELETE FROM orderingWHERE oid='220813d105'高手点拨订购单内容通常包括订单编号、客户姓名、商品名称、商品价格、订购数量、商品总价(商品价格与订购数量的乘积)及订购日期等内容,此处通过对3张数据表进行连接查询的方式实现订购单内容的输出。——课堂总结①数据更新②简单查询③连接查询④嵌套查询

展开更多......

收起↑

资源预览