KQL クエリの種類

完了

前のユニットでは、KQL クエリの構造について学習しました。 ここでは、KQL クエリのさまざまな要素と種類について詳細に説明します。

このユニットでは、クエリ ステートメントと関数の概要についても説明します。 KQL では、すべてのクエリが 1 つ以上のクエリ ステートメントで構成されます。 これらのステートメントは、将来使用するために明示的に格納されない限り、使用する特定のクエリにのみ影響します。 クエリ ステートメントの最も一般的な種類は、表形式の式ステートメントlet ステートメントです。 KQL では、組み込み関数の豊富なライブラリに加えて、ユーザー定義関数を使用することもできます。これらは、格納することも、単一のクエリ用に定義することもできます。

表形式の式ステートメント

ほとんどのクエリでは、少なくとも 1 つの "表形式の式ステートメント" が使用されます。つまり、入力と出力のいずれも、テーブルまたは表形式のデータセットで構成されます。 通常、これらのステートメントには演算子が含まれており、それぞれが表形式の入力で開始され、表形式の出力を返します。

KQL には、単純な演算子 (countsortwhere など) から複雑な演算子 (parsejoinrender など) まで幅広い演算子が用意されています。

たとえば、次のクエリには、4 つの表形式の式ステートメントが含まれています。

StormEvents // tabular expression statement 1
| where EventType == "Flood" // tabular expression statement 2
| sort by DamageProperty asc // tabular expression statement 3
| take 10 // tabular expression statement 4

let ステートメント

let ステートメントでは、名前と式の間のバインディングを定義します。 let ステートメントを使用すると、長いクエリを、わかりやすい小さな名前付き部分に分割できます。

たとえば、次のクエリの let ステートメントは、スカラー値を定義するために使用されています。

let n = 10;  // number
let place = "VIRGINIA";  // string
let cutoff = ago(12345d); // datetime 
StormEvents 
| where StartTime > cutoff and State == place 
| take n

組み込み関数

組み込み関数は、KQL で定義され、ハードコーディングされた関数であるため、変更することはできません。 KQL には、使用できる関数の豊富なライブラリがあります。これについては、公式の KQL ドキュメントを参照してください。 関数は、単純な並べ替えや照合から複雑な統計関数や地理空間関数まで多岐にわたります。

たとえば、次の strcat() 関数は、文字列引数を連結します。

print str = strcat("hello", " ", "world")

ユーザー定義関数

ユーザー定義関数は、その名前が示すとおり、ユーザーによって定義されます。 ユーザー定義関数は、次の 2 つの種類に分けることができます。

  • ストアド関数: テーブルと同様に、データベース スキーマ エンティティとして格納および管理されるユーザー定義関数。 関数を格納するために使用する方法は、製品によって異なります。

    たとえば、Azure Data Explorer の次のクエリは、パラメーターを受け取る関数を格納します。

    .create function
    with (docstring = 'Demo function with parameter', folder='Demo')
     MyFunction2(myLimit: long)  {StormEvents | take myLimit}
    

    Azure Monitor や Microsoft Sentinel などの他の環境では、UI を使用してクエリを保存できます。

  • クエリ定義関数: 1 つのクエリの範囲内で定義および使用されるユーザー定義関数。 このような関数の定義は、let ステートメントを使用して行います。

    たとえば、次のクエリでは、関数 f を定義して使用します。

    let f=(a: string, b: string) {
        strcat(a, " (la la la) ", b)
    };
    print f("hello", "world")