Zuweisen von Zeilennummern mit ROW_NUMBER
In diesem Schritt werden wir untersuchen, wie man die MySQL-Fensterfunktion (Window Function) ROW_NUMBER()
verwendet, um jeder Zeile in einem Ergebnisset eine eindeutige aufsteigende Ganzzahl zuzuweisen. Dies ist besonders nützlich, wenn Sie Daten klassifizieren oder paginieren müssen.
Bevor wir uns einem praktischen Beispiel zuwenden, schauen wir uns die grundlegende Syntax von ROW_NUMBER()
an:
ROW_NUMBER() OVER (ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...)
ROW_NUMBER()
: Dies ist die Fensterfunktion selbst.
OVER()
: Diese Klausel gibt das Fenster an, also die Menge von Zeilen, auf denen die Funktion operiert.
ORDER BY
: Innerhalb der OVER()
-Klausel bestimmt die ORDER BY
-Klausel die Reihenfolge, in der die Zeilennummern zugewiesen werden. Sie können eine oder mehrere Spalten zur Sortierung angeben und für jede Spalte die aufsteigende (ASC
) oder absteigende (DESC
) Reihenfolge auswählen.
Erstellen wir nun eine Beispieltabelle namens employees
und fügen einige Daten ein. Öffnen Sie Ihr Terminal und verbinden Sie sich mit Ihrem MySQL-Server über den mysql
-Befehlszeilenclient. Möglicherweise müssen Sie Ihren Benutzernamen und Ihr Passwort angeben.
mysql -u root -p
Nachdem Sie verbunden sind, führen Sie die folgenden SQL-Anweisungen aus, um die employees
-Tabelle zu erstellen und Daten einzufügen:
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);
Nun verwenden wir ROW_NUMBER()
, um jeder Mitarbeiterin bzw. jedem Mitarbeiter eine Zeilennummer basierend auf ihrem Gehalt in absteigender Reihenfolge zuzuweisen. Führen Sie die folgende Abfrage aus:
SELECT
employee_id,
employee_name,
department,
salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num
FROM
employees;
Diese Abfrage gibt das folgende Ergebnis zurück:
+-------------+---------------+------------+----------+---------+
| 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)
Wie Sie sehen können, enthält die Spalte row_num
die Zeilennummer, die jeder Mitarbeiterin bzw. jedem Mitarbeiter basierend auf ihrem Gehalt zugewiesen wurde, wobei der/die Mitarbeiter/in mit dem höchsten Gehalt die Zeilennummer 1 erhält.
Sie können ROW_NUMBER()
auch mit anderen ORDER BY
-Klauseln verwenden. Beispielsweise können Sie die folgende Abfrage verwenden, um Zeilennummern basierend auf dem Namen der Mitarbeiterinnen und Mitarbeiter in aufsteigender Reihenfolge zuzuweisen:
SELECT
employee_id,
employee_name,
department,
salary,
ROW_NUMBER() OVER (ORDER BY employee_name ASC) AS row_num
FROM
employees;
Dies ergibt die folgende Ausgabe:
+-------------+---------------+------------+----------+---------+
| 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)
Diesmal spiegelt die Spalte row_num
die alphabetische Reihenfolge der Namen der Mitarbeiterinnen und Mitarbeiter wider.