Attribuer des numéros de ligne avec ROW_NUMBER
Dans cette étape, nous allons explorer comment utiliser la fonction fenêtre (window function) ROW_NUMBER()
dans MySQL pour attribuer un entier séquentiel unique à chaque ligne d'un ensemble de résultats. Cela est particulièrement utile lorsque vous avez besoin de classer ou de paginer des données.
Avant de plonger dans l'exemple pratique, comprenons la syntaxe de base de ROW_NUMBER()
:
ROW_NUMBER() OVER (ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...)
ROW_NUMBER()
: Il s'agit de la fonction fenêtre elle - même.
OVER()
: Cette clause spécifie la fenêtre, qui est l'ensemble de lignes sur lequel la fonction opère.
ORDER BY
: À l'intérieur de la clause OVER()
, la clause ORDER BY
détermine l'ordre dans lequel les numéros de ligne sont attribués. Vous pouvez spécifier une ou plusieurs colonnes pour le tri, et vous pouvez choisir l'ordre croissant (ASC
) ou décroissant (DESC
) pour chaque colonne.
Créons une table d'exemple nommée employees
et insérons - y quelques données. Ouvrez votre terminal et connectez - vous à votre serveur MySQL en utilisant le client en ligne de commande mysql
. Vous devrez peut - être fournir votre nom d'utilisateur et votre mot de passe.
mysql -u root -p
Une fois connecté, exécutez les instructions SQL suivantes pour créer la table employees
et insérer des données :
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
employee_name VARCHAR(50),
department VARCHAR(50),
salary DECIMAL(10, 2)
);
INSERT INTO employees (employee_id, employee_name, department, salary) VALUES
(1, 'Alice', 'Sales', 60000.00),
(2, 'Bob', 'Marketing', 55000.00),
(3, 'Charlie', 'Sales', 65000.00),
(4, 'David', 'IT', 70000.00),
(5, 'Eve', 'Marketing', 62000.00);
Maintenant, utilisons ROW_NUMBER()
pour attribuer un numéro de ligne à chaque employé en fonction de leur salaire dans l'ordre décroissant. Exécutez la requête suivante :
SELECT
employee_id,
employee_name,
department,
salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num
FROM
employees;
Cette requête retournera le résultat suivant :
+-------------+---------------+------------+----------+---------+
| employee_id | employee_name | department | salary | row_num |
+-------------+---------------+------------+----------+---------+
| 4 | David | IT | 70000.00 | 1 |
| 3 | Charlie | Sales | 65000.00 | 2 |
| 5 | Eve | Marketing | 62000.00 | 3 |
| 1 | Alice | Sales | 60000.00 | 4 |
| 2 | Bob | Marketing | 55000.00 | 5 |
+-------------+---------------+------------+----------+---------+
5 rows in set (0.00 sec)
Comme vous pouvez le voir, la colonne row_num
contient le numéro de ligne attribué à chaque employé en fonction de leur salaire, le salaire le plus élevé recevant le numéro de ligne 1.
Vous pouvez également utiliser ROW_NUMBER()
avec d'autres clauses ORDER BY
. Par exemple, pour attribuer des numéros de ligne en fonction du nom de l'employé dans l'ordre croissant, vous pouvez utiliser la requête suivante :
SELECT
employee_id,
employee_name,
department,
salary,
ROW_NUMBER() OVER (ORDER BY employee_name ASC) AS row_num
FROM
employees;
Cela produira la sortie suivante :
+-------------+---------------+------------+----------+---------+
| employee_id | employee_name | department | salary | row_num |
+-------------+---------------+------------+----------+---------+
| 1 | Alice | Sales | 60000.00 | 1 |
| 2 | Bob | Marketing | 55000.00 | 2 |
| 3 | Charlie | Sales | 65000.00 | 3 |
| 4 | David | IT | 70000.00 | 4 |
| 5 | Eve | Marketing | 62000.00 | 5 |
+-------------+---------------+------------+----------+---------+
5 rows in set (0.00 sec)
Cette fois, la colonne row_num
reflète l'ordre alphabétique des noms des employés.