SQL First() 函数
SQL:获取第一行或前 N 行
Section titled “SQL:获取第一行或前 N 行”获取“第一”行:排序的重要性
Section titled “获取“第一”行:排序的重要性”在 SQL 中,表本质上是无序的行集合。要可靠地获取你认为的“第一”行,必须使用 ORDER BY(排序)子句来定义一个特定的顺序。如果没有 ORDER BY,数据库可能会按任何顺序返回行,并且这个顺序在不同查询之间可能发生变化。
排序后,你可以使用各种 SQL 子句将结果集限制为第一行(或前 N 行)。
注意:MS Access 中使用的非标准 FIRST() 函数不是标准 SQL 的一部分。下面是常用、标准或广泛支持的方法。
获取第一行的标准和常用语法
Section titled “获取第一行的标准和常用语法”标准 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;
示例:获取最年长的客户。
Section titled “示例:获取最年长的客户。”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];
示例:获取价格最高的产品。
Section titled “示例:获取价格最高的产品。”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
Section titled “示例数据库:Northwind”我们将使用 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 FirstAlphabeticalCustomerFROM CustomersORDER BY CustomerName ASCLIMIT 1;实际应用:获取最新条目、得分最高的玩家或最畅销的产品是常见的用例,这些都依赖于排序和限制结果。