Skip to content

SQL First() 函数

获取“第一”行:排序的重要性

Section titled “获取“第一”行:排序的重要性”

在 SQL 中,表本质上是无序的行集合。要可靠地获取你认为的“第一”行,必须使用 ORDER BY(排序)子句来定义一个特定的顺序。如果没有 ORDER BY,数据库可能会按任何顺序返回行,并且这个顺序在不同查询之间可能发生变化。

排序后,你可以使用各种 SQL 子句将结果集限制为第一行(或前 N 行)。

注意:MS Access 中使用的非标准 FIRST() 函数不是标准 SQL 的一部分。下面是常用、标准或广泛支持的方法。

标准 SQL (SQL:2008 及更高版本):FETCH FIRST N ROWS ONLY(获取前 N 行)

Section titled “标准 SQL (SQL:2008 及更高版本):FETCH FIRST N ROWS ONLY(获取前 N 行)”

这是 ANSI SQL 标准方式。PostgreSQL, Oracle (12c+), DB2, SQL Server (2012+ 通过 OFFSET ... FETCH) 等都支持。

SELECT column_name(s) FROM table_name ORDER BY sort_column [ASC|DESC] FETCH FIRST 1 ROW ONLY;

SELECT CustomerName, RegistrationDate FROM Customers ORDER BY RegistrationDate ASC FETCH FIRST 1 ROW ONLY;

MySQL 和 PostgreSQL:LIMIT(限制)子句

Section titled “MySQL 和 PostgreSQL:LIMIT(限制)子句”

SELECT column_name(s) FROM table_name ORDER BY sort_column [ASC|DESC] LIMIT 1;

示例:获取按字母顺序排列的第一个客户。

Section titled “示例:获取按字母顺序排列的第一个客户。”

SELECT CustomerName FROM Customers ORDER BY CustomerName ASC LIMIT 1;

SQL Server:TOP(顶部/前 N 行)子句

Section titled “SQL Server:TOP(顶部/前 N 行)子句”

SELECT TOP 1 column_name(s) FROM table_name ORDER BY sort_column [ASC|DESC];

SELECT TOP 1 ProductName, Price FROM Products ORDER BY Price DESC;

Oracle (旧版本, 12c 之前):ROWNUM(行号)伪列

Section titled “Oracle (旧版本, 12c 之前):ROWNUM(行号)伪列”

这种方法需要一个子查询,因为在同一个查询块中,ROWNUM 是在 ORDER BY 之前分配的。

SELECT column_name(s) FROM ( SELECT column_name(s) FROM table_name ORDER BY sort_column [ASC|DESC] ) WHERE ROWNUM <= 1;

示例:使用 ROWNUM 按 CustomerID 获取第一个客户。

Section titled “示例:使用 ROWNUM 按 CustomerID 获取第一个客户。”

SELECT CustomerName FROM ( SELECT CustomerName, CustomerID FROM Customers ORDER BY CustomerID ASC ) WHERE ROWNUM <= 1;

我们将使用 Northwind 示例数据库作为背景。

以下是 “Customers” 表的选定内容:

CustomerID CustomerName ContactName Address City PostalCode Country

1 Alfreds Futterkiste Maria Anders Obere Str. 57 Berlin 12209 Germany

2 Ana Trujillo Emparedados y helados Ana Trujillo Avda. de la Constitución 2222 México D.F. 05021 Mexico

3 Antonio Moreno Taquería Antonio Moreno Mataderos 2312 México D.F. 05023 Mexico

4 Around the Horn Thomas Hardy 120 Hanover Sq. London WA1 1DP UK

5 Berglunds snabbköp Christina Berglund Berguvsvägen 8 Luleå S-958 22 Sweden

示例:按字母顺序查找第一个客户

Section titled “示例:按字母顺序查找第一个客户”

以下 SQL 语句使用 LIMIT 子句(在 MySQL/PostgreSQL 中很常见),从 “Customers” 表中按 “CustomerName” 字母顺序选择第一个客户。

SELECT CustomerName AS FirstAlphabeticalCustomer
FROM Customers
ORDER BY CustomerName ASC
LIMIT 1;

实际应用:获取最新条目、得分最高的玩家或最畅销的产品是常见的用例,这些都依赖于排序和限制结果。