SQL Sever 基础知识 - 三、限制行数
- 三、限制行数
- 第1节 OFFSET FETCH - 限制查询返回的行数
- 1.1 OFFSET 和 FETCH 子句
- 1.2 SQL Server OFFSET 和 FETCH 示例
- 第2节 SELECT TOP - 限制查询结果集中返回的行数或行的百分比
- 2.1 SELECT TOP 子句
- 2.2 PERCENT
- 2.3 WITH TIES
- 2.4 SELECT TOP 示例
- 2.4.1 使用带有常量值的 TOP
- 2.4.2 使用 TOP 返回行的百分比
- 2.4.3 使用 TOP WITH TIES 包含与最后一行中的值匹配的行
更多SQL Sever基础知识可查看:SQL Sever 基础知识(全)
特别说明:
本文章所用的所有数据库、数据表及其数据皆为AI随机生成,不涉及个人隐私,且仅供学习使用!
三、限制行数
第1节 OFFSET FETCH - 限制查询返回的行数
SQL Server中使用 OFFSET FETCH 子句来限制查询返回的行数。
1.1 OFFSET 和 FETCH 子句
OFFSET
和 FETCH
子句是 ORDER BY
子句的选项。它们允许限制查询返回的行数。
以下说明 OFFSET 和 FETCH 子句的语法:
ORDER BY column_list [ASC |DESC]
OFFSET offset_row_count {ROW | ROWS}
FETCH {FIRST | NEXT} fetch_row_count {ROW | ROWS} ONLY
在此语法中:
① OFFSET
子句指定在开始从查询返回行之前要跳过的行数。 offset_row_count
可以是大于或等于零的常量、变量或参数。
② FETCH
子句指定在处理了 OFFSET
子句之后要返回的行数。 offset_row_count
可以是大于或等于1的常量、变量或标量。
③ OFFSET
子句是强制性的,而 FETCH
子句是可选的。此外, FIRST
和 NEXT
是同义词,因此可以互换使用。
下图说明了 OFFSET
和 FETCH
子句:
Note:
① 必须将 OFFSET
和 FETCH
子句与 ORDER BY
子句一起使用,否则会报错。
② 与 TOP
子句相比, OFFSET 和 FETCH
子句更适合实现查询分页解决方案。
1.2 SQL Server OFFSET 和 FETCH 示例
新建一个CustomerInfo数据表作为学习案例。
CREATE TABLE CustomerInfo (CusID INT IDENTITY(10001,1) PRIMARY KEY,CusName VARCHAR(50) NOT NULL,Gender VARCHAR(10),Age INT,Phone VARCHAR(20),Province VARCHAR(50),City VARCHAR(50),Status VARCHAR(20)
);
查询返回 CustomerInfo 表中的所有客户的CusName,Gender,Age,Status,并对Age进行排序:
select CusName,Gender,Age,Statusfrom CustomerInfoorder by Age,CusName;
执行结果:
要跳过前10个客人信息并返回其余客人,使用 OFFSET
子句:
select CusName,Gender,Age,Statusfrom CustomerInfoorder by Age,CusNameoffset 10 rows;
执行结果:
对比前结果,可发现数据集跳过前10行。
要跳过前10个客人信息并返回接下来的10个客人,可同时使用 OFFSET
和 FETCH
子句,如下所示:
select CusName,Gender,Age,Statusfrom CustomerInfoorder by Age,CusNameoffset 10 rows fetch first 10 rows only;
执行结果:
对比前结果,可发现数据集跳过前10行后取到接着的10行数据即结果集的11-20行数据。
如果只取前10个客人信息并可同时使用 OFFSET
和 FETCH
子句,如下所示:
select CusName,Gender,Age,Statusfrom CustomerInfoorder by Age,CusNameoffset 0 rows fetch first 10 rows only;
执行结果:
跳过0行,取接后的10行就为前10行,对比前面数据集发现取数据成功!
第2节 SELECT TOP - 限制查询结果集中返回的行数或行的百分比
使用SQL Server SELECT TOP 语句来限制查询返回的行。
2.1 SELECT TOP 子句
因为存储在表中的行的顺序是未指定的,所以 SELECT TOP 语句总是与 ORDER BY 子句一起使用。因此,结果集仅限于第 N 个有序行。
SELECT 语句的 TOP 子句的语法:
select top (expression) [PERCENT][WITH TIES]
from [表名]
ORDER BY <列名>
在此语法中, SELECT 语句可以有其他子句,如 WHERE 、 JOIN 、 HAVING 和 GROUP BY 。
TOP 关键字后面是一个表达式,它指定要返回的行数。如果使用 PERCENT ,表达式将被计算为浮点值,否则,它将被转换为 BIGINT 值。
2.2 PERCENT
PERCENT
关键字表示查询返回前 N 百分比的行,其中 N 是 expression 的结果。
2.3 WITH TIES
WITH TIES
允许您返回更多行,其值与有限结果集中的最后一行匹配。请注意, WITH TIES 可能会导致返回的行数比您在表达式中指定的要多。
【举个栗子】如果想查询年度总成绩第一的学生评优,可以使用 TOP 1查询 。但是,如果有多个同分数的学生,top 1 只会返回一个学生信息。为了避免这种情况,需要使用 TOP 1 WITH TIES,可返回同分数的所有学生信息。
实例:取客户信息表中年龄最大的用户信息(TOP 1 )
select top 1 *from CustomerInfoorder by Age desc
执行结果:
CusID CusName Gender Age Phone Province City Status
10006 张建国 Male 33 15036987451 广西省 南宁市 派送中
取客户信息表中年龄最大的用户信息(TOP 1 WITH TIES)
select top 1 with ties *from CustomerInfoorder by Age desc
执行结果
CusID CusName Gender Age Phone Province City Status
10006 张建国 Male 33 15036987451 广西省 南宁市 派送中
10022 王秀华 Female 33 17625369226 广东省 深圳市 在途中
10039 王宇宇 Male 33 17625369233 广西省 南宁市 派送中
10045 王海洋 Male 33 17625369230 广东省 广州市 在途中
10057 李佳佳 Female 33 19851362471 浙江省 宁波市 已签收
10070 王建华 Male 33 17625369234 广东省 深圳市 在途中
2.4 SELECT TOP 示例
2.4.1 使用带有常量值的 TOP
查询前十个年龄中最大的用户信息:
select top 10 *from CustomerInfoorder by Age desc
2.4.2 使用 TOP 返回行的百分比
查询前(占总数据的10%的数)个年龄中最大的用户信息:
select top 10 PERCENT *from CustomerInfoorder by Age desc
使用 PERCENT
指定结果集中返回百分比个数,CustomerInfo表中共有78行数据,78的百分之十是一个小数值( 7.8 ),SQL Server将其四舍五入到下一个整数,在这种情况下是8,即返回数据的前8行。
执行结果:
2.4.3 使用 TOP WITH TIES 包含与最后一行中的值匹配的行
查询年龄排前十的客户信息:
select top 10 with ties *from CustomerInfoorder by Age desc
执行结果:
在此示例中,第10名年龄为32,因为语句使用了 TOP WITH TIES
语句 ,所以它返回了另外6个年龄相同的顾客。