SQL查询语句中的limit是什么意思?

5

我有一个在SQL Server中的表:

ID   | videoid  | title
=========================
1    | id1      | title1
2    | id2      | title2
3    | id3      | title3

我希望您能创建一个选择方法,该方法可以在标题行中进行搜索:
SELECT * FROM [movie].[dbo].[movies] 
WHERE title like '%' + '%s' + '%'

我正在寻找类似于MySQL中的Limit的功能,从SELECT结果中,我将能够获取0-20,21-40,41-60的结果。

有关此查询的任何帮助?

我尝试使用LIMIT 0,10,但出现了以下错误:

Could not find stored procedure 'LIMIT'.

还有,我想你多打了一个“%”。 - 500 - Internal Server Error
1
可能是SQL Server分页查询的重复问题。 - SQLMason
@MTA,你是要每次返回20个结果还是想根据分页返回结果,比如第一次调用返回0-20,第二次返回20-40 - Habib
@Habib 是的,这就是我想要实现的。 - YosiFZ
@MTA,是的,您需要分页还是只需要20条记录? - Habib
显示剩余2条评论
6个回答

6

在SQL SERVER中,您需要使用TOP N语句。

SELECT TOP 10 * FROM [movie].[dbo].[movies] 
WHERE title like '%' + '%s' + '%'
ORDER BY SomeColumn -- Specify your column for ordering

查看:TOP (Transact-SQL)

在 SQL Server 中将查询结果集中返回的行数限制为指定数量的行或百分比的行

还可以查看文档中的最佳实践

在 SELECT 语句中,始终使用带有 TOP 子句的 ORDER BY 子句。这是唯一可预测哪些行受 TOP 影响的方法。

如果您正在寻找分页记录,则需要使用ROW_NUMBER


1
没有ORDER BY,TOP就没有意义。 - gvee
@ThorstenDittmar,你确定吗?因为我认为SELECT只是以未确定的顺序返回记录,是因为TOP关键字使返回的结果按照PK排序吗? - Habib
@ThorstenDittmar,我相信gvee是正确的,在文档中有这样的说明:在SELECT语句中,总是要使用带有TOP子句的ORDER BY子句。这是唯一可预测哪些行受TOP影响的方法。 - Habib
1
@ThorstenDittmar "几乎总是" <> "总是" ;) - gvee
1
@gvee 这是真的,但在某些情况下(例如我们一个客户的数据库),我只需要从一组行中获取第一个值,因为它对于所有行都相等,所以我不需要 ORDER BY。有人可能会认为数据模型本身就是一个 WTF,但这不是这里讨论的话题 :-D - Thorsten Dittmar
显示剩余5条评论

3

T-SQL中没有相对应的功能。使用TOP可以从结果集中返回前x个结果。你可以使用一个技巧,通过使用ROW_NUMBER添加一个新列,该列从1开始自动递增。

就像这样:

SELECT ROW_NUMBER OVER (SomeExpression), Field FROM ...

然后你可以使用:
SELECT TOP x FROM
(
    SELECT ROW_NUMBER OVER (ORDER BY ID) AS RowNumber, ID, videoid, title FROM ...
) tmp
WHERE RowNumber > Y ORDER BY RowNumber ASC
技巧在于,这个编号与其他字段无关,因此使用相同的过滤器,您将始终获得相同的 RowNumber,从而可以再次过滤。这类似于 LIMIT 的功能。 例如,要获取前 1 到 9 条记录,您可以编写以下内容:
SELECT TOP 9 FROM
(
    SELECT ROW_NUMBER OVER (ORDER BY ID) AS RowNumber, ID, videoid, title FROM ...
) tmp
WHERE RowNumber >= 1 ORDER BY RowNumber ASC

下一页:

SELECT TOP 9 FROM
(
    SELECT ROW_NUMBER OVER (ORDER BY ID) AS RowNumber, ID, videoid, title FROM ...
) tmp
WHERE RowNumber >= 10 ORDER BY RowNumber ASC

3
在SQL Server 2012中,引入了一个新功能来提供这种功能。
查看ORDER BY子句的OFFSET部分。
SELECT *
FROM   your_table
ORDER
    BY some_column
       OFFSET 20 ROWS
       FETCH NEXT 10 ROWS ONLY

这将返回您结果集中按some_column排序的第20-30个结果。
对于 SQL Server 2005 - 2008R2,您可以使用窗口函数执行相同的操作:
SELECT *
FROM   (
        SELECT *
             , Row_Number() OVER (ORDER BY some_column) As sequence
        FROM   your_table
       ) As a_subquery
WHERE  sequence >= 20
AND    sequence <= 30

对于 SQL Server 2005 之前的版本,没有有效的方法来实现此效果。以下是可以实现此效果的方法:

SELECT *
FROM   (
        SELECT *
             , (
                SELECT Count(*)
                FROM   your_table As x
                WHERE  x.some_column <= your_table.some_column
               ) As sequence
        FROM   your_table
       ) As a_subquery
WHERE  sequence >= 20
AND    sequence <= 30

最终说明:为了使您的结果是确定性的some_column应该是唯一的。如果不是,则需要添加额外的列来提供一个确定性的排序顺序。

还要注意,在所有生产代码中都应避免使用SELECT * ...。不要像我在这个答案中那样懒惰;-) - 只列出所需的列。


2
使用 Top:
SELECT TOP 1 * FROM [movie].[dbo].[movies] 
WHERE title like '%' + '%s' + '%'

当使用TOP和ORDER BY子句一起时,结果集被限制为有序行的前N个;否则,它将以未定义的顺序返回前N个行。
在此处阅读更多here
要获取类似于10-20的结果,请使用ROW_NUMBER:
SELECT TOP 10 * FROM 
 (SELECT ROW_NUMBER() OVER (id_field) as SlNo, ID, videoid, title 
  FROM TableName) T
WHERE SlNo>=10
ORDER BY id_field

这个并不像 LIMIT 一样完全奏效,因为你无法获取第 10-20 条结果。 - Thorsten Dittmar
@ThorstenDittmar:谢谢。我编辑了我的回答。 - Raging Bull
没有ORDER BY,TOP就没有意义。示例1示例2示例3 - gvee

1

我认为SQL服务器中没有LIMIT。可以使用TOP代替。 TOP返回查询的前N行,因此如果是TOP 10,即使有一千行,它也只返回前十行。试试这个...

SELECT TOP 60 * 
FROM [movie].[dbo].[movies] 
WHERE title like '%' + '%s' + '%'

然而,这不允许像“LIMIT”一样进行分页。 - Thorsten Dittmar

0
您可以使用以下方法来实现这个目的:
方法1:ORDER BY
SELECT * 
FROM [movie].[dbo].[movies] 
WHERE title like '%' + '%s' + '%'
ORDER BY ID OFFSET 21 ROWS FETCH NEXT 20 ROWS ONLY

方法二:ROW_NUMBER

SELECT *
FROM (  SELECT *,
                ROW_NUMBER()OVER (ORDER BY ID)row
        FROM [movie].[dbo].[movies]
        WHERE title like '%' + '%s' + '%'
    )z
WHERE row>20
    AND row<=40

方法三:前N个

SELECT TOP 20 *
FROM (  SELECT TOP 40 *
        FROM [movie].[dbo].[movies] 
        WHERE title like '%' + '%s' + '%'
        ORDER BY ID
    )z
ORDER BY ID DESC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接