SELECT TOP(n) FROM _TableName_ ORDER BY _ColumnName_
是一种非标准SQL语句,从数据表中最多检索出排在前面的n条数据来,但是它可以用 SELECT TOP(n) PERCENT FROM _TABLENAME_ ORDER BY
这样的根据总数据量来按比例取得数据记录。
如果数据表中有560条数据,检索 SELECT TOP(1) FROM _TableName_ ORDER BY _ColumnName_
就会检索出6条数据来,总而言之,不是按四舍五入计的,而是按 ceil
向上取整法计数的。
如果不加 ORDER BY
,数据会以不确定的顺序检索出来。
这里括号可有可无,但是建议加括号。
n可以是常数,也可以是定义的变量。下面这种写法也是可以的:
SQL
DECLARE @n AS BIGINT = 5; SELECT TOP (@n) orderid, orderdate, custid, empid FROM Sales.Orders ORDER BY orderdate DESC; GO
如果加了 WITH TIE
,比如说写成
SQL
SELECT TOP (3) WITH TIES orderid, orderdate, custid, empid FROM Sales.Orders ORDER BY orderdate DESC;
则 orderdate
相同的数据会被计作一条数据,总检索出的结果可能不止3条。
OFFSET FETCH
语句是标准SQL语句。但是它有局限性,不能按百分比检索出数据结果。
SQL
SELECT orderid, orderdate, custid, empid FROM Sales.Orders ORDER BY orderdate DESC, orderid DESC OFFSET 50 ROWS FETCH NEXT 25 ROWS ONLY;
表示跳过前50条数据,取得第51到第75条数据。
SQL
SELECT orderid, orderdate, custid, empid FROM Sales.Orders ORDER BY orderdate DESC, orderid DESC OFFSET 0 ROWS FETCH FIRST 25 ROWS ONLY;
表示取得第1到第25条数据。
SQL
SELECT orderid, orderdate, custid, empid FROM Sales.Orders ORDER BY orderdate DESC, orderid DESC OFFSET 50 ROWS;
表示跳过前50条数据,取得之后的全部数据。
OFFSET FETCH
语句必须带有 ORDER BY
语句,但是如果不想指定用于排序的columnName,可以用下面这种这种语法,即用 SELECT NULL
作为排序列:
SQL
SELECT orderid, orderdate, custid, empid FROM Sales.Orders ORDER BY (SELECT NULL) OFFSET 0 ROWS FETCH FIRST 3 ROWS ONLY;
OFFSET FETCH
可用于分页检索,比如说下面这种写法:
SQL
DECLARE @pagesize AS BIGINT = 25, @pagenum AS BIGINT = 3; SELECT orderid, orderdate, custid, empid FROM Sales.Orders ORDER BY orderdate DESC, orderid DESC OFFSET (@pagenum - 1) * @pagesize ROWS FETCH NEXT @pagesize ROWS ONLY;