Transact-SQL第10章.ppt
《Transact-SQL第10章.ppt》由会员分享,可在线阅读,更多相关《Transact-SQL第10章.ppt(157页珍藏版)》请在三一办公上搜索。
1、1,第9章 Transact-SQL,2,SQL的特点,1.综合统一2.高度非过程化3.面向集合的操作方式4.以同一种语法结构提供两种使用方法5.语言简洁,易学易用,3,语言简捷,易学易用,4,SELECT语句是掌握SQL语言的关键在创建视图、插入数据(大部分)均需查询语句。,5,单表查询连接查询嵌套查询集合查询,9.2.4 数据查询,6,SELECT语句的语法格式为:语句格式SELECT ALL|DISTINCT,INTO 新表名FROM,WHERE GROUP BY HAVING ORDER BY ASC|DESC,SELECT语句概述,7,语句格式,SELECT子句:指定要显示的属性列F
2、ROM子句:指定查询对象(基本表或视图)WHERE子句:指定查询条件 GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用集函数。HAVING短语:筛选出只有满足指定条件的组ORDER BY子句:对查询结果表按指定列值的升序或降序排序,8,注意把SELECT语句和关系代数表达式联系起来考虑问题SELECT-FROM-WHERE句型 A1An(F(R1 R2Rn)SELECT A1,An FROM R1,R2,Rn WHERE F,9,示例数据库,Xjgl(学籍管理)数据库学生表:Student(Sno,Sname,Ssex,Sage,Sdept)课
3、程表:Course(Cno,Cname,Cpno,Ccredit)学生选课表:SC(Sno,Cno,Grade),10,单表查询,查询仅涉及一个表,是一种最简单的查询操作一、选择表中的若干列(投影查询)二、选择表中的若干元组(选择查询)三、对查询结果排序(排序查询)四、使用集函数五、对查询结果分组,11,1、查询指定列,例1 查询全体学生的学号与姓名。SELECT Sno,SnameFROM Student例2 查询全体学生的姓名、学号、所在系。SELECT Sname,Sno,SdeptFROM Student,一、选择表中的若干列,验证,12,2、查询全部列,例3 查询全体学生的详细记录。
4、SELECT Sno,Sname,Ssex,Sage,Sdept FROM Student 或SELECT*FROM Student,13,3、查询经过计算的值,SELECT子句的为表达式算术表达式字符串常量函数列别名等,14,3.查询经过计算的值(续),例4 查全体学生的姓名及其出生年份。SELECT Sname,2000-SageFROM Student输出结果:Sname 无列名-李勇 1976 刘晨 1977 王名 1978 张立 1978,15,3.查询经过计算的值(续),例5 查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名。SELECT Sname,Year of
5、Birth:,2000-Sage,LOWER(Sdept)FROM Student,验证,16,例题(续),输出结果:Sname 无列名 无列名 无列名-李勇 Year of Birth:1976 cs 刘晨 Year of Birth:1977 is 王名 Year of Birth:1978 ma 张立 Year of Birth:1977 is,17,例6 使用列别名改变查询结果的列标题,SELECT Sname NAME,Year of Birth:BIRTH,2000-Sage BIRTHDAY,LOWER(Sdept)DEPARTMENTFROM Student或SELECT Sn
6、ame as NAME,Year of Birth:as BIRTH,2000-Sage as BIRTHDAY,LOWER(Sdept)as DEPARTMENTFROM Student输出结果:NAME BIRTH BIRTHDAY DEPARTMENT-李勇 Year of Birth:1976 cs 刘晨 Year of Birth:1977 is 王名 Year of Birth:1978 ma 张立 Year of Birth:1977 is,18,二、选择表中的若干元组,消除取值重复的行查询满足条件的元组,19,1.消除取值重复的行,在SELECT子句中使用DISTINCT短语假
7、设SC表中有下列数据 Sno Cno Grade-95001 1 92 95001 2 85 95001 3 88 95002 2 90 95002 3 80,20,ALL 与 DISTINCT,例7 查询选修了课程的学生学号。(1)SELECT Sno FROM SC或(默认 ALL)SELECT ALL Sno FROM SC结果:Sno-95001 95001 95001 95002 95002,21,例题(续),(2)SELECT DISTINCT Sno FROM SC结果:Sno-95001 95002,验证,22,例题(续),注意 DISTINCT短语的作用范围是所有目标列例:查
8、询选修课程的各种成绩错误的写法SELECT DISTINCT Cno,DISTINCT GradeFROM SC正确的写法 SELECT DISTINCT Cno,Grade FROM SC,23,2.查询满足条件的元组,WHERE子句常用的查询条件,24,(1)比较大小,在WHERE子句的中使用比较运算符=,=,!,!=20,25,(2)确定范围,使用谓词 BETWEEN AND NOT BETWEEN AND 例9 查询年龄在2023岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。SELECT Sname,Sdept,SageFROM StudentWHERE Sage BETWEE
9、N 20 AND 23,26,例题(续),例10 查询年龄不在2023岁之间的学生姓名、系别和年龄。SELECT Sname,Sdept,SageFROM StudentWHERE Sage NOT BETWEEN 20 AND 23,验证,27,(3)确定集合,使用谓词 IN,NOT IN:用逗号分隔的一组取值例11查询信息系(IS)、数学系(MA)和计 算机科学系(CS)学生的姓名和性别。SELECT Sname,SsexFROM StudentWHERE Sdept IN(IS,MA,CS),28,(3)确定集合,例12查询既不是信息系、数学系,也不是计算 机科学系的学生的姓名和性别。S
10、ELECT Sname,SsexFROM StudentWHERE Sdept NOT IN(IS,MA,CS),验证,29,(4)字符串匹配,NOT LIKE ESCAPE:指定匹配模板 匹配模板:固定字符串或含通配符的字符串 当匹配模板为固定字符串时,可以用=运算符取代 LIKE 谓词 用!=或 运算符取代 NOT LIKE 谓词,30,通配符,%(百分号)代表任意长度(长度可以为0)的字符串例:a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab 等都满足该匹配串例:SELECT Sname FROM Student WHERE Sname LIKE A%T_(下横
11、线)代表任意单个字符例:a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等都满足该匹配串例:SELECT Sname FROM Student WHERE Sname LIKE A_B,Sqlserver中通配符,31,ESCAPE 短语:,当用户要查询的字符串本身就含有%或 _ 时,要使用ESCAPE 短语对通配符进行转义。,32,1)匹配模板为固定字符串,例14 查询学号为04010001的学生的详细情况。SELECT*FROM Student WHERE Sno LIKE 04010001 等价于:SELECT*FROM Student WHERE Sno=04010
12、001,33,2)匹配模板为含通配符的字符串,例15 查询所有姓张的学生的姓名、学号和性别。SELECT Sname,Sno,Ssex FROM Student WHERE Sname LIKE 张%,验证,34,匹配模板为含通配符的字符串(续),例16 查询姓欧阳且全名为三个字的学生的姓名。SELECT Sname FROM Student WHERE Sname LIKE 欧阳_,35,匹配模板为含通配符的字符串(续),例17 查询名字中第2个字为阳字的学生的姓名和学号。SELECT Sname,Sno FROM Student WHERE Sname LIKE _阳%,36,匹配模板为含
13、通配符的字符串(续),例18 查询所有不姓张的学生姓名。SELECT Sname,Sno,Ssex FROM Student WHERE Sname NOT LIKE 张%,37,3)使用换码字符将通配符转义为普通字符,例19 查询DB_Design课程的课程号和学分。SELECT Cno,Cname,CCRIDE FROM Course WHERE Cname LIKE DB_Design ESCAPE,验证,38,使用换码字符将通配符转义为普通字符(续),例20 查询以DB_开头,且倒数第3个字符为 i的课程的详细情况。SELECT*FROM Course WHERE Cname LIKE
14、 DB_%i_ ESCAPE,39,(5)涉及空值的查询,使用谓词 IS NULL 或 IS NOT NULL“IS NULL”不能用“=NULL”代替例21 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。SELECT Sno,Cno FROM SC WHERE Grade IS NULL,40,例题(续),例22 查所有有成绩的学生学号和课程号。SELECT Sno,Cno FROM SC WHERE Grade IS NOT NULL,41,(6)多重条件查询,用逻辑运算符AND和 OR来联结多个查询条件 AND的优先级高于OR 可
15、以用括号改变优先级可用来实现多种其他谓词 NOT IN NOT BETWEEN AND,42,例题,例23 查询计算机系年龄在20岁以下的学生姓名。SELECT Sname FROM Student WHERE Sdept=CS AND Sage20,43,改写例11,例11 查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。SELECT Sname,SsexFROM StudentWHERE Sdept IN(IS,MA,CS)可改写为:SELECT Sname,SsexFROM StudentWHERE Sdept=IS OR Sdept=MA OR Sdept=C
16、S,44,改写例9,例9 查询年龄在2023岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。SELECT Sname,Sdept,SageFROM StudentWHERE Sage BETWEEN 20 AND 23 可改写为:SELECT Sname,Sdept,SageFROM Student WHERE Sage=20 AND Sage=23,45,三、对查询结果排序,使用ORDER BY子句 可以按一个或多个属性列排序 升序:ASC;降序:DESC;缺省值为升序当排序列含空值时ASC:排序列为空值的元组最先显示DESC:排序列为空值的元组最后显示,46,对查询结果排序(续),例
17、24 查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。SELECT Sno,Grade FROM SC WHERE Cno=3 ORDER BY Grade DESC,验证,47,对查询结果排序(续),例25 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。SELECT*FROM Student ORDER BY Sdept,Sage DESC,48,四、使用集函数,5类主要集函数计数COUNT(*)COUNT(DISTINCT|ALL)计算指定列中选择的项数,COUNT(*)统计查询输出的行数 计算总和-计算指定列中的数值总和 SUM(DIST
18、INCT|ALL)计算平均值-计算一个数值型列的平均值 AVG(DISTINCT|ALL),49,使用集函数(续),求最大值-计算指定列中的最大值 MAX(DISTINCT|ALL)求最小值-计算指定列中的最小值 MIN(DISTINCT|ALL)DISTINCT短语:在计算时要取消指定列中的重复值ALL短语:不取消重复值ALL为缺省值,50,使用集函数(续),例26 查询学生总人数。SELECT COUNT(*)FROM StudentCOUNT(*)用来统计元组的个数不消除重复行,不允许使用DISTINCT关键字。例27 查询选修了课程的学生人数。SELECT COUNT(DISTINCT
19、 Sno)FROM SC注:用DISTINCT以避免重复计算学生人数,COUNT函数对空值不计算,但对零进行计算。比较SELECT COUNT(Sno)FROM SC,51,使用集函数(续),例28 计算1号课程的学生平均成绩。SELECT AVG(Grade)AS 平均成绩 FROM SC WHERE Cno=1例29 查询选修1号课程的学生最高分数。SELECT MAX(Grade)FROM SC WHERe Cno=1,验证,52,课堂练习,1.求选修1号课程的最高分、最低分及之间相差的分数 SELECT MAX(grade)AS MaxScore,MIN(grade)AS MinSco
20、re,MAX(grade)-MIN(grade)AS DiffFROM SC WHERE CNO=1 2。计算选择1号课程的学生人数SELECT COUNT(*)FROM SCWHERE CNO=1,53,五、对查询结果分组,使用GROUP BY子句分组 细化集函数的作用对象 未对查询结果分组,集函数将作用于整个查询结果 对查询结果分组后,集函数将分别作用于每个组,54,使用GROUP BY子句分组,例30 求各个课程号及相应的选课人数。SELECT Cno,COUNT(Sno)选课人数 FROM SC GROUP BY Cno 结果 Cno 选课人数 1 4 2 2 3 2 4 3 5 3,
21、验证,55,对查询结果分组(续),GROUP BY子句的作用对象是查询的中间结果表分组方法:按指定的一列或多列值分组,值相等的为一组使用GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性和集函数实验以下语句,看有什么错误提示:SELECT sno,Cno,COUNT(Sno)选课人数 FROM SC GROUP BY Cno,56,使用HAVING短语筛选最终输出结果,例31 查询选修了3门以上课程的学生学号。SELECT SnoFROM SC GROUP BY SnoHAVING COUNT(*)3注:GROUP BY子句按SNO的值分组,所有具有相同SNO的元组为一组,对
22、每一组使用函数COUNT进行计算,统计出每位学生选课的门数。HAVING子句去掉不满足COUNT(*)3的组,57,例题,例32 查询有3门以上课程是60分以上的 学生的学号及(60分以上的)课程数 SELECT Sno,COUNT(*)AS 及格门数 FROM SC WHERE Grade=60 GROUP BY Sno HAVING COUNT(*)=3,验证,58,使用HAVING短语筛选最终输出结果,只有满足HAVING短语指定条件的组才输出HAVING短语与WHERE子句的区别:作用对象不同WHERE子句作用于基表或视图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足
23、条件的组。,59,当WHERE子句、GROUP BY子句、和HAVING子句同时出现在一个查询中时,SELECT-SQL的执行顺序如下:,l 执行WHERE子句,从表中选取行l 由GROUP BY对选取的行进行分组l 执行集函数l 执行HAVING子句选取满足条件的元组,60,例33:查询SC表中至少有2名学生选修的并以“1”开头的课程号的平均成绩,SELECT CNO,AVG(GRADE)FROM SC WHERE CNO LIKE 1%GROUP BY CNO HAVING COUNT(*)2,61,例34:查询某人成绩最低分大于50,最高分小于90的学号,SELECT SNO FROM
24、SC GROUP BY SNO HAVING MIN(GRADE)50 AND MAX(GRADE)90,62,例35:求选课在三门以上且各门课程均及格的学生的学号及其总成绩,查询结果按总成绩降序列出。,SELECT SNO,SUM(GRADE)FROM SCWHERE GRADE=60GROUP BY SNOHAVING COUNT(*)=3ORDER BY SUM(GRADE)DESC,验证,63,此语句为分组排序,执行过程如下:1.(FROM)取出整个SC2.(WHERE)筛选GRADE=60的元组3.(GROUP BY)将选出的元组按SNO分组4.(HAVING)筛选选课三门以上的分组
25、5.(SELECT)以剩下的组中提取学号和总成绩6.(ORDER BY)将选取结果排序,64,连接查询,同时涉及多个表的查询称为连接查询用来连接两个表的条件称为连接条件或连接谓词 一般格式:.比较运算符:=、=、.BETWEEN.AND.,65,连接查询(续),连接字段连接谓词中的列名称为连接字段连接条件中的各连接字段类型必须是可比的,但不必是相同的,66,连接查询(续),SQL中连接查询的主要类型 广义笛卡尔积(交叉连接)等值连接(含自然连接)非等值连接查询 自身连接查询 外连接查询 复合条件连接查询,67,一、广义笛卡尔积(交叉连接),不带连接谓词的连接 很少使用例:SELECT Stud
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Transact SQL 10
链接地址:https://www.31ppt.com/p-6522108.html