Utilisation de la fonction Row_Number() dans MySQL

Mehvish Ashiq 15 février 2024
  1. Utilisation de ROW_NUMBER() dans MySQL à l’aide de la clause ORDER BY
  2. Utilisation de ROW_NUMBER() dans MySQL à l’aide de la clause PARTITION BY
  3. Utilisation de ROW_NUMBER() dans MySQL à l’aide des clauses PARTITION BY et ORDER BY
  4. Réplication de ROW_NUMBER() dans MySQL à l’aide de la variable de session
  5. Conclusion
Utilisation de la fonction Row_Number() dans MySQL

Dans ce tutoriel, nous allons vous présenter comment vous pouvez utiliser la fonction ROW_NUMBER() dans MySQL. Il s’agit d’une méthode de classement qui attribue des numéros consécutifs dans la partition à partir de 1. Il est important de noter que deux lignes dans la partition n’ont pas le même numéro.

Nous verrons également comment PARTITION BY et ORDER BY affectent les résultats MySQL. Vous devez utiliser la clause ORDER BY pour utiliser ROW_NUMBER() car elle est obligatoire. Mais la clause PARTITION BY est facultative.

Les résultats seront indéterminés si vous utilisez les deux clauses, PARTITION BY et ORDER BY. Ici, nous allons voir comment émuler la fonction ROW_NUMBER() en utilisant la variable de session pour obtenir les résultats souhaités.

Veuillez noter que ROW_NUMBER() n’était pas disponible avant la version 8.0 de MySQL. Vous voyez les nouveautés de MySQL version 8.0 ici.

Utilisation de ROW_NUMBER() dans MySQL à l’aide de la clause ORDER BY

Nous n’utiliserons que la fonction ROW_NUMBER() avec la clause ORDER BY et observerons les résultats. Commençons par créer la table et remplissons-y des données.

Exemple de code :

# SQL Programming Using MySQL Version 8.27
CREATE TABLE `test_db`.`tb_student` (
 STUDENT_ID	INTEGER NOT NULL,
 FIRST_NAME	VARCHAR(30) NOT NULL,
 LAST_NAME	VARCHAR(30) NOT NULL,
 GENDER	VARCHAR(30) NOT NULL,
 CITY_NAME	VARCHAR(64) NOT NULL,
 EMAIL_ADDRESS	VARCHAR(64) NOT NULL,
 REGISTRATION_YEAR INTEGER NOT NULL,
 PRIMARY KEY	(STUDENT_ID)
);

Cette requête créera une table nommée tb_student, que vous pourrez confirmer dans la base de données MySQL.

row_number dans mysql - Table créée

Insérez les six enregistrements dans la table nommée tb_student en utilisant la syntaxe suivante de la requête INSERT.

# SQL Programming Using MySQL Version 8.27
INSERT INTO test_db.tb_student
(STUDENT_ID, FIRST_NAME, LAST_NAME, GENDER, CITY_NAME, EMAIL_ADDRESS, REGISTRATION_YEAR)
VALUES
(1,'Ayush','Kumar', 'Male', 'Washington', 'akuman@yahoo.com', 2010);

Sélectionnez ensuite toutes les données de la table à afficher à l’aide de la requête suivante.

# SQL Programming Using MySQL Version 8.27
SELECT * FROM test_db.tb_student

Votre tableau contiendra les données suivantes. Vous pouvez également vérifier de votre côté et comparer.

row_number dans mysql - Table remplie

# SQL Programming Using MySQL Version 8.27
SELECT *,
    ROW_NUMBER() OVER(ORDER BY REGISTRATION_Year) AS row_numb
FROM test_db.tb_student;

Après avoir exécuté la requête ci-dessus, vous obtiendrez le résultat suivant.

row_number dans mysql - row_number avec la clause order by

Observez la sortie ci-dessus et vous verrez que tous les enregistrements sont affichés, qui sont classés par année d’enregistrement (voir la colonne dans la case verte). Et le row_number est également le même que prévu, en partant de 1 et en continuant d’augmenter séquentiellement jusqu’à la fin du tableau, car nous lisons toutes les données de tb_student.

Utilisation de ROW_NUMBER() dans MySQL à l’aide de la clause PARTITION BY

Nous n’utiliserons que la fonction ROW_NUMBER() avec la clause PARTITION BY et observerons les résultats. Nous comparerons également cette sortie avec les résultats que nous avons obtenus en utilisant ROW_NUMBER() avec la clause ORDER BY.

