sql >> Base de Datos >  >> RDS >> MariaDB

Cómo funciona RAND() en MariaDB

En MariaDB, RAND() es una función integrada que devuelve un DOUBLE aleatorio valor de punto flotante de precisión v en el rango 0 <= v < 1.0 .

Sintaxis

RAND() se puede utilizar de las dos formas siguientes:

RAND()
RAND(N)

Donde N es un entero constante que se utilizará como valor inicial.

Cuando se usa un valor semilla, RAND() produce una secuencia repetible de valores de columna.

Ejemplo

Aquí hay un ejemplo para demostrar RAND() sin especificar un valor semilla:

SELECT RAND();

Resultado:

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

Ejemplo:con una semilla

Aquí hay un ejemplo para demostrar RAND() con un valor inicial:

SELECT RAND(3);

Resultado:

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

En realidad, no podemos notar la diferencia cuando usamos el ejemplo anterior. Para ver la diferencia, necesitamos hacer múltiples llamadas a funciones usando la misma semilla.

Así:

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

Resultado:

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

Podemos ver que las tres llamadas dieron como resultado el mismo valor.

Esto es lo que sucede cuando omitimos el valor semilla:

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

Resultado:

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

Cada llamada devuelve un valor diferente.

Entero aleatorio dentro de un rango

Podemos combinar RAND() con FLOOR() , junto con algunos cálculos, para devolver un número entero aleatorio dentro de un rango.

La sintaxis para hacer esto es así:

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

Entonces, podríamos hacer lo siguiente para devolver un número entero aleatorio entre 1 y 10:

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

Resultado:

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

Llamémoslo un poco más para ver el efecto aleatorio:

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;

Resultado:

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

Devolver filas aleatorias de una tabla

RAND() se puede usar junto con un ORDER BY cláusula y el LIMIT palabra clave para devolver filas aleatorias de una tabla de base de datos:

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

Resultado de ejemplo:

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

Y si lo ejecuto de nuevo, obtengo esto:

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

Y así sucesivamente…

Aunque, tenga en cuenta que esto es bastante intensivo y no debe usarse en tablas más grandes. Consulte Muestreo de datos:Técnicas para encontrar de manera eficiente una fila aleatoria en el sitio web de MariaDB para obtener técnicas más adecuadas para tablas más grandes.

Semilla no numérica

Este es un ejemplo de lo que sucede cuando proporcionamos un valor inicial no numérico:

SELECT RAND('five');

Resultado:

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

Veamos la advertencia:

SHOW WARNINGS;

Resultado:

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

Además, esto tiende a devolver el mismo resultado, independientemente de qué semilla no numérica se use. Por ejemplo, si le tiro diferentes semillas no numéricas, obtengo el mismo resultado:

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

Resultado:

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

Revisa las advertencias:

SHOW WARNINGS;

Resultado:

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

Argumentos nulos

RAND() devuelve el mismo valor cuando la semilla es null :

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

Resultado:

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

Aunque, en este caso, no hay advertencias.

Demasiados Argumentos

Llamando a RAND() con demasiados argumentos da como resultado un error:

SELECT RAND(1, 2);

Resultado:

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