MariaDBでは、ROWNUM()
現在のコンテキストで受け入れられた行の現在の数を返す組み込み関数です。その主な目的は、ROWNUM
をエミュレートすることです Oracleの疑似列。
ROWNUM()
LIMIT
と同様の効果を持つ方法で使用できます 句–クエリによって返される結果の数を制限します。
Oracleモードの場合、ROWNUM
として呼び出すことができます。 (つまり、括弧なし)。
ROWNUM()
関数はMariaDB10.6.1からサポートされています。
構文
構文は次のようになります:
ROWNUM()
引数は必要ありません、または受け入れられません。
Oracleモードの場合、次のように括弧なしで呼び出すことができます。
ROWNUM
この構文を使用すると、ROWNUM
を模倣します。 Oracleの疑似列。
例
Pets
というテーブルからすべての行を返すクエリを実行してみましょう :
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets;
結果:
+----------+-------+---------+ | ROWNUM() | PetId | PetName | +----------+-------+---------+ | 1 | 1 | Fluffy | | 2 | 2 | Fetch | | 3 | 3 | Scratch | | 4 | 4 | Wag | | 5 | 5 | Tweet | | 6 | 6 | Fluffy | | 7 | 7 | Bark | | 8 | 8 | Meow | +----------+-------+---------+ 8 rows in set (0.001 sec)
8行が返されたことがわかります。
ROWNUM()
によって返される値 関数は行ごとに増加します。この場合、たまたまPetId
の値と一致します。 列ですが、これはまったくの偶然です。 PetId
列は任意の値を使用できますが、ROWNUM()
ここにあるままになります。
私が何を意味するかを説明するために、クエリを絞り込んで、返される結果を減らしましょう。
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
WHERE PetId > 4;
結果:
+----------+-------+---------+ | ROWNUM() | PetId | PetName | +----------+-------+---------+ | 1 | 5 | Tweet | | 2 | 6 | Fluffy | | 3 | 7 | Bark | | 4 | 8 | Meow | +----------+-------+---------+ 4 rows in set (0.010 sec)
返される行の制限
前述のように、ROWNUM()
LIMIT
と同様の効果を持つ方法で使用できます 句–クエリによって返される結果の数を制限します。
次に例を示します:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
WHERE ROWNUM() <= 5;
結果:
+----------+-------+---------+ | ROWNUM() | PetId | PetName | +----------+-------+---------+ | 1 | 1 | Fluffy | | 2 | 2 | Fetch | | 3 | 3 | Scratch | | 4 | 4 | Wag | | 5 | 5 | Tweet | +----------+-------+---------+ 5 rows in set (0.001 sec)
LIMIT
を使用して同じ効果を得る方法は次のとおりです。 条項:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
LIMIT 5;
結果:
+----------+-------+---------+ | ROWNUM() | PetId | PetName | +----------+-------+---------+ | 1 | 1 | Fluffy | | 2 | 2 | Fetch | | 3 | 3 | Scratch | | 4 | 4 | Wag | | 5 | 5 | Tweet | +----------+-------+---------+ 5 rows in set (0.001 sec)
LIMIT
の使用には違いがあります およびROWNUM()
返される行を制限します。
主な違いは、LIMIT
ROWNUM
の間、結果セットで機能します 受け入れられた行数で機能します(ORDER
の前) またはGROUP BY
条項)。
この違いを示す例を次に示します。
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
WHERE ROWNUM() <= 5
ORDER BY PetId Desc;
結果:
+----------+-------+---------+ | ROWNUM() | PetId | PetName | +----------+-------+---------+ | 5 | 5 | Tweet | | 4 | 4 | Wag | | 3 | 3 | Scratch | | 2 | 2 | Fetch | | 1 | 1 | Fluffy | +----------+-------+---------+ 5 rows in set (0.129 sec)
そしてここではLIMIT
を使用しています 条項:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
ORDER BY PetId Desc
LIMIT 5;
結果:
+----------+-------+---------+ | ROWNUM() | PetId | PetName | +----------+-------+---------+ | 8 | 8 | Meow | | 7 | 7 | Bark | | 6 | 6 | Fluffy | | 5 | 5 | Tweet | | 4 | 4 | Wag | +----------+-------+---------+ 5 rows in set (0.000 sec)
かっこを省略する
Oracleモードで実行している場合、括弧を省略できます。これを行うと、ROWNUM
をエミュレートできます Oracleの疑似列。
Oracleモードへの切り替えの例を次に示します。
SET SQL_MODE='ORACLE';
これで、ROWNUM
を実行できます 括弧なし:
SELECT
ROWNUM,
PetId,
PetName
FROM Pets;
結果:
+--------+-------+---------+ | ROWNUM | PetId | PetName | +--------+-------+---------+ | 1 | 1 | Fluffy | | 2 | 2 | Fetch | | 3 | 3 | Scratch | | 4 | 4 | Wag | | 5 | 5 | Tweet | | 6 | 6 | Fluffy | | 7 | 7 | Bark | | 8 | 8 | Meow | +--------+-------+---------+ 8 rows in set (0.029 sec)
これは、Oracleモードの場合にのみ使用可能であることに注意してください。 ROWNUM
を使用する Oracleモードでないときに括弧を付けないと、エラーが発生します。
実例を示すために、デフォルトモードに切り替えましょう:
SET SQL_MODE=DEFAULT;
次に、クエリを再度実行します:
SELECT
ROWNUM,
PetId,
PetName
FROM Pets;
結果:
ERROR 1054 (42S22): Unknown column 'ROWNUM' in 'field list'
最適化やその他の要因に関する考慮事項については、MariaDBのドキュメントを参照してください。