第7章 数据的查询 课件(共131张PPT)-《数据库应用技术-SQL Server》同步教学(人民邮电版)

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

第7章 数据的查询 课件(共131张PPT)-《数据库应用技术-SQL Server》同步教学(人民邮电版)

资源简介

(共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 student
Select *
From course
7.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 student
select *
from grade
图7.2 查询显示grade表的内容
2.选择部分字段
在查询表时,很多时候只显示所需要的字段。
这时在Select子句后分别列出各个字段名称就可以。
【例7-2】 查询包含部分字段的记录。
图7.3 显示grade表的部分列
查询前
查询后
SQL语句如下:
use student
select 学号,课程成绩
from grade
7.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 student
select *
from grade
order by 课程成绩
2.多级排序
按照一列进行排序后,如果该列有重复的记录值,则重复记录值这部分就没有进行有效的排序,这就需要再附加一个字段,作为第二次排序的标准,对没有排序的记录进行再排序。
【例7-4】 按照多个字段进行排序。
图7.5 grade表按照多级字段排序
SQL语句如下:
use student
select *
from grade
order 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 student
select *
from grade
where 课程成绩>90
2.范围查询条件
使用范围条件进行查询,是当需要返回某一个数据值是否位于两个给定值之间,通常使用BETWEEN…AND和NOT…BETWEEN…AND来指定范围条件。
使用BETWEEN…AND查询条件时,指定的第1个值必须小于第2个值。
因为BETWEEN…AND实质是查询条件“大于等于第1个值,并且小于等于第2个值”的简写形式。
即BETWEEN…AND要包括两端的值,等价于比较运算符(>=…<=)。
图7.8 显示grade表中年龄在20~21岁之间的学生信息
SQL语句如下:
use student
select *
from student
where 年龄 between 20 and 21
【例7-8】 使用NOT…BETWEEN…AND语句进行范围查询。
图7.9 显示grade表中年龄不在20~21岁之间的学生信息
SQL语句如下:
use student
select *
from student
where 年龄 not between 20 and 21
3.列表查询条件
当测试一个数据值是否匹配一组目标值中的一个时,通常使用IN关键字来指定列表搜索条件。
IN关键字的格式是IN(目标值1,目标值2,目标值3,…),目标值的项目之间必须使用逗号分隔,并且括在括号中。
【例7-9】 使用IN关键字进行列表查询。
图7.10 查询“课程编号”是k01,k03,k04的课程信息
SQL语句如下:
use student
select *
from course
where 课程代号in ('k01','k03', 'k04')
【例7-10】 使用NOT IN关键字进行列表查询。
图7.11 查询“课程编号”不是k01,k03,k04的课程信息
SQL语句如下:
Use student
select *
from course
where 课程代号 not in ('k01','k03', 'k04')
4.模糊LIKE查询
有时用户对查询数据表中的数据了解的不全面,如不能确定所要查询人的姓名只知道他姓李、查询某个人的联系方式只知道是以“3451”结尾等,这时需要使用LIKE进行模糊查询。
LIKE关键字需要使用通配符在字符串内查找指定的模式,所以读者需要了解通配符及其含义。
通配符的含义如表7.4所示。
(1)“%”通配符
【例7-11】 使用%通配符进行模糊查询。
图7.12 student表中查询姓李的同学信息
SQL语句如下:
use student
select *
from student
where 姓名 like '李%'
(2)“_”通配符
【例7-12】 使用“_”通配符进行模糊查询。
图7.13 在student表中查询姓“刘”
并且名字是两个字的学生信息
SQL语句如下:
use student
select *
from student
where 姓名 like '刘_'
(3)“[ ]”通配符
【例7-13】 使用“[ ]”通配符进行模糊查询。
图7.14 在student表中查询联系方式以“3451”结尾的学生
SQL语句如下:
use student
select *
from student
where 联系方式 like '[1-5]3451'
(4)“[^]”通配符
【例7-14】 使用“[^]”通配符进行模糊查询。
图7.15 在student表中查询联系方式
以“3451”结尾但不以2开头的学生信息
SQL语句如下:
use student
select *
from student
where 联系方式 like '[^2]3451'
6.复合查询条件
很多情况下,在where子句中仅仅使用一个条件不能准确地从表中检索到需要的数据,这里就需要逻辑运算符AND、OR和NOT。
使用逻辑运算符时,遵循的指导原则如下:
(1)使用AND返回满足所有条件的行;
(2)使用OR返回满足任一条件的行;
(3)使用NOT返回不满足表达式的行。
【例7-15】 使用AND和OR结合进行查询。
图7.16 复合搜索
SQL语句如下:
use student
select *
from student
where 年龄> 21 and 性别='女' or 年龄>=19 and 性别='男'
7.2.5 消除重复记录
DISTINCT关键字主要用来从SELECT语句的结果集中去掉重复的记录。
如果用户没有指定DISTINCT关键字,那么系统将返回所有符合条件的记录组成结果集,其中包括重复的记录。
【例7-16】 使用DISTINCT关键字消除重复记录。
图7.17 显示course表中的课程类别
SQL语句如下:
use student
select distinct 课程类别
from course
7.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 student
select 性别
from student
group by 性别
2.按多列分组
GROUP BY子句可以基于指定多列的值将数据集合划分为多个分组。
【例7-18】 使用GROUP BY子句按多列分组。
图7.19 student表按多列分组
SQL语句如下:
use student
select 性别,年龄
from student
group by 性别,年龄
7.3.3 使用HAVING子句
分组之前的条件要用where关键字,而分组之后的条件要使用关键字having子句。
【例7-19】 使用HAVING子句分组查询。
图7.20 student表用having筛选结果
SQL语句如下:
use student
select avg(年龄), 性别
from student
group by 性别
having avg(年龄)>20
7.4 基于多表的连接查询
7.4.1 连接谓词
JOIN是一种将两个表连接在一起的连接谓词。
连接条件可在FROM或WHERE子句中指定,建议在FROM子句中指定连接条件。
7.4.2 以JOIN关键字指定的连接
使用JOIN关键字可以进行交叉连接、内连接和外连接。
1.交叉连接
交叉连接是两个表的笛卡儿积的另一个名称。
笛卡儿积就是两个表的交叉乘积,即两个表的记录进行交叉组合,如图7.21所示。
图7.21 两个表的笛卡儿积示意图
交叉连接的语法如下:
SELECT fieldlist
FROM table1
cross JOIN table2
2.内连接
内连接也叫连接,是最早的一种连接,还被称为普通连接或自然连接。
内连接是从结果中删除其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。
内连接的语法如下:
SELECT fieldlist
FROM table1 [INNER] JOIN table2
ON table1.column=table2.column
3.外连接
外连接则扩充了内连接的功能,会把内连接中删除原表中的一些保留下来,由于保留下来的行不同,把外连接分为左外连接、右外连接和全外连接3种连接。
(1)左外连接
左外连接的语法如下:
use student
SELECT fieldlist
FROM table1 left JOIN table2
ON table1.column= table2.column
【例7-20】 使用LEFT JOIN…ON关键字进行左外连接。
图7.22 student表和grade表左外连接
SQL语句如下:
use student
select *
from student
left join grade
on student.学号=grade.学号
(2)右外连接
右外连接的语法如下:
use student
SELECT fieldlist
FROM table1 right JOIN table2
ON table1.column=table2.column
【例7-21】 使用RIGHT JOIN…ON关键字进行右外连接。
图7.23 grade表和course表右外连接
SQL语句如下:
use student
select *
from grade
right join course
on course.课程代号=grade.课程代号
(3)全外连接
全外连接的语法如下:
use student
SELECT fieldlist
FROM table1 full JOIN table2
ON table1.column=table2.column
【例7-22】 使用JOIN关键字进行全外连接。
图7.24 course表和grade表全外连接
SQL语句如下:
use student
select * from
grade full
join course
on course.课程代号=grade.课程代号
7.5 子 查 询
7.5.1 使用IN或NOT IN的子查询
(1)使用IN的子查询。
带in的嵌套查询语法格式如下:
WHERE 查询表达式 IN(子查询)
【例7-23】 使用IN关键字进行子查询。
图7.25 显示参加考试的同学信息
SQL语句如下:
use student
select *
from student
where 学号 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 student
select *
from course
where 课程代号 not in
(select 课程代号 from grade )
图7.28 查询没有学生参加考试的课程信息
7.5.2 使用比较运算符的子查询
嵌套内层子查询通常作为搜索条件的一部分呈现在WHERE或HAVING子句中。
例如,把一个表达式的值和由子查询生成的值相比较。
这个测试类似于简单比较测试。
子查询比较测试用到的运算符是:=、<>、<、>、<=、>=。
子查询比较测试把一个表达式的值和由子查询产生值进行比较,这时子查询只能返回一个值,否则错误。
最后返回比较结果为TRUE的记录。
【例7-25】 使用比较运算符进行子查询。
图7.29 显示成绩大于98分的学生信息
SQL语句如下:
use student
select *
from student
where 学号 = ( select 学号 from grade where 课程成绩>98 )
7.5.3 使用EXISTS的子查询
exists谓词只注重子查询是否返回行。
如果子查询返回一个或多个行,谓词评价为真,否则为假。
exists搜索条件并不真正地使用子查询的结果,它仅仅测试子查询是否产生任何结果。
【例7-26】 使用EXISTS进行子查询。
图7.30 查询参加考试的学生信息
SQL语句如下:
use student
select *
from student
where exists
(select 学号 from grade where student.学号=grade.学号 )
【例7-27】 使用NOT EXISTS进行子查询。
SQL语句如下:
use student
select *
from student
where 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 student
select 学号,姓名 ,性别 from student where 年龄<22
union all
select 学号,姓名,性别 from student where 性别='男'
小  结
本章介绍了如何在SQL Server 2016中编写、测试和执行SQL语句,对数据表记录的各种查询。
读者应熟练掌握选择查询、分组查询、子查询,能根据实际的要求编写SQL查询语句。

展开更多......

收起↑

资源预览