我想学习一些(理想情况下)与数据库无关的方法,从数据库表中 Select 第n行.看看如何使用以下数据库的本机功能实现这一点也很有趣:

  • SQL Server
  • MySQL
  • PostgreSQL
  • 数据库
  • 神谕

我目前正在SQL Server 2005中执行类似于以下的操作,但我有兴趣了解其他更不可知论的方法:

WITH Ordered AS (
SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS RowNumber, OrderID, OrderDate
FROM Orders)
SELECT *
FROM Ordered
WHERE RowNumber = 1000000

上述SQL的学分:Firoz Ansari's Weblog

Update:关于SQL标准,请参见Troels Arvin's answer.Troels, have you got any links we can cite?

推荐答案

在标准的可选部分中有这样做的方法,但许多数据库都支持自己的方法.

一个谈论这个和其他事情的好网站是http://troels.arvin.dk/db/rdbms/#select-limit.

基本上,PostgreSQL和MySQL支持非标准:

SELECT...
LIMIT y OFFSET x 

Oracle、DB2和MSSQL支持标准窗口功能:

SELECT * FROM (
  SELECT
    ROW_NUMBER() OVER (ORDER BY key ASC) AS rownumber,
    columns
  FROM tablename
) AS foo
WHERE rownumber <= n

(这是我从上面链接的网站上复制的,因为我从未使用过这些数据库)

Update:从PostgreSQL 8.4开始,标准的窗口函数都是受支持的,所以第二个例子也适用于PostgreSQL.

2018年9月15日,SQLite在3.25.0版中增加了Update:个窗口函数支持,因此这两种形式也适用于SQLite.

Mysql相关问答推荐

SQL查询仅插入5行

如果WHERE语句包含所有列,唯一键顺序是否重要?

如何在MySQL中检索两列的值不同的行

MySQL多次联接同一个表使计数变得奇怪

可以优化这个带有重复WHERE子句的查询吗?

查询具有JSON对象数组的列时,JSON_CONTAINS的MySQL语法错误

Mysql - Select 匹配某些条件的两条记录之间经过的最大天数

MySQL中的where语句会 destruct 全外连接.

如何更新一个巨大的表的 50k 行?

状态为已发货的订单返回产品总数量的SQL(不同的两张表)

处理 Visits 表中数百万行的最佳方法是什么?

如何根据特定条件从mysql数据库中 Select 查询

避免重复进入mysql数据库的最佳方法

如何删除没有临时表的 MySQL 表中的所有重复记录

PHP 判断 NULL

如何使用 SQL 数据库中的经纬度查找最近的位置?

utf8mb4_unicode_ci 与 utf8mb4_bin

NodeJS/mySQL - ER_ACCESS_DENIED_ERROR 用户'root'@'localhost'的访问被拒绝(使用密码:是)

在 MySQL 中删除数据库返回删除数据库错误:66

如何将 MySQL 查询结果存储在另一个表中?