當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


MySQL ROW_NUMBER()用法及代碼示例

MySQL 中的 ROW_NUMBER() 函數用於返回其分區內每一行的序列號。它是一種窗口函數。行號從 1 開始到分區中存在的行數。

需要注意的是,MySQL 在 8.0 版本之前不支持 ROW_NUMBER() 函數,但它們提供了一個會話變量,允許我們模擬該函數。

用法

以下是在 MySQL 中使用 ROW_NUMBER() 的基本語法:

ROW_NUMBER() OVER (<partition_definition> <order_definition>)

讓我們用一個例子來演示它

首先,我們將使用以下語句創建一個名為 "Person" 的表:

CREATE TABLE Person (
  Name varchar(45) NOT NULL,
  Product varchar(45) DEFAULT NULL,
  Country varchar(25) DEFAULT NULL,
  Year int NOT NULL
);

接下來,需要向該表添加值。執行以下語句:

INSERT INTO Person(Name, Product, Country, Year) 
VALUES ('Stephen', 'Computer', 'USA', 2015), 
('Joseph', 'Laptop', 'India', 2016), 
('John', 'TV', 'USA', 2016),
('Donald', 'Laptop', 'England', 2015),
('Joseph', 'Mobile', 'India', 2015),
('Peter', 'Mouse', 'England', 2016);

接下來,執行 SELECT 語句以顯示記錄:

mysql> SELECT * FROM Person;

我們會得到輸出,如下圖:

MySQL ROW_NUMBER() Function

現在,我們可以使用 ROW_NUMBER() 函數使用以下語句為每條記錄分配一個序列號:

SELECT *, 
    ROW_NUMBER() OVER(PARTITION BY Year) AS row_num
FROM Person;

它將給出以下輸出:

MySQL ROW_NUMBER() Function

同樣,我們可以使用 ROW_NUMBER() 函數使用以下語句為分區內的每個記錄分配一個序列號:

SELECT *, 
    ROW_NUMBER() OVER(PARTITION BY Year) AS row_num
FROM Person;

它將給出如下輸出,其中根據年份(2015 年和 2016 年)找到了兩個分區。

MySQL ROW_NUMBER() Function

MySQL ROW_NUMBER() 使用會話變量

我們可以模擬 ROW_NUMBER() 函數,使用會話變量按遞增順序添加行號。

執行以下語句,為每行添加行號,從 1 開始:

SET @row_number = 0; 

SELECT Name, Product, Year, Country,
    (@row_number:=@row_number + 1) AS row_num
FROM Person ORDER BY Country;

在此語句中,我們首先指定@prfix 指示的會話變量@row_number 並將其值設置為0。然後,我們從表Person 中選擇數據,並將變量@row_number 的值每行增加1。

查詢成功執行後,我們將得到如下輸出:

MySQL ROW_NUMBER() Function

同樣,我們將使用會話變量作為表並使用以下語句將其與源表交叉連接:

SELECT (@row_number:=@row_number + 1) AS row_num, Name, Country, Year
FROM Person, (SELECT @row_number:=0) AS temp ORDER BY Year;

我們將得到如下輸出:

MySQL ROW_NUMBER() Function



相關用法


注:本文由純淨天空篩選整理自 MySQL ROW_NUMBER() Function。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。