Назначение номеров строк с использованием ROW_NUMBER
На этом этапе мы рассмотрим, как использовать оконную функцию ROW_NUMBER()
в MySQL для присвоения уникального последовательного целого числа каждой строке в наборе результатов. Это особенно полезно, когда вам нужно ранжировать данные или разбить их на страницы.
Прежде чем приступить к практическому примеру, давайте разберемся с базовым синтаксисом функции ROW_NUMBER()
:
ROW_NUMBER() OVER (ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...)
ROW_NUMBER()
: Это сама оконная функция.
OVER()
: Этот оператор определяет окно, то есть набор строк, на которых функция будет работать.
ORDER BY
: Внутри оператора OVER()
оператор ORDER BY
определяет порядок, в котором номера строк будут присвоены. Вы можете указать одну или несколько столбцов для сортировки и выбрать порядок сортировки (по возрастанию (ASC
) или по убыванию (DESC
)) для каждого столбца.
Создадим таблицу с именем employees
и вставим в нее некоторые данные. Откройте терминал и подключитесь к серверу MySQL с помощью командной строки mysql
. Возможно, вам придется указать имя пользователя и пароль.
mysql -u root -p
После подключения выполните следующие SQL-инструкции для создания таблицы employees
и вставки данных:
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);
Теперь используем функцию ROW_NUMBER()
для присвоения номера каждой строке в таблице employees
на основе зарплаты в порядке убывания. Выполните следующий запрос:
SELECT
employee_id,
employee_name,
department,
salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num
FROM
employees;
Этот запрос вернет следующий результат:
+-------------+---------------+------------+----------+---------+
| 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)
Как вы можете видеть, столбец row_num
содержит номер строки, присвоенный каждому сотруднику на основе его зарплаты, причем сотрудник с самой высокой зарплатой получает номер 1.
Вы также можете использовать функцию ROW_NUMBER()
с другими операторами ORDER BY
. Например, чтобы присвоить номера строк на основе имени сотрудника в алфавитном порядке, вы можете использовать следующий запрос:
SELECT
employee_id,
employee_name,
department,
salary,
ROW_NUMBER() OVER (ORDER BY employee_name ASC) AS row_num
FROM
employees;
Это даст следующий результат:
+-------------+---------------+------------+----------+---------+
| 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)
На этот раз столбец row_num
отражает алфавитный порядок имен сотрудников.