MariaDB
 sql >> Baza danych >  >> RDS >> MariaDB

Jak działa RAND() w MariaDB

W MariaDB, RAND() to wbudowana funkcja, która zwraca losowo DOUBLE precyzyjna wartość zmiennoprzecinkowa v w zakresie 0 <= v < 1.0 .

Składnia

RAND() może być używany na dwa sposoby:

RAND()
RAND(N)

Gdzie N jest stałą liczbą całkowitą, która ma być używana jako wartość inicjatora.

Gdy używana jest wartość inicjatora, RAND() tworzy powtarzalną sekwencję wartości kolumn.

Przykład

Oto przykład demonstrujący RAND() bez określania wartości początkowej:

SELECT RAND();

Wynik:

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

Przykład – z nasionami

Oto przykład demonstrujący RAND() z wartość nasion:

SELECT RAND(3);

Wynik:

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

W rzeczywistości nie możemy odróżnić, korzystając z powyższego przykładu. Aby zobaczyć różnicę, musimy wykonać wiele wywołań funkcji przy użyciu tego samego ziarna.

Tak:

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

Wynik:

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

Widzimy, że wszystkie trzy wywołania dały tę samą wartość.

Oto, co się dzieje, gdy pominiemy wartość seed:

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

Wynik:

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

Każde wywołanie zwraca inną wartość.

Losowa liczba całkowita w zakresie

Możemy połączyć RAND() z FLOOR() , wraz z kilkoma obliczeniami, aby zwrócić losową liczbę całkowitą z zakresu.

Składnia do tego jest taka:

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

Możemy więc wykonać następujące czynności, aby zwrócić losową liczbę całkowitą z przedziału od 1 do 10:

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

Wynik:

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

Nazwijmy to trochę bardziej, aby zobaczyć efekt losowy:

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;

Wynik:

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

Zwróć losowe wiersze z tabeli

RAND() może być używany w połączeniu z ORDER BY klauzula i LIMIT słowo kluczowe do zwracania losowych wierszy z tabeli bazy danych:

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

Przykładowy wynik:

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

A jeśli uruchomię go ponownie, otrzymam to:

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

I tak dalej…

Pamiętaj jednak, że jest to dość intensywne i nie powinno być stosowane na większych stołach. Zobacz Próbkowanie danych:Techniki efektywnego znajdowania losowego wiersza w witrynie MariaDB, aby zapoznać się z technikami bardziej dopasowanymi do większych tabel.

Nasiona nienumeryczne

Oto przykład tego, co się dzieje, gdy dostarczamy nienumeryczną wartość inicjatora:

SELECT RAND('five');

Wynik:

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

Zobaczmy ostrzeżenie:

SHOW WARNINGS;

Wynik:

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

Ponadto ma to tendencję do zwracania tego samego wyniku, niezależnie od użytego nienumerycznego ziarna. Na przykład, jeśli rzucę na niego różne nienumeryczne nasiona, otrzymam ten sam wynik:

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

Wynik:

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

Sprawdź ostrzeżenia:

SHOW WARNINGS;

Wynik:

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

Argumenty zerowe

RAND() zwraca tę samą wartość, gdy ziarno jest null :

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

Wynik:

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

Chociaż w tym przypadku nie ma ostrzeżeń.

Zbyt wiele argumentów

Wywołanie RAND() zbyt wiele argumentów powoduje błąd:

SELECT RAND(1, 2);

Wynik:

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 7 opcji włączania potoków (||) jako operatora konkatenacji w MariaDB

  2. Serwer MariaDB 10.0.33 jest już dostępny

  3. Jak zainstalować MariaDB na CentOS 7 / RHEL 7?

  4. Jak CURTIME() działa w MariaDB

  5. Jak CHR() działa w MariaDB