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

Jak RAND() funguje v MariaDB

V MariaDB, RAND() je vestavěná funkce, která vrací náhodný DOUBLE přesnost s plovoucí desetinnou čárkou v v rozsahu 0 <= v < 1.0 .

Syntaxe

RAND() lze použít následujícími dvěma způsoby:

RAND()
RAND(N)

Kde N je konstantní celé číslo, které se má použít jako počáteční hodnota.

Když je použita počáteční hodnota, RAND() vytváří opakovatelnou sekvenci hodnot sloupců.

Příklad

Zde je příklad demonstrující RAND() bez zadání počáteční hodnoty:

SELECT RAND();

Výsledek:

+---------------------+
| RAND()              |
+---------------------+
| 0.14470310708945908 |
+---------------------+

Příklad – Se semínkem

Zde je příklad demonstrující RAND() s seed value:

SELECT RAND(3);

Výsledek:

+--------------------+
| RAND(3)            |
+--------------------+
| 0.9057697559760601 |
+--------------------+

Při použití výše uvedeného příkladu ve skutečnosti nepoznáme rozdíl. Abychom viděli rozdíl, musíme provést více volání funkcí pomocí stejného seedu.

Takhle:

SELECT 
    RAND(3),
    RAND(3),
    RAND(3);

Výsledek:

+--------------------+--------------------+--------------------+
| RAND(3)            | RAND(3)            | RAND(3)            |
+--------------------+--------------------+--------------------+
| 0.9057697559760601 | 0.9057697559760601 | 0.9057697559760601 |
+--------------------+--------------------+--------------------+

Vidíme, že všechna tři volání vedla ke stejné hodnotě.

Co se stane, když vynecháme seed hodnotu:

SELECT 
    RAND(),
    RAND(),
    RAND();

Výsledek:

+--------------------+---------------------+---------------------+
| RAND()             | RAND()              | RAND()              |
+--------------------+---------------------+---------------------+
| 0.7037061310407763 | 0.08442136466914915 | 0.31098846095706195 |
+--------------------+---------------------+---------------------+

Každé volání vrací jinou hodnotu.

Náhodné celé číslo v rozsahu

Můžeme kombinovat RAND() pomocí FLOOR() , spolu s několika výpočty, abyste vrátili náhodné celé číslo v rozsahu.

Syntaxe pro to vypadá takto:

FLOOR(min_value + RAND() * (max_value - min_value +1))

Takže bychom mohli udělat následující, abychom vrátili náhodné celé číslo mezi 1 a 10:

SELECT FLOOR(1 + RAND() * (10 - 1 +1));

Výsledek:

+---------------------------------+
| FLOOR(1 + RAND() * (10 - 1 +1)) |
+---------------------------------+
|                               6 |
+---------------------------------+

Abychom viděli náhodný efekt, nazvěme to ještě:

SELECT 
    FLOOR(1 + RAND() * (10 - 1 +1)) AS r1,
    FLOOR(1 + RAND() * (10 - 1 +1)) AS r2,
    FLOOR(1 + RAND() * (10 - 1 +1)) AS r3,
    FLOOR(1 + RAND() * (10 - 1 +1)) AS r4,
    FLOOR(1 + RAND() * (10 - 1 +1)) AS r5,
    FLOOR(1 + RAND() * (10 - 1 +1)) AS r6,
    FLOOR(1 + RAND() * (10 - 1 +1)) AS r7,
    FLOOR(1 + RAND() * (10 - 1 +1)) AS r8;

Výsledek:

+----+----+----+----+----+----+----+----+
| r1 | r2 | r3 | r4 | r5 | r6 | r7 | r8 |
+----+----+----+----+----+----+----+----+
|  3 |  6 | 10 |  4 |  6 | 10 |  1 |  6 |
+----+----+----+----+----+----+----+----+

Vracet náhodné řádky z tabulky

RAND() lze použít ve spojení s ORDER BY klauzule a LIMIT klíčové slovo pro vrácení náhodných řádků z databázové tabulky:

SELECT  
    PetId,
    PetName
FROM Pets 
ORDER BY RAND() 
LIMIT 5;

Příklad výsledku:

+-------+---------+
| PetId | PetName |
+-------+---------+
|     5 | Tweet   |
|     7 | Bark    |
|     1 | Fluffy  |
|     8 | Meow    |
|     3 | Scratch |
+-------+---------+

A když to spustím znovu, dostanu toto:

+-------+---------+
| PetId | PetName |
+-------+---------+
|     3 | Scratch |
|     8 | Meow    |
|     4 | Wag     |
|     7 | Bark    |
|     6 | Fluffy  |
+-------+---------+

A tak dále…

Mějte však na paměti, že je to poměrně intenzivní a nemělo by se používat na větších stolech. Viz Vzorkování dat:Techniky pro efektivní hledání náhodného řádku na webu MariaDB, kde najdete techniky vhodnější pro větší tabulky.

Nečíselné semeno

Zde je příklad toho, co se stane, když poskytneme nečíselnou počáteční hodnotu:

SELECT RAND('five');

Výsledek:

+---------------------+
| RAND('five')        |
+---------------------+
| 0.15522042769493574 |
+---------------------+
1 row in set, 1 warning (0.000 sec)

Podívejme se na varování:

SHOW WARNINGS;

Výsledek:

+---------+------+-------------------------------------------+
| Level   | Code | Message                                   |
+---------+------+-------------------------------------------+
| Warning | 1292 | Truncated incorrect INTEGER value: 'five' |
+---------+------+-------------------------------------------+

Také to má tendenci vracet stejný výsledek bez ohledu na to, které nečíselné semeno je použito. Například, když na to hodím různá nenumerická semínka, dostanu stejný výsledek:

SELECT 
    RAND('one'),
    RAND('two'),
    RAND('three');

Výsledek:

+---------------------+---------------------+---------------------+
| RAND('one')         | RAND('two')         | RAND('three')       |
+---------------------+---------------------+---------------------+
| 0.15522042769493574 | 0.15522042769493574 | 0.15522042769493574 |
+---------------------+---------------------+---------------------+
1 row in set, 3 warnings (0.000 sec)

Zkontrolujte varování:

SHOW WARNINGS;

Výsledek:

+---------+------+--------------------------------------------+
| Level   | Code | Message                                    |
+---------+------+--------------------------------------------+
| Warning | 1292 | Truncated incorrect INTEGER value: 'one'   |
| Warning | 1292 | Truncated incorrect INTEGER value: 'two'   |
| Warning | 1292 | Truncated incorrect INTEGER value: 'three' |
+---------+------+--------------------------------------------+

Nulové argumenty

RAND() vrátí stejnou hodnotu, když je seed null :

SELECT 
    RAND(null),
    RAND(null),
    RAND(null);

Výsledek:

+---------------------+---------------------+---------------------+
| RAND(null)          | RAND(null)          | RAND(null)          |
+---------------------+---------------------+---------------------+
| 0.15522042769493574 | 0.15522042769493574 | 0.15522042769493574 |
+---------------------+---------------------+---------------------+

Ačkoli v tomto případě neexistují žádná varování.

Příliš mnoho argumentů

Volání RAND() s příliš mnoha argumenty vede k chybě:

SELECT RAND(1, 2);

Výsledek:

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'RAND'

  1. Jak získat další hodnotu sekvence SQL Server v Entity Framework?

  2. Jak zálohovat a obnovit databázi PostgreSQL přes DBeaver

  3. MySQL – Získejte náklady na poslední dotaz pomocí ZOBRAZENÍ STAVU LIKE ‘Last_Query_Cost’

  4. Jak formátovat čísla s úvodními nulami v SQLite