6.1 一般数据查询功能扩展
考点1 使用TOP限制结果集
(1)适用情况
当使用SELECT语句进行查询时,有时只希望列出结果集中的前几行数据,而不是全部数据,这时就可以使用TOP谓词来限制输出的结果。
(2)语法格式
TOP n [percent] [WITH TIES]
其中,n为非负整数。
①TOP n:取查询结果的前n行数据;
②TOP n percent:取查询结果的前n%行数据;
③WITH TIES:表示包括最后一行取值并列的结果。
TOP谓词写在SELECT单词的后边(如果有DISTINCT的话,则TOP写在DISTINCT的后边)、查询列表的前边。
注意:在使用TOP谓词时,应该与ORDER BY子句一起使用,这样的前几名才有意义。当使用WITH TIES选项时,则要求必须使用ORDER BY子句。
目前MySQL并不支持top n的语法,limit n 需要的更加的频繁
考点2 使用CASE函数
(1)适用情况
可以在查询语句中使用CASE函数,以达到分情况显示不同类型的数据的目的。CASE函数是一种多分支表达式,它计算条件列表并返回多个可能的结果表达式中的一个。
(2)类型
简单CASE函数和搜索CASE函数。
(3)简单CASE函数
①语法格式
CASE测试表达式 WHEN简单表达式1 THEN结果表达式1 WHEN简单表达式2 THEN结果表达式2 … WHEN简单表达式n THEN结果表达式n [EISE结果表达式n+1] END
②执行过程
a.计算测试表达式,然后按从上到下的顺序对每个WHEN子句的简单表达式进行计算。
b.如果某个简单表达式的值与测试表达式的值相匹配,则返回与第一个取值为True的WHEN对应的结果表达式的值。
c.如果所有的简单表达式的值都不与测试表达式的值相匹配,则当指定了ELSE子句时,将返回ELSE子句中指定的结果表达式的值;若没有指定ELSE子句,则返回NULL值。
(4)搜索CASE函数
①语法格式
搜索CASE函数的各个WHEN子句的布尔表达式可以使用比较运算符,也可以使用逻辑运算符。
②执行过程
搜索CASE函数的执行过程同简单CASE函数。
③例题
【例1】查询每种商品的销售次数,如果销售次数超过10次,则显示“热门商品”,如果销售次数在5~10次之间,则显示“一般商品”,如果销售次数低于5次,则显示“难销商品”,如果商品没有被销售过,则显示“滞销商品”。
分析:由于要查询的是全部商品的销售情况,包括有销售记录的和没有销售记录的,因此,应该用外连接实现。另外,在统计每种商品的销售次数时,应该使用COUNT(列名)函数,不能使用COUNT(*)函数,而且应该对外连接后的销售记录表中的商品编号列进行统计。
【真题演练】
设SC表中记录成绩的列为:Grade,类型为int。若在查询成绩时,希望将成绩按“优”、“良”、“中”、“及格”和“不及格”形式显示,正确的Case函数是( )。
A.
B.
C.
D.
【答案】C
考点3 将查询结果保存到新表中
(1)适用情况
当使用SELECT语句查询数据时,产生的结果是保存在内存中的。如果希望将查询结果永久保存下来,比如保存在一个表中,则可以通过在SELECT语句中使用INTO子句实现。
(2)INTO子句的语法格式
SELECT查询列表序列 INTO<新表名>
FROM数据源
… - -其他行过滤、分组等子句
其中“新表名”是要存放查询结果的表名。这个语句将查询的结果保存在“新表名”所指定的表中。实际上这个语句包含如下三个功能:
①根据查询语句列出的列以及其类型创建一个新表;
②执行查询语句;
③将查询的结果插入到新表中。
(3)INTO语句创建新表的分类
用INTO子句创建的新表可以是永久表(在执行这个语句时所使用的数据库中被物理的创建,并且是存储在磁盘上的表),也可以是临时表(在tempdb数据库中创建此表,其生存期是有限的)。临时表又根据其使用范围分为局部临时表和全局临时表两种。
①局部临时表
局部临时表通过在表名前加一个“#”来标识,比如:#T1,表示“#T1”是一个局部临时表。局部临时表的生存期与创建此局部临时表的用户的连接生存期相同,它只能在创建此局部临时表的当前连接中使用。
②全局临时表
全局临时表通过在表名前加两个“#”来标识,比如:##T1,表示“##T1”是一个全局临时表。全局临时表的生存期与创建全局临时表的用户的连接生存期相同,并且在生存期内可以被所有的连接使用。
可以对局部临时表和全局临时表中的数据进行查询,其方法同永久表一样。