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'