sql >> Database >  >> RDS >> MariaDB

Hoe RAND() werkt in MariaDB

In MariaDB, RAND() is een ingebouwde functie die een willekeurige DOUBLE . retourneert precisie drijvende-kommawaarde v in het bereik 0 <= v < 1.0 .

Syntaxis

RAND() kan op de volgende twee manieren worden gebruikt:

RAND()
RAND(N)

Waar N is een constant geheel getal dat als startwaarde moet worden gebruikt.

Wanneer een seed-waarde wordt gebruikt, RAND() produceert een herhaalbare reeks kolomwaarden.

Voorbeeld

Hier is een voorbeeld om RAND() te demonstreren zonder een startwaarde op te geven:

SELECT RAND();

Resultaat:

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

Voorbeeld – Met een Zaadje

Hier is een voorbeeld om RAND() te demonstreren met een seed-waarde:

SELECT RAND(3);

Resultaat:

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

We kunnen het verschil niet echt zien bij het gebruik van het bovenstaande voorbeeld. Om het verschil te zien, moeten we meerdere functieaanroepen doen met dezelfde seed.

Zoals dit:

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

Resultaat:

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

We kunnen zien dat alle drie de oproepen dezelfde waarde opleverden.

Dit is wat er gebeurt als we de seed-waarde weglaten:

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

Resultaat:

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

Elke oproep retourneert een andere waarde.

Willekeurig geheel getal binnen een bereik

We kunnen RAND() . combineren met FLOOR() , samen met een paar berekeningen, om een ​​willekeurig geheel getal binnen een bereik te retourneren.

De syntaxis om dit te doen gaat als volgt:

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

We kunnen dus het volgende doen om een ​​willekeurig geheel getal tussen 1 en 10 te retourneren:

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

Resultaat:

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

Laten we het wat meer noemen om het willekeurige effect te zien:

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;

Resultaat:

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

Retourneer willekeurige rijen van een tabel

RAND() kan worden gebruikt in combinatie met een ORDER BY clausule en de LIMIT trefwoord om willekeurige rijen uit een databasetabel te retourneren:

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

Voorbeeld resultaat:

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

En als ik het opnieuw doe, krijg ik dit:

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

En zo verder...

Houd er echter rekening mee dat dit behoorlijk intensief is en niet op grotere tafels mag worden gebruikt. Zie Data Sampling:technieken voor het efficiënt vinden van een willekeurige rij op de MariaDB-website voor technieken die meer geschikt zijn voor grotere tabellen.

Niet-numeriek zaad

Hier is een voorbeeld van wat er gebeurt als we een niet-numerieke startwaarde opgeven:

SELECT RAND('five');

Resultaat:

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

Laten we eens kijken naar de waarschuwing:

SHOW WARNINGS;

Resultaat:

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

Dit heeft ook de neiging om hetzelfde resultaat te retourneren, ongeacht welke niet-numerieke seed wordt gebruikt. Als ik er bijvoorbeeld verschillende niet-numerieke zaden op gooi, krijg ik hetzelfde resultaat:

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

Resultaat:

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

Controleer de waarschuwingen:

SHOW WARNINGS;

Resultaat:

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

Nullargumenten

RAND() geeft dezelfde waarde terug als de seed null is :

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

Resultaat:

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

Hoewel er in dit geval geen waarschuwingen zijn.

Te veel argumenten

RAND() . aanroepen met te veel argumenten resulteert in een fout:

SELECT RAND(1, 2);

Resultaat:

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

  1. PG::Fout in GROUP BY-clausule

  2. 7 manieren om dubbele rijen in PostgreSQL te vinden terwijl de primaire sleutel wordt genegeerd

  3. Hoe het aantal rijen in de MySQL-tabel te krijgen met behulp van PHP?

  4. Mogelijk om de waarde van een geselecteerde kolom op te slaan en te gebruiken voor de volgende?