Exemple de code :

# SQL Programming Using MySQL Version 8.27
SELECT *,
    ROW_NUMBER() OVER(PARTITION BY REGISTRATION_Year) AS row_numb
FROM test_db.tb_student;

Maintenant, vous obtiendrez les résultats suivants.

row_number dans mysql - row_number avec partition par clause

Jetez un œil à la colonne REGISTRATION_YEAR ; il comporte 5 partitions (2010, 2011, 2012, 2013 et 2014). Il y a deux lignes dans le tableau pour la partition 2010, et les numéros de ligne sont correctement attribués (voir à nouveau la capture d’écran ci-dessus). Il n’y a qu’une seule ligne pour partition 2011, 2012, 2013, 2014 ; c’est pourquoi vous pouvez voir 1 dans la colonne row_numb.

Si nous utilisons la clause PARTITION BY, alors pourquoi la colonne nommée REGISTRATION_YEAR est-elle dans l’ordre croissant ? Parce que la clause PARTITION BY ordonne les données dans ces partitions. Insérons un autre enregistrement pour lequel la valeur de REGISTRATION_YEAR serait 2009 et observons les résultats.

# SQL Programming Using MySQL Version 8.27

INSERT INTO test_db.tb_student
(STUDENT_ID, FIRST_NAME, LAST_NAME, GENDER, CITY_NAME, EMAIL_ADDRESS, REGISTRATION_YEAR)
VALUES
(7,'Mashal','Naaz', 'Female', 'Florida', 'mashalnaaz@gmail.com', 2009);

SELECT *,
    ROW_NUMBER() OVER(PARTITION BY REGISTRATION_Year) AS row_numb
FROM test_db.tb_student;

Maintenant, vous verrez que le record récent est au sommet.

row_number dans mysql - row_number avec partition par clause

Utilisation de ROW_NUMBER() dans MySQL à l’aide des clauses PARTITION BY et ORDER BY

Maintenant, nous n’utiliserons que la fonction ROW_NUMBER() avec les clauses PARTITION BY et ORDER BY et nous verrons si elle fournit toujours les bons numéros de ligne.

Exemple de code :

# SQL Programming Using MySQL Version 8.27
SELECT *,
    ROW_NUMBER() OVER(PARTITION BY REGISTRATION_YEAR ORDER BY REGISTRATION_YEAR) AS row_numb
FROM test_db.tb_student;

Après avoir exécuté la requête ci-dessus, vous verrez la même sortie que celle que nous avons obtenue en utilisant ROW_NUMBER() avec la clause PARTITION BY. Voir la capture d’écran suivante :

row_number dans mysql - row_number avec les deux clauses

Voir la colonne à fond jaune, c’est ce à quoi nous nous attendions. Ici, nous utiliserons la variable de session pour attribuer correctement les numéros de ligne.

Réplication de ROW_NUMBER() dans MySQL à l’aide de la variable de session

MySQL ne fournit pas la fonctionnalité de classement correcte lorsque nous utilisons simultanément les clauses PARTITION BY et ORDER BY. Dans ce scénario, nous émulons cela en utilisant Session Variable. Les variables de session sont définies par l’utilisateur ; vous pouvez le voir ici pour des informations détaillées.

Exemple de code :

# SQL Programming Using MySQL Version 8.27
SET @row_numb = 0;
SELECT *,
    (@row_numb:=@row_numb + 1) AS row_numb
FROM test_db.tb_student ORDER BY REGISTRATION_YEAR;

Comme vous pouvez le voir ci-dessous, row_numb commence à partir de 1 et augmente consécutivement.

row_number dans mysql - Variable de session

Comment ça marche ? Nous avons d’abord défini une variable de session row_numb en utilisant le préfixe @ et initialisé avec le 0. Ensuite, nous avons sélectionné les données de la table, les avons ordonnées et imprimées. (@row_numb:=@row_numb + 1) revient à incrémenter et mettre à jour la valeur de la variable.

Conclusion

À la lumière de la discussion ci-dessus, nous avons conclu que bien que nous puissions également utiliser la fonction ROW_NUMBER() dans MySQL si nous avons la version 8.0 ou supérieure, il existe encore des situations où nous devons utiliser Session Variables à des fins de classement.

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook