sql >> データベース >  >> RDS >> MariaDB

MariaDBでのRAND()のしくみ

    MariaDBでは、RAND() ランダムなDOUBLEを返す組み込み関数です 高精度浮動小数点値v 0 <= v < 1.0の範囲 。

    構文

    RAND() 次の2つの方法で使用できます。

    RAND()
    RAND(N)

    ここでN シード値として使用される定数整数です。

    シード値を使用する場合、RAND() 列値の繰り返し可能なシーケンスを生成します。

    RAND()を示す例を次に示します。 シード値を指定せずに:

    SELECT RAND();

    結果:

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

    例–シードを使用

    RAND()を示す例を次に示します。 with シード値:

    SELECT RAND(3);

    結果:

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

    上記の例を使用した場合、実際には違いがわかりません。違いを確認するには、同じシードを使用して複数の関数呼び出しを行う必要があります。

    このように:

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

    結果:

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

    3つの呼び出しすべてが同じ値になっていることがわかります。

    シード値を省略すると、次のようになります。

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

    結果:

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

    呼び出しごとに異なる値が返されます。

    範囲内のランダム整数

    RAND()を組み合わせることができます FLOOR()を使用 、いくつかの計算とともに、範囲内のランダムな整数を返します。

    これを行うための構文は次のようになります:

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

    したがって、次のようにして1〜10のランダムな整数を返すことができます。

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

    結果:

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

    ランダム効果を確認するために、もう少し呼びましょう:

    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;

    結果:

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

    テーブルからランダムな行を返す

    RAND() ORDER BYと組み合わせて使用​​できます 句とLIMIT データベーステーブルからランダムな行を返すキーワード:

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

    結果の例:

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

    そして、もう一度実行すると、次のようになります:

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

    など…

    ただし、これは非常に集中的であり、大きなテーブルでは使用しないでください。より大きなテーブルにより適した手法については、MariaDB Webサイトの「データサンプリング:ランダムな行を効率的に見つけるための手法」を参照してください。

    非数値シード

    数値以外のシード値を指定するとどうなるかの例を次に示します。

    SELECT RAND('five');

    結果:

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

    警告を見てみましょう:

    SHOW WARNINGS;

    結果:

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

    また、これは、使用されている非数値シードに関係なく、同じ結果を返す傾向があります。たとえば、異なる非数値シードをスローすると、同じ結果が得られます:

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

    結果:

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

    警告を確認してください:

    SHOW WARNINGS;

    結果:

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

    ヌル引数

    RAND() シードがnullの場合、同じ値を返します :

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

    結果:

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

    ただし、この場合、警告はありません。

    引数が多すぎます

    RAND()の呼び出し 引数が多すぎるとエラーになります:

    SELECT RAND(1, 2);

    結果:

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

    1. Node.jsとMicrosoftSQLServer

    2. OBJECTPROPERTY()を使用して、テーブルがSQLServerのシステムテーブルであるかどうかを確認します

    3. 世界をカバーする六角形のグリッドの座標を持つテーブル

    4. SQLでIFステートメントを実行する方法は?