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のドキュメントを参照してください。