Di MariaDB, RAND()
adalah fungsi bawaan yang mengembalikan DOUBLE
random acak nilai floating point presisi v
dalam rentang 0 <= v < 1.0
.
Sintaks
RAND()
dapat digunakan dengan dua cara berikut:
RAND()
RAND(N)
Dimana N
adalah bilangan bulat konstan untuk digunakan sebagai nilai benih.
Saat nilai benih digunakan, RAND()
menghasilkan urutan nilai kolom yang dapat diulang.
Contoh
Berikut adalah contoh untuk mendemonstrasikan RAND()
tanpa menentukan nilai benih:
SELECT RAND();
Hasil:
+---------------------+ | RAND() | +---------------------+ | 0.14470310708945908 | +---------------------+
Contoh – Dengan Benih
Berikut adalah contoh untuk mendemonstrasikan RAND()
dengan nilai benih:
SELECT RAND(3);
Hasil:
+--------------------+ | RAND(3) | +--------------------+ | 0.9057697559760601 | +--------------------+
Kami sebenarnya tidak bisa membedakannya saat menggunakan contoh di atas. Untuk melihat perbedaannya, kita perlu membuat beberapa panggilan fungsi menggunakan seed yang sama.
Seperti ini:
SELECT
RAND(3),
RAND(3),
RAND(3);
Hasil:
+--------------------+--------------------+--------------------+ | RAND(3) | RAND(3) | RAND(3) | +--------------------+--------------------+--------------------+ | 0.9057697559760601 | 0.9057697559760601 | 0.9057697559760601 | +--------------------+--------------------+--------------------+
Kita dapat melihat bahwa ketiga panggilan menghasilkan nilai yang sama.
Inilah yang terjadi jika kita menghilangkan nilai benih:
SELECT
RAND(),
RAND(),
RAND();
Hasil:
+--------------------+---------------------+---------------------+ | RAND() | RAND() | RAND() | +--------------------+---------------------+---------------------+ | 0.7037061310407763 | 0.08442136466914915 | 0.31098846095706195 | +--------------------+---------------------+---------------------+
Setiap panggilan mengembalikan nilai yang berbeda.
Integer Acak dalam Rentang
Kita dapat menggabungkan RAND()
dengan FLOOR()
, bersama dengan beberapa perhitungan, untuk mengembalikan bilangan bulat acak dalam suatu rentang.
Sintaks untuk melakukan ini seperti ini:
FLOOR(min_value + RAND() * (max_value - min_value +1))
Jadi, kita dapat melakukan hal berikut untuk mengembalikan bilangan bulat acak antara 1 dan 10:
SELECT FLOOR(1 + RAND() * (10 - 1 +1));
Hasil:
+---------------------------------+ | FLOOR(1 + RAND() * (10 - 1 +1)) | +---------------------------------+ | 6 | +---------------------------------+
Mari kita sebut lagi untuk melihat efek acak:
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;
Hasil:
+----+----+----+----+----+----+----+----+ | r1 | r2 | r3 | r4 | r5 | r6 | r7 | r8 | +----+----+----+----+----+----+----+----+ | 3 | 6 | 10 | 4 | 6 | 10 | 1 | 6 | +----+----+----+----+----+----+----+----+
Mengembalikan Baris Acak dari Tabel
RAND()
dapat digunakan bersama dengan ORDER BY
klausa dan LIMIT
kata kunci untuk mengembalikan baris acak dari tabel database:
SELECT
PetId,
PetName
FROM Pets
ORDER BY RAND()
LIMIT 5;
Contoh hasil:
+-------+---------+ | PetId | PetName | +-------+---------+ | 5 | Tweet | | 7 | Bark | | 1 | Fluffy | | 8 | Meow | | 3 | Scratch | +-------+---------+
Dan jika saya menjalankannya lagi, saya mendapatkan ini:
+-------+---------+ | PetId | PetName | +-------+---------+ | 3 | Scratch | | 8 | Meow | | 4 | Wag | | 7 | Bark | | 6 | Fluffy | +-------+---------+
Dan seterusnya…
Meskipun, perlu diingat bahwa ini cukup intensif, dan tidak boleh digunakan pada tabel yang lebih besar. Lihat Pengambilan Sampel Data:Teknik untuk Menemukan Baris Acak Secara Efisien di situs web MariaDB untuk teknik yang lebih cocok untuk tabel yang lebih besar.
Benih Non-Numerik
Berikut adalah contoh yang terjadi saat kami memberikan nilai benih non-numerik:
SELECT RAND('five');
Hasil:
+---------------------+ | RAND('five') | +---------------------+ | 0.15522042769493574 | +---------------------+ 1 row in set, 1 warning (0.000 sec)
Mari kita lihat peringatannya:
SHOW WARNINGS;
Hasil:
+---------+------+-------------------------------------------+ | Level | Code | Message | +---------+------+-------------------------------------------+ | Warning | 1292 | Truncated incorrect INTEGER value: 'five' | +---------+------+-------------------------------------------+
Juga, ini cenderung mengembalikan hasil yang sama, terlepas dari benih non-numerik mana yang digunakan. Misalnya, jika saya melempar benih non-numerik yang berbeda, saya mendapatkan hasil yang sama:
SELECT
RAND('one'),
RAND('two'),
RAND('three');
Hasil:
+---------------------+---------------------+---------------------+ | RAND('one') | RAND('two') | RAND('three') | +---------------------+---------------------+---------------------+ | 0.15522042769493574 | 0.15522042769493574 | 0.15522042769493574 | +---------------------+---------------------+---------------------+ 1 row in set, 3 warnings (0.000 sec)
Periksa peringatannya:
SHOW WARNINGS;
Hasil:
+---------+------+--------------------------------------------+ | Level | Code | Message | +---------+------+--------------------------------------------+ | Warning | 1292 | Truncated incorrect INTEGER value: 'one' | | Warning | 1292 | Truncated incorrect INTEGER value: 'two' | | Warning | 1292 | Truncated incorrect INTEGER value: 'three' | +---------+------+--------------------------------------------+
Argumen Null
RAND()
mengembalikan nilai yang sama ketika benih null
:
SELECT
RAND(null),
RAND(null),
RAND(null);
Hasil:
+---------------------+---------------------+---------------------+ | RAND(null) | RAND(null) | RAND(null) | +---------------------+---------------------+---------------------+ | 0.15522042769493574 | 0.15522042769493574 | 0.15522042769493574 | +---------------------+---------------------+---------------------+
Meskipun, dalam hal ini, tidak ada peringatan.
Terlalu Banyak Argumen
Memanggil RAND()
dengan terlalu banyak argumen menghasilkan kesalahan:
SELECT RAND(1, 2);
Hasil:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'RAND'