V MariaDB ROWNUM()
je vestavěná funkce, která vrací aktuální počet přijatých řádků v aktuálním kontextu. Jeho hlavním účelem je emulovat ROWNUM
pseudo sloupec v Oracle.
ROWNUM()
lze použít způsobem, který má podobný účinek jako LIMIT
klauzule – pro omezení počtu výsledků vrácených dotazem.
V režimu Oracle jej lze volat jako ROWNUM
(tj. bez závorek).
ROWNUM()
funkce je podporována od MariaDB 10.6.1.
Syntaxe
Syntaxe vypadá takto:
ROWNUM()
Žádné argumenty nejsou vyžadovány ani přijímány.
V režimu Oracle jej lze volat bez závorek takto:
ROWNUM
Použití této syntaxe napodobuje ROWNUM
pseudo sloupec v Oracle.
Příklad
Spusťte dotaz, který vrátí všechny řádky z tabulky s názvem Pets
:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets;
Výsledek:
+----------+-------+---------+ | ROWNUM() | PetId | PetName | +----------+-------+---------+ | 1 | 1 | Fluffy | | 2 | 2 | Fetch | | 3 | 3 | Scratch | | 4 | 4 | Wag | | 5 | 5 | Tweet | | 6 | 6 | Fluffy | | 7 | 7 | Bark | | 8 | 8 | Meow | +----------+-------+---------+ 8 rows in set (0.001 sec)
Vidíme, že bylo vráceno osm řádků.
Hodnota vrácená funkcí ROWNUM()
funkce se zvyšuje s každým řádkem. V tomto případě se náhodou shoduje s hodnotami v PetId
sloupec, ale to je čistě náhoda. PetId
sloupec mohl použít jakoukoli hodnotu kromě ROWNUM()
zůstane tak, jak je zde.
Abychom ilustrovali, co tím myslím, upřesníme dotaz tak, aby vrátil méně výsledků:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
WHERE PetId > 4;
Výsledek:
+----------+-------+---------+ | ROWNUM() | PetId | PetName | +----------+-------+---------+ | 1 | 5 | Tweet | | 2 | 6 | Fluffy | | 3 | 7 | Bark | | 4 | 8 | Meow | +----------+-------+---------+ 4 rows in set (0.010 sec)
Omezení vrácených řádků
Jak již bylo zmíněno, ROWNUM()
lze použít způsobem, který má podobný účinek jako LIMIT
klauzule – pro omezení počtu výsledků vrácených dotazem.
Zde je příklad:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
WHERE ROWNUM() <= 5;
Výsledek:
+----------+-------+---------+ | ROWNUM() | PetId | PetName | +----------+-------+---------+ | 1 | 1 | Fluffy | | 2 | 2 | Fetch | | 3 | 3 | Scratch | | 4 | 4 | Wag | | 5 | 5 | Tweet | +----------+-------+---------+ 5 rows in set (0.001 sec)
Zde je návod, jak bychom dosáhli stejného efektu pomocí LIMIT
klauzule:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
LIMIT 5;
Výsledek:
+----------+-------+---------+ | ROWNUM() | PetId | PetName | +----------+-------+---------+ | 1 | 1 | Fluffy | | 2 | 2 | Fetch | | 3 | 3 | Scratch | | 4 | 4 | Wag | | 5 | 5 | Tweet | +----------+-------+---------+ 5 rows in set (0.001 sec)
Mezi použitím LIMIT
je rozdíl a ROWNUM()
omezit vrácené řádky.
Hlavní rozdíl je v tom, že LIMIT
pracuje se sadou výsledků, zatímco ROWNUM
funguje na počtu přijatých řádků (před každým ORDER
nebo GROUP BY
doložky).
Zde je příklad, který tento rozdíl demonstruje:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
WHERE ROWNUM() <= 5
ORDER BY PetId Desc;
Výsledek:
+----------+-------+---------+ | ROWNUM() | PetId | PetName | +----------+-------+---------+ | 5 | 5 | Tweet | | 4 | 4 | Wag | | 3 | 3 | Scratch | | 2 | 2 | Fetch | | 1 | 1 | Fluffy | +----------+-------+---------+ 5 rows in set (0.129 sec)
A zde je to pomocí LIMIT
klauzule:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
ORDER BY PetId Desc
LIMIT 5;
Výsledek:
+----------+-------+---------+ | ROWNUM() | PetId | PetName | +----------+-------+---------+ | 8 | 8 | Meow | | 7 | 7 | Bark | | 6 | 6 | Fluffy | | 5 | 5 | Tweet | | 4 | 4 | Wag | +----------+-------+---------+ 5 rows in set (0.000 sec)
Vynechání závorek
Při spuštění v režimu Oracle je možné vynechat závorky. To vám umožní emulovat ROWNUM
pseudo sloupec v Oracle.
Zde je příklad přepnutí do režimu Oracle:
SET SQL_MODE='ORACLE';
Nyní můžeme spustit ROWNUM
bez závorek:
SELECT
ROWNUM,
PetId,
PetName
FROM Pets;
Výsledek:
+--------+-------+---------+ | ROWNUM | PetId | PetName | +--------+-------+---------+ | 1 | 1 | Fluffy | | 2 | 2 | Fetch | | 3 | 3 | Scratch | | 4 | 4 | Wag | | 5 | 5 | Tweet | | 6 | 6 | Fluffy | | 7 | 7 | Bark | | 8 | 8 | Meow | +--------+-------+---------+ 8 rows in set (0.029 sec)
Všimněte si, že toto je dostupné pouze v režimu Oracle. Pomocí ROWNUM
bez závorek, když není v režimu Oracle, způsobí chybu.
Pro demonstraci přepněte do výchozího režimu:
SET SQL_MODE=DEFAULT;
Nyní spusťte dotaz znovu:
SELECT
ROWNUM,
PetId,
PetName
FROM Pets;
Výsledek:
ERROR 1054 (42S22): Unknown column 'ROWNUM' in 'field list'
Některé úvahy týkající se optimalizace a dalších faktorů naleznete v dokumentaci MariaDB.