全国计算机等级考试三级数据库技术(六)

考点分析

◆在考试中-般情况下会出现在选择题、填空题。
◆常考知识点有:
1.掌握TOP限制结果集、CASE函数的语法格式
2.掌握查询结果的并、交、差运算
3.理解相关子查询和其他形式子查询的用法
4.理解其他功能的查询语句,如开窗函数和公共表表达式

6.1 一般数据查询功能扩展

一、SELECT查询语法格式
SELECT语句是SQL语言中功能强大、使用灵活的语句之一, 它能够实现数据的选择、投影和连接运算,并且能够完成筛选字段的重命名、分类汇总、排序和多数据源组合等具体操作。
SELECT语句的一般格式为:

SELECT [ALL|DISTINCT|TOP n]    *|<字段列表>[,<表达式>AS<标识符>]
FROM<表名1>[<表名2>)...
[WHERE <条件表达式>]
[GROUP BY <字段名>[HAVING<条件表达式>]]
[ORDER BY <字段名>[ASC|DESC]

该语句从指定的基本表中,创建一个由指定范围内、满足条件、按某字段分组、 按某字段排序的指定字段你组成的新纪录集。

二、使用TOP限制结果集
1.当使用SELECT语句进行查询时,有时只希望列出结果集中的几行数据,而不是全部數据;可以使用TOP谓词来限制输出的结果。
使用TOP谓词的语法格式为: TOP n [percent] [WITH TIES] 其中,n为非负整数。
参数的含义:
(1)TOP n :取查询结果的前n行数据
(2)TOP n percent :取查询结果的前n%行数据,
(3)WITH TIES :表示包括最后一行取值并列的结果。
注意: TOP谓词写在SELECT单词的后边(如果有DISTINCT的话,则TOP写在DISTINCT的后边)、查询列表的前边。
2.示例
示例

三、使用CASE函数
可以在查询语句中使用CASE函数,以达到分情况显示不同类型的数据的目的。CASE函数是种多分支达式,它计算条件列表并返回多个可能的结果表达式中的一个。CASE函数分两种类型:简单CASE函数、搜索CASE函数
1.简单CASE函数
简单CASE函数的语法格式如下:

CASE测试表达式
WHEN 简单表达式1 THEN 结果表达式1
WHEN 简单表达式2 THEN 结果表达式2
WHEN 简单表达式n THEN 结果表达式n
[ELSE 结果表达式 n+1]
END

2.简单CASE函数的执行过程如下所示。
(1)计算测试表达式。然后按从上到下的顺序对每个WHEN子句的简单表达式进行计算。
(2)如果某个简单表达式的值与测试表达式的值相匹配,则返回与第一个取值为True的WHEN对应的结果表达式的值。
(3)如果所有的简单表达式的值都不与测试表达式的值相匹配,则当指定了ELSE子句时,将返回ELSE子句中指定的结果表达式的值;若没有指定
ELSE子句 。则返回NULL值。

3.搜索CASE函数
搜索CASE函数的语法格式如下:

CASE
WHEN 布尔表达式1 THEN 结果表达式1
WHEN 布尔表达式2 THEN 结果表达式2
WHEN 布尔表达式n THEN 结果表达式n
[ELSE结果表达式 n+1] 
END

搜索CASE函数的各个WHEN子句的布尔表达式可以使用比较运算符,也可以使用逻辑运算符。搜索CASE函数的执行过程同简单CASE函数。

四、将查询结果保存到新表中
1.当使用SELECT语句查询数据时,产生的结果是保存在内存中的。若将查询结果永久保存下来,比如保存在一个表中,可以通过在SELECT语句中使用INTO字句实现。
2.包含INTO子句的语法格式为:

SELECT查询列表序列 INTO <新表名>
FROM数据源
...      ..其他行过滤、分组等子句

注:其中“新表名"是存放查询结果的表名。这个语句将查询的结果保存在“新表名”所指定的表中。
3.此语句包含如下三个功能:
(1)根据查询语句列出的列以及其类型创建一个新表
(2)将查询的结果插入到新表中。
(3)执行查询语句。

01 '考点1 :一般数据查询功能扩展
腾讯来车
4.将查询结果保存到新表中
用INTO子句创建的新表可以是永久表(在执行这个语句时所使用的数据库中被物理的创建,并且是存储在磁盘上的表),也可以是时表(在tempdb数据库中创建此表,其生存期是有限的).

5.临时表又根据其使用范围分为局部临时表和全局临时表,两种表的介绍如下所示。
(1)局部临时表
01.通过在表名前加一个#来标识,比如#T1,表示"#T1"是一个局部临时。
02.局部临时表的生存期与创建此局部临时表的用户的连接生存期相同,它只能在创建此局部临时表的当前连接中使用。
(2)全局临时表
01.通过在表名前加两个“#”来标识,比如:##T1.表示“##T1”是一个
全局临时表。
02.全局临时表的生存期与创建全局临时表的用户的连接生存期相同,并且在生存期内可以被所有的连接使用。

6.示例
示例

6.2 查询结果的并、交、差运算

一、并运算
1.并运算可将两个或多个查询语句的结果集合并为一个结果集,这个运算可以使用UNION运算符实现。
2.UNION是一个特殊的运算符。通过它可以实现让两个或更多的直询产生单一的结果集。而UNION操作与JOIN连接操作不同,如下是他们的不同点
(1)UNION操作
01.UNION更像是将一个查询结果追加到另一个查询结果中
02.UNION是垂直地合并数据(添加更多的行)

(2)JOIN操作
JOIN操作是水平的合并数据(添加更多的列)

3.使用UNION谓词的语法格式为:

SELECT 语句1 UNION [ALL]
SELECT 语句2 UNION [ALL]
...
SELECT 语句n

注:ALL表示在结果集中包含所有查询语句产生的全部记录,包括重复的记录。如果没有指定ALL ,则系统默认是删除合并后结果集中的重复记录

注意
(1)所有要进行UNION操作的查询,其SELECT列表中列的个数必须相同,而且对应列的语义应该相同。
(2)各查询语句中每个列的数据类型必须与其他查询中对应列的数据类型是隐式兼容的,即只要它们能进行隐式转换即可。合并后的结果采用第一个SELECT语句的列标题。
(3)如果要对查询的结果进行排序。则ORDER BY子句应该写在最后一个查询语句之后,且排序的依据列应该是第一个查询语句中出现的列名。

4.示例
示例

二、交运算
1.交运算将返回同时在两个集合中出现的记录,即返回两个查询结果集中各个列的值均相同的记录,并用这些记录构成交运算的结果。
2.实现交运算的SQL运算符为INTERSECT,其语法格式为:

SELECT 语句 1
INTERSECT
SELECT 语句 2
INTERSECT
...
SELECT 语句 n

2.示例
示例

三、差运算
1.差运算将返回在第一个集合中有但第二个集合中没有的数据。实现差运算的SQL运算在EXCEPT.
实现差运算的SQL运算符EXCEPT,其语法格式为:

SELECT 语句 1
EXCEPT
SELECT 语句 2
EXCEPT
SELECT 语句 n

2.示例
示例

6.3 相关子查询

1.如果一个SELECT语句是嵌套在一个SELECT、INSERT、UPDATE或DELETE语句中,则称为子查询或内层查询,包含子查询的语句称为主查询或外层查询。
2.子查询类型
WHERE表达式 [NOT] IN 子查询
WHERE表达式 比较运算符子查询
WHERE表达式 [NOT] EXISTS子查询

注意:子查询一般用在外层查询的WHERE子句或HAVING子句中,与比较运算符或逻辑运算符一起构成查询条件。对于返回结果为单值的子查询语句,可以出现在任何允许使用表达式的地方。

3.使用子查询进行基于集合的测试
使用子查询进行基于集合的测试时,通过运算符IN和NOT IN,将一个表达式的值与子查询返回的结果集进行比较。
其形式为: WHERE表达式 [NOT] IN (子查询).

这种形式的子查询语句分步骤实现,如下所示。
01.先执行子查询
02.在子查询的结果基础执行外层查询
注意:子查询返回的结果实际上就是一个集合,外层查询就是在这个集合上使用IN运算符进行比较。

4.示例
示例

5.使用子查询进行比较测试
通过比较运算符( =、<>、<、>、<=、>=), 将一个表达式的值与子查询返回的单值进行比较。
形式为: WHERE 表达式 比较运算符(子查询)。比较计算结果如下所示。
01.结果为True 比较测试返回True
02.结果为False 比较测试返回False

使用子查询进行的比较测试要求子查询语句必须是返回单值的查询语句。

6.使用子查询进行比较测试
示例

7.使用子查询进行存在性测试
(1)使用子查询进行存在性测试时.通常使用EXISTS谓词,其形式为: WHERE [NOT] EXISTS(子查询)
01.带EXISTS谓词的子查询不返回查询的结果,只产生逻辑真值和逻辑假值。
02.EXISTS含义:当子查询中有满足条件的数据时,EXISTS返回真值,否则返回假值。
03.NOT EXISTS含义
当子查询中有满足条件的数据时,NOT EXISTS返回假值;不存在满足条件的数据时,NOT EXISTS返回真值。
(2)示例
示例

(3)注意
01.带EXISTS谓词的查询是先执行外层查询,然后再执行内层查询。由外层查询的值决定内层查询的结果;内层查询的执行次数由外层查询的结果数决定。
02.由于带EXISTS的子查询只返回真或假值,因此在子查询里不必指定查询列表。所以在有EXISTS的子查询中,子查询中的目标列通常都用“ * ”

6.4 其他形式的子查询

一、替代表达式的子查询
1.替代表达式的子查询是指在SELECT语句的选择列表中嵌入一个只返回一个标量值的SELECT语句,这个查询语句通常都是通过一个聚合函数来返回一个单值。
2.示例
示例

二、派生表
1.派生表(也称内联视图)是将子查询作为一个表来处理,这个由子查询产生的新表就被称为“派生表” ,类似于临时表。
2.派生表的优点:使用派生表可以简化查询,从而避免使用临时表,而且相比手动生成临时表的方法性能更优越。
3.派生表与其他表一样出现在查询语句的FROM子句中。
4.示例
示例

6.5 其他一些查询功能

一、开窗函数
1.在SQL Server中,一组行被称为一个窗口,开窗函数是指可以用于“分区"或“分组"计算的函数。这些函数结合OVER子句对组内的数据进行编号,并进行求和、计算平均值等统计。因此。从这个角度来说SUM. AVG以及
ROW_NUMBER(对数据进行编号的函数)等都可以称为开窗函数。
2.开窗函数可以分别应用于每个分区,把每个分区成是一个窗口,并为每个分区进行计算。开窗函数必须放在OVER子句前边。开窗函数是在ISO SQL标准中定义的。SQL Server提供了两种开窗函数如下所示,
排名开窗函数、聚合开窗函数

3.将OVER子句与聚合函数结合使用
(1)OVER子句用于确定在应用关联的开窗函数之前对行集的分区和排序。
将OVER子句与聚合函数结合使用的语法格式为:
< OVER_CLAUSE> : : =
OVER ([ PARTITION BY value_expression ,…[n])
各参数说明如下:
PARTITION BY:将结果集划分为多个分区。开窗函数分别应用于每个分区,并为每个分区计算函数值。
value_expression: 指定对行集进行分区所依据的列,该列必须是在FROM子句中生成的列,而且不能引用选择列表中的表达式或别名。value_expression可以是列表达式、替代表达式的子直询、标量函数或用户定义的变量。
可以在单个查询中使用多个开窗函数,每个函数的OVER子句在分区和排序上可以不同。

(2) 示例
示例

4.将OVER子句与排名函数一起使用
排名函数为分区中的每行返回一个排名值。根据所用函数的不同,某些行可能与其他行具有相同的排名值。排名函数具有不确定性。SQL Server提供了4个名函数.
(1)RANK
RANK

(2)DENSE_RANK
DENSE_RANK

(3)NTILE
NTILE

(4)ROW_NUMBER
ROW_NUMBER

二、公用表表达式
1.将查询语句产生的结果集指定一个临时命名的名字,这些命名的结果集就称为公用表表达式。命名后的公用表表达式就可在SELECT、INSERT、 UPDATE、DELETE等语句中被多次引用。公用表表达式还包括对自身的引用,这种表达式称为递归公用表表达式。使用公用表表达式有以下四点好处。
01可以定义递归公用表表达式
02 GROUP BY子句可以直接作用在子查询所得的标量列上。
03可以在一个语句中多次引用公用表表达式
04使数据操作代码更加清晰简洁

2.公用表表达式的格式及参数
公用表表达式的格式及参数
示例

猜你喜欢

转载自blog.csdn.net/weixin_47288291/article/details/123519450