资源简介 (共131张PPT)第7章 数据的查询本章主要介绍针对数据表记录的各种查询以及对记录的操作,主要包括选择查询、数据汇总、基于多表的连接查询以及子查询。通过本章的学习,读者可以应用各种查询对数据表中的记录进行访问。7.1 创建查询和测试查询7.2 选择查询7.3 数据汇总7.4 基于多表的连接查询7.5 子查询7.1 创建查询和测试查询7.1.1 编写SQL语句在SQL Server 2016中,用户可以在Microsoft SQL Server Management Studio中编写SQL语句操作数据库。(1)单击“开始”“Microsoft SQL Server 2016”/“SQL Server Management Studio”命令,打开SQL Server Management Studio窗口。(2)使用“Windows身份验证”建立连接。(3)单击“标准”工具栏上的“新建查询”按钮。(4)输入如下SQL语句:Use studentSelect *From course7.1.2 测试SQL语句在新建的查询窗口中输入SQL语句之后,为了查看语句是否有语法错误,需要对SQL语句进行测试。单击工具栏中的 按钮或直接按+组合键可以对当前的SQL语句进行测试,如果SQL语句准确无误,在代码区下方会显示“命令已成功完成”,否则显示错误信息提示。7.1.3 执行SQL语句最后要执行SQL语句才能实现各种操作。单击工具栏上的 按钮或直接按键可以执行SQL语句。上面输入的SQL语句的执行结果如图7.1所示。图7.1 显示Course表的所有记录7.2 选 择 查 询7.2.1 简单的SELECT查询SELECT语句是从数据库中检索数据并查询,并将查询结果以表格的形式返回。SELECT语句的基本语法如下:SELECT select_list[ INTO new_table ]FROM table_source[ WHERE search_condition ][ GROUP BY group_by_expression ][ HAVING search_condition ][ ORDER BY order_expression [ASC| DESC ]]1.选择所有字段Select语句后的第一个子句,即Select关键字开头的子句,用于选择进行显示的列。如果要显示数据表中所有列的值时,Select子句后用星号(*)表示。【例7-1】 查询包含所有字段的记录。在Student数据库中,查询grade表的所有记录,查询结果如图7.2所示。SQL语句如下:use studentselect *from grade图7.2 查询显示grade表的内容2.选择部分字段在查询表时,很多时候只显示所需要的字段。这时在Select子句后分别列出各个字段名称就可以。【例7-2】 查询包含部分字段的记录。图7.3 显示grade表的部分列查询前查询后SQL语句如下:use studentselect 学号,课程成绩from grade7.2.2 重新对列排序对于表格比较小,不用ORDER BY子句,查询结果会按照在表格中的顺序排列的。但对于表格比较大的,则必须使用ORDER BY子句,方便查看查询结果。ORDER BY子句由关键字ORDER BY后跟一个用逗号分开的排序列表组成,语法如下:[ ORDER BY { order_by_expression [ ASC | DESC ] } [ ,...n ] ]1.单级排序排序的关键字是order by,默认状态下是升序,关键字是asc。可以按照某一个字段排序,排序的字段是数值型,也可以是字符型、日期和时间型。【例7-3】 按照某一个字段进行排序。图7.4 grade表按照“课程成绩”升序排序SQL语句如下:use studentselect *from gradeorder by 课程成绩2.多级排序按照一列进行排序后,如果该列有重复的记录值,则重复记录值这部分就没有进行有效的排序,这就需要再附加一个字段,作为第二次排序的标准,对没有排序的记录进行再排序。【例7-4】 按照多个字段进行排序。图7.5 grade表按照多级字段排序SQL语句如下:use studentselect *from gradeorder by 学期 desc, 课程成绩7.2.3 使用运算符或函数进行列计算某些查询要求在字段上带表达式进行查询,关于表达式中运算符和函数部分请参考Transact-SQL语法部分。带表达式的查询语法如下:SELECT 表达式1,表达式2,字段1,字段2,...from 数据表名【例7-5】 使用运算符进行列计算。图7.6 表达式查询7.2.4 利用WHERE参数过滤数据WHERE子句是用来选取需要检索的记录。因为一个表通常会有数千条记录,在查询结果中,用户仅需其中的一部分记录,这时需要使用WHERE子句指定一系列的查询条件。WHERE子句简单的语法如下:SELECT<字段列表>FROM<表名>WHERE<条件表达式>(1)比较运算符(如=、<>、<和>)。(2)范围说明(BETWEEN和NOT BETWEEN)。(3)可选值列表(IN和NOT IN)。(4)模式匹配(LIKE和NOT LIKE)。(5)上述条件的逻辑组合(AND、OR、NOT)。1.比较查询条件比较查询条件由比较运算符连接表达式组成,系统将根据该查询条件的真假来决定某一条记录是否满足该查询条件,只有满足该查询条件的记录才会出现在最终的结果集中。SQL Server比较运算符如表7.3所示。【例7-6】 使用运算符进行比较查询。图7.7 查询grade表中课程成绩大于90分的信息SQL语句如下:use studentselect *from gradewhere 课程成绩>902.范围查询条件使用范围条件进行查询,是当需要返回某一个数据值是否位于两个给定值之间,通常使用BETWEEN…AND和NOT…BETWEEN…AND来指定范围条件。使用BETWEEN…AND查询条件时,指定的第1个值必须小于第2个值。因为BETWEEN…AND实质是查询条件“大于等于第1个值,并且小于等于第2个值”的简写形式。即BETWEEN…AND要包括两端的值,等价于比较运算符(>=…<=)。图7.8 显示grade表中年龄在20~21岁之间的学生信息SQL语句如下:use studentselect *from studentwhere 年龄 between 20 and 21【例7-8】 使用NOT…BETWEEN…AND语句进行范围查询。图7.9 显示grade表中年龄不在20~21岁之间的学生信息SQL语句如下:use studentselect *from studentwhere 年龄 not between 20 and 213.列表查询条件当测试一个数据值是否匹配一组目标值中的一个时,通常使用IN关键字来指定列表搜索条件。IN关键字的格式是IN(目标值1,目标值2,目标值3,…),目标值的项目之间必须使用逗号分隔,并且括在括号中。【例7-9】 使用IN关键字进行列表查询。图7.10 查询“课程编号”是k01,k03,k04的课程信息SQL语句如下:use studentselect *from coursewhere 课程代号in ('k01','k03', 'k04')【例7-10】 使用NOT IN关键字进行列表查询。图7.11 查询“课程编号”不是k01,k03,k04的课程信息SQL语句如下:Use studentselect *from coursewhere 课程代号 not in ('k01','k03', 'k04')4.模糊LIKE查询有时用户对查询数据表中的数据了解的不全面,如不能确定所要查询人的姓名只知道他姓李、查询某个人的联系方式只知道是以“3451”结尾等,这时需要使用LIKE进行模糊查询。LIKE关键字需要使用通配符在字符串内查找指定的模式,所以读者需要了解通配符及其含义。通配符的含义如表7.4所示。(1)“%”通配符【例7-11】 使用%通配符进行模糊查询。图7.12 student表中查询姓李的同学信息SQL语句如下:use studentselect *from studentwhere 姓名 like '李%'(2)“_”通配符【例7-12】 使用“_”通配符进行模糊查询。图7.13 在student表中查询姓“刘”并且名字是两个字的学生信息SQL语句如下:use studentselect *from studentwhere 姓名 like '刘_'(3)“[ ]”通配符【例7-13】 使用“[ ]”通配符进行模糊查询。图7.14 在student表中查询联系方式以“3451”结尾的学生SQL语句如下:use studentselect *from studentwhere 联系方式 like '[1-5]3451'(4)“[^]”通配符【例7-14】 使用“[^]”通配符进行模糊查询。图7.15 在student表中查询联系方式以“3451”结尾但不以2开头的学生信息SQL语句如下:use studentselect *from studentwhere 联系方式 like '[^2]3451'6.复合查询条件很多情况下,在where子句中仅仅使用一个条件不能准确地从表中检索到需要的数据,这里就需要逻辑运算符AND、OR和NOT。使用逻辑运算符时,遵循的指导原则如下:(1)使用AND返回满足所有条件的行;(2)使用OR返回满足任一条件的行;(3)使用NOT返回不满足表达式的行。【例7-15】 使用AND和OR结合进行查询。图7.16 复合搜索SQL语句如下:use studentselect *from studentwhere 年龄> 21 and 性别='女' or 年龄>=19 and 性别='男'7.2.5 消除重复记录DISTINCT关键字主要用来从SELECT语句的结果集中去掉重复的记录。如果用户没有指定DISTINCT关键字,那么系统将返回所有符合条件的记录组成结果集,其中包括重复的记录。【例7-16】 使用DISTINCT关键字消除重复记录。图7.17 显示course表中的课程类别SQL语句如下:use studentselect distinct 课程类别from course7.3 数 据 汇 总7.3.1 使用聚合函数SQL提供一组聚合函数,它们能够对整个数据集合进行计算,将一组原始数据转换为有用的的信息,以便用户使用。例如求成绩表中的总成绩、学生表中平均年龄等。7.3.2 使用GROUP BY子句(1)在SELECT子句的字段列表中,除了聚集函数外,其他所出现的字段一定要在GROUP BY子句中有定义才行。(2)SELECT子句的字段列表中不一定要有聚集函数,但至少要用到GROUP BY子句列表中的一个项目。(3)在SQL Server中text、ntext和image数据类型的字段不能作为GROUP BY子句的分组依据。(4)GROUP BY子句不能使用字段别名。1.按单列分组GROUP BY子句可以基于指定某一列的值将数据集合划分为多个分组,同一组内所有记录在分组属性上具有相同值。【例7-17】 使用GROUP BY子句按单列分组。图7.18 student表按照性别分组SQL语句如下:use studentselect 性别from studentgroup by 性别2.按多列分组GROUP BY子句可以基于指定多列的值将数据集合划分为多个分组。【例7-18】 使用GROUP BY子句按多列分组。图7.19 student表按多列分组SQL语句如下:use studentselect 性别,年龄from studentgroup by 性别,年龄7.3.3 使用HAVING子句分组之前的条件要用where关键字,而分组之后的条件要使用关键字having子句。【例7-19】 使用HAVING子句分组查询。图7.20 student表用having筛选结果SQL语句如下:use studentselect avg(年龄), 性别from studentgroup by 性别having avg(年龄)>207.4 基于多表的连接查询7.4.1 连接谓词JOIN是一种将两个表连接在一起的连接谓词。连接条件可在FROM或WHERE子句中指定,建议在FROM子句中指定连接条件。7.4.2 以JOIN关键字指定的连接使用JOIN关键字可以进行交叉连接、内连接和外连接。1.交叉连接交叉连接是两个表的笛卡儿积的另一个名称。笛卡儿积就是两个表的交叉乘积,即两个表的记录进行交叉组合,如图7.21所示。图7.21 两个表的笛卡儿积示意图交叉连接的语法如下:SELECT fieldlistFROM table1cross JOIN table22.内连接内连接也叫连接,是最早的一种连接,还被称为普通连接或自然连接。内连接是从结果中删除其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。内连接的语法如下:SELECT fieldlistFROM table1 [INNER] JOIN table2ON table1.column=table2.column3.外连接外连接则扩充了内连接的功能,会把内连接中删除原表中的一些保留下来,由于保留下来的行不同,把外连接分为左外连接、右外连接和全外连接3种连接。(1)左外连接左外连接的语法如下:use studentSELECT fieldlistFROM table1 left JOIN table2ON table1.column= table2.column【例7-20】 使用LEFT JOIN…ON关键字进行左外连接。图7.22 student表和grade表左外连接SQL语句如下:use studentselect *from studentleft join gradeon student.学号=grade.学号(2)右外连接右外连接的语法如下:use studentSELECT fieldlistFROM table1 right JOIN table2ON table1.column=table2.column【例7-21】 使用RIGHT JOIN…ON关键字进行右外连接。图7.23 grade表和course表右外连接SQL语句如下:use studentselect *from graderight join courseon course.课程代号=grade.课程代号(3)全外连接全外连接的语法如下:use studentSELECT fieldlistFROM table1 full JOIN table2ON table1.column=table2.column【例7-22】 使用JOIN关键字进行全外连接。图7.24 course表和grade表全外连接SQL语句如下:use studentselect * fromgrade fulljoin courseon course.课程代号=grade.课程代号7.5 子 查 询7.5.1 使用IN或NOT IN的子查询(1)使用IN的子查询。带in的嵌套查询语法格式如下:WHERE 查询表达式 IN(子查询)【例7-23】 使用IN关键字进行子查询。图7.25 显示参加考试的同学信息SQL语句如下:use studentselect *from studentwhere 学号 in (select 学号 from grade )图7.26 子查询的结果(2)使用NOT IN的子查询not in 和 in查询过程类似。not in的嵌套查询语法格式如下:WHERE 查询表达式 NOT IN(子查询)【例7-24】 使用NOT IN进行子查询。图7.27 查询学生参加考试的课程信息SQL语句如下:use studentselect *from coursewhere 课程代号 not in(select 课程代号 from grade )图7.28 查询没有学生参加考试的课程信息7.5.2 使用比较运算符的子查询嵌套内层子查询通常作为搜索条件的一部分呈现在WHERE或HAVING子句中。例如,把一个表达式的值和由子查询生成的值相比较。这个测试类似于简单比较测试。子查询比较测试用到的运算符是:=、<>、<、>、<=、>=。子查询比较测试把一个表达式的值和由子查询产生值进行比较,这时子查询只能返回一个值,否则错误。最后返回比较结果为TRUE的记录。【例7-25】 使用比较运算符进行子查询。图7.29 显示成绩大于98分的学生信息SQL语句如下:use studentselect *from studentwhere 学号 = ( select 学号 from grade where 课程成绩>98 )7.5.3 使用EXISTS的子查询exists谓词只注重子查询是否返回行。如果子查询返回一个或多个行,谓词评价为真,否则为假。exists搜索条件并不真正地使用子查询的结果,它仅仅测试子查询是否产生任何结果。【例7-26】 使用EXISTS进行子查询。图7.30 查询参加考试的学生信息SQL语句如下:use studentselect *from studentwhere exists(select 学号 from grade where student.学号=grade.学号 )【例7-27】 使用NOT EXISTS进行子查询。SQL语句如下:use studentselect *from studentwhere not exists(select * from grade where student.学号=grade.学号 )图7.31 查询没参加考试的学生信息7.5.4 使用UNION运算符组合多个结果表的合并操作是指将两个表的行合并到了单个表中,且不需要对这些行作任何更改。在构造合并查询时必须遵循以下几条规则。(1)所有查询中的列数和列的顺序必须相同。(2)数据类型必须兼容。(3)作为对所有select语句的合并操作结果进行排序的order by子句,必须放到最后一个select后面,但它所使用的排序列名必须是第1个select选择列表中的列名。【例7-28】 使用UNION运算符合并查询结果。图7.32 两个表的简单合并查询SQL语句如下:use studentselect 学号,姓名 ,性别 from student where 年龄<22union allselect 学号,姓名,性别 from student where 性别='男'小 结本章介绍了如何在SQL Server 2016中编写、测试和执行SQL语句,对数据表记录的各种查询。读者应熟练掌握选择查询、分组查询、子查询,能根据实际的要求编写SQL查询语句。 展开更多...... 收起↑ 资源预览