В MariaDB, ROWNUM()
е вградена функция, която връща текущия брой приети редове в текущия контекст. Основната му цел е да емулира ROWNUM
псевдо колона в Oracle.
ROWNUM()
може да се използва по начин, който има подобен ефект на LIMIT
клауза – за ограничаване на броя на резултатите, върнати от заявка.
Когато е в режим на Oracle, може да се извика като ROWNUM
(т.е. без скоби).
ROWNUM()
функцията се поддържа от MariaDB 10.6.1.
Синтаксис
Синтаксисът е така:
ROWNUM()
Не се изискват и не се приемат аргументи.
Когато е в режим на Oracle, той може да бъде извикан без скоби, както следва:
ROWNUM
Използването на този синтаксис имитира ROWNUM
псевдо колона в Oracle.
Пример
Нека изпълним заявка, която връща всички редове от таблица, наречена Pets
:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets;
Резултат:
+---------+-------+--------+| ROWNUM() | PetId | Име на домашни любимци |+---------+-------+--------+| 1 | 1 | Пухкави || 2 | 2 | Извличане || 3 | 3 | Надраскване || 4 | 4 | Размахване || 5 | 5 | Tweet || 6 | 6 | Пухкави || 7 | 7 | Кора || 8 | 8 | Мяу |+---------+-------+--------+8 реда в комплект (0,001 сек)
Виждаме, че са върнати осем реда.
Стойността, върната от ROWNUM()
функцията се увеличава с всеки ред. В този случай се случва да съвпада със стойностите в PetId
колона, но това е чисто случайно. PetId
колоната може да използва всяка стойност, но ROWNUM()
ще остане както е тук.
За да илюстрирам какво имам предвид, нека прецизираме заявката, за да изведе по-малко резултати:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
WHERE PetId > 4;
Резултат:
+---------+-------+--------+| ROWNUM() | PetId | Име на домашни любимци |+---------+-------+--------+| 1 | 5 | Tweet || 2 | 6 | Пухкави || 3 | 7 | Кора || 4 | 8 | Мяу |+---------+-------+--------+4 реда в комплект (0,010 сек)
Ограничаване на върнатите редове
Както споменахме, ROWNUM()
може да се използва по начин, който има подобен ефект на LIMIT
клауза – за ограничаване на броя на резултатите, върнати от заявка.
Ето един пример:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
WHERE ROWNUM() <= 5;
Резултат:
+---------+-------+--------+| ROWNUM() | PetId | Име на домашни любимци |+---------+-------+--------+| 1 | 1 | Пухкави || 2 | 2 | Извличане || 3 | 3 | Надраскване || 4 | 4 | Размахване || 5 | 5 | Tweet |+---------+-------+--------+5 реда в комплект (0,001 сек)
Ето как ще постигнем същия ефект, използвайки LIMIT
клауза:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
LIMIT 5;
Резултат:
+---------+-------+--------+| ROWNUM() | PetId | Име на домашни любимци |+---------+-------+--------+| 1 | 1 | Пухкави || 2 | 2 | Извличане || 3 | 3 | Надраскване || 4 | 4 | Размахване || 5 | 5 | Tweet |+---------+-------+--------+5 реда в комплект (0,001 сек)
Има разлика между използването на LIMIT
и ROWNUM()
за да ограничите върнатите редове.
Основната разлика е, че LIMIT
работи върху набора от резултати, докато ROWNUM
работи върху броя на приетите редове (пред всяка ORDER
или GROUP BY
клаузи).
Ето пример, който демонстрира тази разлика:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
WHERE ROWNUM() <= 5
ORDER BY PetId Desc;
Резултат:
+---------+-------+--------+| ROWNUM() | PetId | Име на домашни любимци |+---------+-------+--------+| 5 | 5 | Tweet || 4 | 4 | Размахване || 3 | 3 | Надраскване || 2 | 2 | Извличане || 1 | 1 | Пухкав |+---------+-------+--------+5 реда в комплект (0,129 сек)
И тук се използва LIMIT
клауза:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
ORDER BY PetId Desc
LIMIT 5;
Резултат:
+---------+-------+--------+| ROWNUM() | PetId | Име на домашни любимци |+---------+-------+--------+| 8 | 8 | Мяу || 7 | 7 | Кора || 6 | 6 | Пухкави || 5 | 5 | Tweet || 4 | 4 | Размахване |+---------+-------+--------+5 реда в комплект (0,000 сек)
Пропускане на скобите
Когато работите в режим на Oracle, е възможно да пропуснете скобите. Това ви позволява да емулирате ROWNUM
псевдо колона в Oracle.
Ето пример за превключване към режим на Oracle:
SET SQL_MODE='ORACLE';
Сега можем да изпълним ROWNUM
без скоби:
SELECT
ROWNUM,
PetId,
PetName
FROM Pets;
Резултат:
<пред>+--------+-------+--------+| ROWNUM | PetId | Име на домашни любимци |+-------+-------+--------+| 1 | 1 | Пухкави || 2 | 2 | Извличане || 3 | 3 | Надраскване || 4 | 4 | Размахване || 5 | 5 | Tweet || 6 | 6 | Пухкави || 7 | 7 | Кора || 8 | 8 | Мяу |+--------+-------+--------+8 реда в комплект (0,029 сек)
Имайте предвид, че това е достъпно само в режим на Oracle. Използване на ROWNUM
без скоби, когато не е в режим на Oracle, води до грешка.
За да демонстрираме, нека преминем към режим по подразбиране:
SET SQL_MODE=DEFAULT;
Сега стартирайте заявката отново:
SELECT
ROWNUM,
PetId,
PetName
FROM Pets;
Резултат:
ГРЕШКА 1054 (42S22):Неизвестна колона „ROWNUM“ в „списък с полета“
Вижте документацията на MariaDB за някои съображения относно оптимизацията и други фактори.