sql >> Databáze >  >> RDS >> MariaDB

MariaDB ROWNUM() Vysvětleno

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.


  1. Jak správně zacházet s daty v omezeních dotazů

  2. Funkce MySQL EXP() – Návrat e Zvýšena na výkon x

  3. Jak zkontrolovat verzi MySQL

  4. přidat sloupec do tabulky mysql, pokud neexistuje