1、2020/1/15,Microsoft SQL Server 2005,1,Select 查询,2020/1/15,Microsoft SQL Server 2005,2,SELECT语法总结,SELECT */字段名,字段名 FROM 表名 WHERE 条件表达式 GROUP BY 分组的字段名 HAVING 条件表达式 ORDER BY 排序的字段名 ASC | DESC ,上述“ ”表示可选项,“ | ”表示取其中之一。,2020/1/15,Microsoft SQL Server 2005,3,简单Select 查询,语法: SELECT 字段1,字段2, FROM 表名 SELECT
2、 * FROM 表名 SELECT 字段1,字段2, FROM 表名 WHERE 查询条件 SELECT * FROM 表名 WHERE 查询条件,简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。 -,2020/1/15,Microsoft SQL Server 2005,4,简单Select 查询,SELECT StuId,StuName,DeptId,Sex FROM Tb_Student,SELECT * FROM Tb_Student,2020/1/15,Microsoft SQL Server 20
3、05,5,简单Select 查询,SELECT StuId,StuName,DeptId,Sex FROM Tb_Student WHERE Sex=F,SELECT * FROM Tb_Teacher WHERE Sex=F and DeptId= 08,2020/1/15,Microsoft SQL Server 2005,6,WHERE子句使用的运算符,2020/1/15,Microsoft SQL Server 2005,7,比较运算符和表达式,SELECT * FROM Tb_Student WHERE StuName张三,SELECT * FROM Tb_Student WHERE
4、 Sex= F,2020/1/15,Microsoft SQL Server 2005,8,逻辑运算符和表达式,SELECT * FROM Tb_Student WHERE Sex= M and Sex= F,SELECT * FROM Tb_Student WHERE ClassId= S040201101 and Sex= F,SELECT * FROM Tb_Student WHERE NOT Sex= M,2020/1/15,Microsoft SQL Server 2005,9,范围搜索运算符和表达式,SELECT * FROM Tb_Student WHERE Age BETWEE
5、N 20 TO 22 - SELECT * FROM Tb_StudentWHERE Age NOT BETWEEN 20 TO 22 - SELECT * FROM Tb_Student WHERE Age IN (20,21,22) - 相当于SELECT * FROM Tb_Student WHERE Age=20 OR Age=21 OR Age=22,2020/1/15,Microsoft SQL Server 2005,10,模式匹配运算符和表达式,SELECT * FROM Tb_Student WHERE StuName LIKE 张%,SELECT * FROM Tb_Stu
6、dent WHERE StuName NOT LIKE 张三,2020/1/15,Microsoft SQL Server 2005,11,未知值条件,NULL表示未知的,不可用或将在以后添加的数据。NULL值与零、零长度的字符串的含义不同。 在WHERE子句中,使用IS NULL或IS NOT NULL条件可以查询某一数据值是否为NULL的数据信息。 例如:,SELECT * FROM Tb_Grade WHERE RetestScore IS NOT NULL,SELECT * FROM Tb_Course WHERE CourseName IS NULL,2020/1/15,Micros
7、oft SQL Server 2005,12,字符串运算符和表达式,字符串表达式是用字符串连接符()将字符型常量、变量、字符串函数连接组成的式子。字符串表达式的计算结果包括两个字符串内的空格和所有字符,仍然是字符型。 如 我爱+ 我家 表达式的值为: 我爱 我家 -例如:Beijing+ Huanying + Ning!请写出结果!,2020/1/15,Microsoft SQL Server 2005,13,运算符的优先级,运算符的优先级决定了表达式的计算和比较操作顺序。 运算符的优先级由高到低的顺序为: 1)括号:()。 2)正、负或取反运算:+、-、。 3)乘、除、求模运算:*、/、。
8、4)加、减、字符连接运算:+、-、+。 5)比较运算:、!、!、!。 6)位运算:、|。 7)逻辑非运算:NOT。 8)逻辑与运算:AND。 9) BETWEEN、IN、LIKE、OR等运算。 10)赋值运算:。,2020/1/15,Microsoft SQL Server 2005,14,ORDER BY子句,使用SELECT语句进行数据查询,为了按一定顺序浏览数据,可以使用ORDER BY子句对生成的查询结果进行排序。ORDER BY子句在SELECT语句中的语法格式如下: -SELECT 字段1,字段2, FROM 表名 WHERE 查询条件ORDER BY 排序表达式 ASC | DE
9、SC,2020/1/15,Microsoft SQL Server 2005,15,ORDER BY子句,SELECT StuId,StuName,Sex FROM Tb_Student WHERE DeptId=08 ORDER BY StuName,SELECT StuId,StuName,Sex FROM Tb_Student WHERE DeptId=08 ORDER BY StuName DESC,2020/1/15,Microsoft SQL Server 2005,16,ORDER BY子句,SELECT StuId,StuName,Sex FROM Tb_Student WHE
10、RE DeptId=08 ORDER BY StuName,Sex 结果如何?,2020/1/15,Microsoft SQL Server 2005,17,ORDER BY子句,ORDER BY子句总是位于WHERE子句(如果有的话)后面,可以包含一个或多个列,每个列之间以逗号分隔。这些列可能是表中定义的列,也可能是SELECT子句中定义的计算列。 - 在SQL Server 2005中,汉字比其它字符值都要大,而汉字之间的大小比较是取决于其拼音首字母的大小。 如果没有特别说明,值是以升序序列进行排序的。当然,你也可以选择使用ASC关键字指定升序排序。 - 如果你希望以降序排列,则在ORDE
11、R BY后面使用DESC关键字。,2020/1/15,Microsoft SQL Server 2005,18,GROUP BY 子句,使用SELECT语句进行数据查询,为了按特定条件分组浏览数据,可以使用GROUP BY子句对某一列数据的值进行分类,形成结果集。GROUP BY子句在SELECT语句中的语法格式如下: -SELECT 字段1,字段2, FROM 表名 WHERE 查询条件GROUP BY 字段1,字段2, WITH ROLLUP | CUBEORDER BY 排序表达式 ASC | DESC -CUBE 生成的结果集显示了所选列中值的所有组合(包括字段1、字段2、字段1+字段
12、2)的分组统计结果和总的汇总统计的聚合; ROLLUP生成的结果集显示了所选列中值的某一层次结构的聚合。(包括字段1、字段1+字段2的分组统计结果和总的汇总统计的聚合),2020/1/15,Microsoft SQL Server 2005,19,聚合函数,聚合函数是SQL语言中一种特殊的函数,比如SUM, COUNT, MAX, MIN, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。换句话说,上面几个返函数的值建立在对多条记录进行统计的基础上。 SUM是求和函数。 SELECT ClassId,SUM(Score) FROM Tb_Grade WHERE ClassI
13、d=S0408011 COUNT函数用来计算记录的数量。 Select COUNT(StuID) FROM Tb_Grade WHERE ClassId=S0408011 MAX, MIN, AVG函数分别是用来求最大值、最小值和平均值。 SELECT MAX(Score), MIN(Score), AVG(Score) FROM Tb_Grade WHERE ClassId=S0408011,2020/1/15,Microsoft SQL Server 2005,20,GROUP BY 子句,常用统计函数,2020/1/15,Microsoft SQL Server 2005,21,GROU
14、P BY子句,-显示每个学生的班级编码和成绩 SELECT ClassId,TotalScore FROM Tb_Grade - -汇总每个班级的平均成绩 SELECT ClassId,AVG(TotalScore) FROM Tb_Grade GROUP BY ClassId,2020/1/15,Microsoft SQL Server 2005,22,- SELECT ClassId,ClassName,AVG(TotalScore) FROM Tb_Grade,Tb_Class GROUP BY ClassId,GROUP BY子句,-汇总每个班级(含班级名称)的平均成绩? SELECT
15、 ClassId,ClassName,AVG(TotalScore) FROM Tb_Grade GROUP BY ClassId,- SELECT Tb_Grade.ClassId,ClassName,AVG(TotalScore) FROM Tb_Grade,Tb_Class WHERE Tb_Grade.ClassId=Tb_Class.ClassId GROUP BY Tb_Grade.ClassId,2020/1/15,Microsoft SQL Server 2005,23,GROUP BY子句,-显示班级名称的汇总各班平均成绩 SELECT Tb_Grade.ClassId,Cl
16、assName,AVG(TotalScore) AS AvgScore FROM Tb_Grade,Tb_Class WHERE Tb_Grade.ClassId=Tb_Class.ClassId GROUP BY Tb_Grade.ClassId,ClassName,当两个表中都有ClassId字段时,要加上表前缀,说明是那个表的ClassId字段,SELECT列表中出现的字段都必须要在GROUP BY列表中出现,聚合函数字段除外,当要显示相关主键表中的其它字段时,如这儿的ClassName字段,则在WHERE子句中通过主外键关系进行连接,2020/1/15,Microsoft SQL Se
17、rver 2005,24,GROUP BY 子句,查询各个班级的最大成绩和最小成绩?,SELECT Tb_Grade.ClassId,ClassName,MAX(TotalScore) AS MaxScore, MIN(TotalScore) AS MinScore FROM Tb_Grade,Tb_Class WHERE Tb_Grade.ClassId=Tb_Class.ClassId GROUP BY Tb_Grade.ClassId,ClassName,2020/1/15,Microsoft SQL Server 2005,25,GROUP BY 子句,GROUP BY分类汇总,分项统
18、计 紧跟在GROUP BY后面的字段就是分组条件。 如果在前面选择列表中出现的非聚合字段未出现在GROUP BY后面,SQL语句就会出错。思考题:按照不同班级和性别统计学生平均年龄。,2020/1/15,Microsoft SQL Server 2005,26,HAVING子句,HAVING子句相当于一个用于组(分类汇总)的WHERE子句,它指定了组或聚合的查询条件。HAVING子句通常与GROUP BY子句一起使用。HAVING子句的语法为: -SELECT 字段1,字段2, FROM 表名WHERE 查询条件GROUP BY字段1,字段2, HAVING 组查询条件,2020/1/15,M
19、icrosoft SQL Server 2005,27,HAVING子句,显示各班级学生平均总成绩大于73的班级编号。 SELECT Tb_Grade.ClassId, AVG(TotalScore) AS AvgScore FROM Tb_Grade GROUP BY Tb_Grade.ClassId HAVING AVG(TotalScore)73,2020/1/15,Microsoft SQL Server 2005,28,HAVING子句,求各个班级的最大成绩和最小成绩,且最低成绩小于50分的?,SELECT Tb_Grade.ClassId, MAX(TotalScore) AS M
20、axScore, MIN(TotalScore) AS MinScore FROM Tb_Grade GROUP BY Tb_Grade.ClassId HAVING MIN(TotalScore)50,2020/1/15,Microsoft SQL Server 2005,29,HAVING子句,HAVING子句用来对分组后的数据进行筛选,它后面会跟一个条件表达式。 当在GROUP BY 子句中使用HAVING子句时,查询结果中只返回满足HAVING条件的组。,2020/1/15,Microsoft SQL Server 2005,30,SELECT语法总结,SELECT */字段名,字段名
21、 FROM 表名 WHERE 条件表达式 GROUP BY 分组的字段名 HAVING 条件表达式 ORDER BY 排序的字段名 ASC | DESC ,上述“ ”表示可选项,“ | ”表示取其中之一。,2020/1/15,Microsoft SQL Server 2005,31,计算列,SELECT后面还可以是计算列。在SELECT后面的计算列,只是位于该SELECT语句中,是临时性的,它由一个表达式产生。 SELECT StuId, StuName+(+Sex+) FROM Tb_Student 上面语句中的StuName+(+Sex+)就构成了一个计算列,它的值由两个字符型值和一对括号
22、连接组成。,2020/1/15,Microsoft SQL Server 2005,32,列别名,在上面的结果集中,列名都是英文。这样看上去很不直观,我们希望能够给列名换上诸如“学号、姓名”等这样的名字。只需在SELECT语句中,给列取个别名即可。AS可以省去。 SELECT StuId AS 学号, StuName+ (+Sex+) AS 姓名性别 FROM Tb_Student SELECT StuId 学号, StuName+ (+Sex+) 姓名性别 FROM Tb_Student SELECT 学号=StuId,姓名性别=StuName+(+Sex+) FROM Tb_Student
23、,2020/1/15,Microsoft SQL Server 2005,33,当然,我们也可以给表指定列别名,给表取别名和给列取别名类似,但只可以用 “原始表名 AS 别名”和 “原始表名 别名”这两种方式。 SELECT * FROM Tb_Student ST 或者 SELECT * FROM Tb_Student AS ST - 字段别名不能放在WHERE子句中,而表别名可以放在WHERE子句中。,表别名,2020/1/15,Microsoft SQL Server 2005,34,多表查询,2020/1/15,Microsoft SQL Server 2005,35,查询全院各系部拥
24、有班级的基本情况,显示系部名称、班级编码和班级名称;,多表查询,2020/1/15,Microsoft SQL Server 2005,36,USE Teaching_System GO SELECT d.*, c.* FROM Tb_Class AS c, Tb_Dept AS d,多表查询,2020/1/15,Microsoft SQL Server 2005,37,笛卡尔乘积,多表查询,2020/1/15,Microsoft SQL Server 2005,38,多表查询,2020/1/15,Microsoft SQL Server 2005,39,多表查询,2020/1/15,Micr
25、osoft SQL Server 2005,40,USE Teaching_System GO SELECT d.*, c.* FROM Tb_Class AS c, Tb_Dept AS d WHERE c.DeptId=d.DeptId,多表查询,2020/1/15,Microsoft SQL Server 2005,41,多表查询,SELECT StuId,StuName,DeptId,SpecId,ClassId,Sex FROM Tb_Student,SELECT StuId 学号,StuName 姓名,DeptId 系部,SpecId 专业,ClassId 班级,Sex 性别 FR
26、OM Tb_Student,2020/1/15,Microsoft SQL Server 2005,42,两表连接,SELECT StuId 学号,StuName 姓名,DeptName 系部, SpecId 专业,ClassId 班级,Sex 性别 FROM Tb_Student TS,Tb_Dept TD WHERE TS.DeptId=TD.DeptId,2020/1/15,Microsoft SQL Server 2005,43,多表连接基础,在实际查询应用中,用户所需要的数据并不全部在一个表中,这时就需要多表查询,从多个表中抽取我们所需要的数据信息。 多表查询实际上是通过各个表之间的
27、共同列的相关性(主外键关系)来查询数据的,这是关系数据库查询数据的主要特征。 多表查询首先要用WHERE子句在表之间建立连接关系。 在进行多表查询时,可以遵循以下基本原则:(1)SELECT子句列表中,字段前要加上基表名称;(2)FROM子句应包括所有使用的基表;(3)WHERE子句应在表之间建立连接关系。,2020/1/15,Microsoft SQL Server 2005,44,两表连接,SELECT StuId 学号,StuName 姓名,DeptId 系部编码, DeptName 系部, SpecId 专业,ClassId 班级,Sex 性别 FROM Tb_Student TS,T
28、b_Dept TD WHERE TS.DeptId=TD.DeptId,SELECT StuId 学号,StuName 姓名, TS.DeptId 系部编码, DeptName 系部, SpecId 专业,ClassId 班级,Sex 性别 FROM Tb_Student TS,Tb_Dept TD WHERE TS.DeptId=TD.DeptId,2020/1/15,Microsoft SQL Server 2005,45,多表连接,SELECT StuId 学号,StuName 姓名,DeptName 系部, SpecName 专业,ClassName 班级,Sex 性别 FROM Tb
29、_Student TS,Tb_Dept TD,Tb_Spec TSP, Tb_Class TC WHERE TS.DeptId=TD.DeptId AND TS.SpecId=TSP.SpecId AND TS.ClassId=TC.ClassId,要求显示学生姓名和所在系名、专业、班级名称?,2020/1/15,Microsoft SQL Server 2005,46,各种连接查询,内连接:内连接是一种常用的数据连接查询方式。它使用比较运算符进行多个表之间的比较连接操作。内连接会消除与另一个表的任何不匹配的数据行。 外连接:外连接会返回FROM子句中提到的至少一个表的所有符合查询条件的数据行
30、(包括连接中不匹配的数据行),外连接分为左外连接、右外连接和完全连接。 交叉连接:当对两个表使用交叉连接查询时,将返回来自这两个表的各行的所有可能的数据行组合。 自连接:表自身的链接参见教材p119。,2020/1/15,Microsoft SQL Server 2005,47,两个样例表,SELECT * FROM Tb_DeptSELECT ClassId,ClassName,DeptId FROM Tb_Class,2020/1/15,Microsoft SQL Server 2005,48,内连接,SELECT DeptName 系部名称, ClassId 班级编码, ClassNam
31、e 班级名称 FROM Tb_Dept INNER JOIN Tb_Class ON Tb_Class.DeptId=Tb_Dept.DeptId,等同于: SELECT DeptName 系部名称, ClassId 班级编码, ClassName 班级名称 FROM Tb_Class,Tb_Dept WHERE Tb_Dept.DeptId=Tb_Class.DeptId,2020/1/15,Microsoft SQL Server 2005,49,外连接-左外连接,SELECT DeptName 系部名称, ClassId 班级编码, ClassName 班级名称 FROM Tb_Dept
32、 LEFT OUTER JOIN Tb_Class ON Tb_Dept.DeptId=Tb_Class.DeptId 左边表中列全显示,2020/1/15,Microsoft SQL Server 2005,50,外连接-右外连接,SELECT DeptName 系部名称, ClassId 班级编码, ClassName 班级名称 FROM Tb_Dept RIGHT OUTER JOIN Tb_Class ON Tb_Dept.DeptId=Tb_Class.DeptId 右边表中列全显示,2020/1/15,Microsoft SQL Server 2005,51,外连接-完全连接,SE
33、LECT DeptName 系部名称, ClassId 班级编码, ClassName 班级名称 FROM Tb_Dept FULL OUTER JOIN Tb_Class ON Tb_Dept.DeptId=Tb_Class.DeptId,2020/1/15,Microsoft SQL Server 2005,52,交叉连接,SELECT DeptName 系部名称, ClassId 班级编码, ClassName 班级名称 FROM Tb_Dept CROSS JOIN Tb_Class,2020/1/15,Microsoft SQL Server 2005,53,交叉连接,不使用WHER
34、E子句时,返回的结果是一个基本表中符合条件的行数乘以另一个基本表中符合条件的行数。 使用WHERE子句时,返回的结果是被连接的两个基本表所有行的笛卡尔积中满足WHERE条件的所有行的行数。 参见教材p118,2020/1/15,Microsoft SQL Server 2005,54,联合查询(UNION),如果有多个不同的查询结果,但又希望将这些查询结果放在一起显示,组成一组数据。在这种情况下,可以使用UNION子句。使用UNION子句的查询又称为联合查询,它可以将两个和多个查询结果集组合成为单个结果集。语法如下: SELECT select_list FROM table_list WHE
35、RE search_conditions UNION ALL SELECT select_list FROM table_list WHERE search_conditions 其中,ALL关键字为可选的,如果在UNION子句中使用该关键字,则返回全部数据行;如果不使用该关键字,则返回结果中删除重复数据行。,2020/1/15,Microsoft SQL Server 2005,55,联合查询(UNION),SELECT * FROM Tb_Spec WHERE SpecId08 UNION SELECT StuId,StuName,Sex FROM Tb_Student WHERE Cla
36、ssIdS0408011,2020/1/15,Microsoft SQL Server 2005,56,章节综合练习,每个学年结束,班主任都要对班级学生成绩进行分析,然后初定学年奖学金获得者的人选。让我们运用数据库查询的知识帮助04网络1班的班主任刘老师完成以下两个任务: 根据学院奖学金评选规定,初定获奖学金学生名单;(每位同学的课程平均成绩必须高于75分) 对该班级开设的各门课程分别进行成绩分析。显示课程编号、学生学号和成绩的明细并分别汇总每门课程的平均成绩。,2020/1/15,Microsoft SQL Server 2005,57,章节综合练习,2020/1/15,Microsoft
37、SQL Server 2005,58,任务一,USE Teaching_System GO SELECT StuId 学号, AVG(TotalScore) AS 平均成绩 FROM Tb_Grade WHERE ClassId=S0408011 GROUP BY StuId HAVING AVG(TotalScore)=75,2020/1/15,Microsoft SQL Server 2005,59,任务二,USE Teaching_System GO SELECT CourseId AS 课程编号, StuId AS 学号,ROUND(TotalScore,2) AS 成绩 FROM T
38、b_Grade WHERE ClassId=S0408011 ORDER BY CourseId COMPUTE AVG(ROUND(TotalScore,2) ) BY CourseId,2020/1/15,Microsoft SQL Server 2005,60,COMPUTE根据COMPUTE后面子句的形式生成合计,并附加在查询结果集的最后,作为单独的一行记录显示合计结果。类似于在EXECL表中对某一列数据求和或求平均值的计算形式。COMPUTE往往后面与BY一起使用,表示按照BY后面的表达式字段进行分类汇总生成合计。,任务二,2020/1/15,Microsoft SQL Server
39、 2005,61,在COMPUTE子句中使用的字段表达式必须存在于SELECT子句中,如上例中COMPUTE后面的【ROUND(TotalScore,2)】字段就是如此。同时,COMPUTE BY必须与ORDER BY子句一起使用,且COMPUTE 后面的BY字段必须与ORDER BY后面的字段相同,或者是它的子集,且排列的顺序也要完全一致,这一点要特别注意。,任务二,2020/1/15,Microsoft SQL Server 2005,62,多表连接查询综合运用,教务处管理员要定期对全院各系部、班级、课程学习情况进行统计跟踪,及时做好院系两级间的教学反馈。请帮助管理员完成以下常规数据统计查
40、询工作: 查询全院各系部拥有班级的基本情况,显示系部名称、班级编码和班级名称; 检索成绩表Tb_Grade,要求查询并显示班级学生学号、姓名、课程名和课程成绩; 查询并统计各系部的班级数,没有班级的系部班级数显示为0。,2020/1/15,Microsoft SQL Server 2005,63,任务一,USE Teaching_System GO SELECT d.*, c.* FROM Tb_Class AS c, Tb_Dept AS d WHERE c.DeptId=d.DeptId,2020/1/15,Microsoft SQL Server 2005,64,任务二,USE Teac
41、hing_System GO SELECT TG.StuId 学号,StuName 姓名,CourseName 课程名称,TotalScore 成绩 FROM Tb_Grade TG INNER JOIN Tb_Student TS ON TG.StuId=TS.StuId INNER JOIN Tb_Course TC ON TG.CourseId=TC.CourseId,2020/1/15,Microsoft SQL Server 2005,65,任务三,USE Teaching_System GO SELECT DeptName 系部名称, COUNT( ClassName) 班级名称 FROM Tb_Dept LEFT OUTER JOIN Tb_Class ON Tb_Class.DeptId=Tb_Dept.DeptId GROUP BY DeptName,查询并统计各系部的班级数,没有班级的系部班级数显示为0。,2020/1/15,Microsoft SQL Server 2005,66,作业,