SQL クエリの説明

2 つの SQL クエリのコンポーネントを説明して、出力を比較し、効率性を評価します。

モデルにクエリを直接実行して、返された結果をテストできます。その場合、Cloud コンソールでさまざまなパラメータ値を使用することも、Vertex AI API を直接呼び出すこともできます。

システム指示

経験豊富な SQL デベロッパーが、複雑な SQL クエリをジュニア アナリストのチームに説明する場合を考えてみましょう。チームがクエリの各部分の動作を理解できるように、SQL クエリをわかりやすく段階的に説明します。

自由形式のプロンプト

チームは、顧客トランザクションを分析する必要があるデータ プロジェクトに取り組んでいます。データのフィルタと比較に使用される 2 つの SQL クエリがあります。これらのクエリの仕組みを説明し、同じ出力が得られるか判断します。

クエリ 1:

SELECT * FROM
(SELECT * FROM
(SELECT * FROM (VALUES (30, 3)) AS transactions (column1, column2)
EXCEPT
SELECT * FROM (VALUES (20, 2)) AS exceptions (column1, column2) WHERE exceptions.column1 > 30)
AS filtered_transactions
EXCEPT
SELECT * FROM (VALUES (40, 4)) AS more_exceptions (column1, column2))
AS final_transactions
EXCEPT
SELECT * FROM (VALUES (50, 5)) AS last_exceptions (column1, column2) WHERE last_exceptions.column1 > 50;

クエリ 2:

SELECT * FROM
(VALUES (30, 3)) AS transactions (column1, column2)
EXCEPT
SELECT * FROM
(VALUES (40, 4)) AS exceptions (column1, column2);

手順:

  1. Query_1 の各部分の詳細な内訳を提示し、各サブクエリと句の目的と機能を説明します。
  2. Query_2 についても同様の手順を行い、各ステップを明確に説明します。
  3. 2 つのクエリを比較して、同じデータで実行した場合に同じ結果が得られるかどうかを確認します。各クエリのロジックに重点を置いて、根拠を明確に説明します。
  4. クエリの効率性や簡素性に関する考察を結びとして示し、改善案があれば提示します。

レスポンス

これらの 2 つの SQL クエリを順を追って見てみましょう。

クエリ 1 の内訳:

このクエリでは、ネストされた SELECT ステートメントと EXCEPT 集合演算子を繰り返し使用します。EXCEPT は、右側には存在しない左側のすべての行を返します。比較はすべての列に基づいて行単位で行われることを理解することが重要です。

  1. 最も内側の SELECT(レベル 1): SELECT * FROM (VALUES (30, 3)) AS transactions (column1, column2) これにより、1 つの行(30,3)を持つ transactions という名前の一時テーブルが作成されます。

  2. 2 番目の SELECT(レベル 2): これは transactions テーブルを取得し、1 行(20,2)を含む別の一時テーブル exceptionsEXCEPT を実行します。WHEREWHERE exceptions.column1 > 30 は、column1 が 30 より大きい exceptions の行を除外します。(20,2)はこの条件を満たしていないため、この EXCEPT オペレーションは実際には何も行わず、結果は引き続き(30,3)になります。結果は filtered_transactions に割り当てられます。

  3. 3 番目の SELECT(レベル 3): これは filtered_transactions(つまり、(30,3))を取得し、more_exceptions((40,4)を含む)で EXCEPT を実行します。(30,3)は more_exceptions にないため、結果は(30,3)のままです。この結果は final_transactions に割り当てられます。

  4. 一番外側の SELECT(レベル 4): 最後に、これは final_transactions(つまり、(30,3))を取得し、last_exceptions((50,5)を含む)で EXCEPT を実行します。WHEREWHERE last_exceptions.column1 > 50 によって(50,5)が除外され、空のセットが減算されます。したがって、最終的な結果は(30,3)のままです。

クエリ 2 の内訳:

このクエリははるかにシンプルです。

  1. 最初の SELECT: SELECT * FROM (VALUES (30, 3)) AS transactions (column1, column2) は、1 つの行(30,3)を持つ一時テーブル transactions を作成します。

  2. 2 番目の SELECT: これは、transactionsexceptions((40,4)を含む)の間で EXCEPT オペレーションを実行します。(30,3)は exceptions にないため、結果は(30,3)になります。

クエリの比較:

どちらのクエリでも、最終的に同じ結果(1 行(30,3))が返されます。ただし、クエリ 1 は不必要に複雑でわかりにくいものです。最終的に効果のないフィルタ条件を含む複数のネストされた SELECT ステートメントと EXCEPT オペレーションは、読み取り、理解、維持が困難になります。クエリ 2 は、同じ結果をはるかにシンプルかつ効率的に達成します。

効率性と簡素化:

クエリ 1 は非常に非効率的です。データベース エンジンが、複数のネストされたサブクエリを処理し、不要な比較を実行する必要があります。クエリ 2 ははるかに読みやすく効率的です。クエリ 1 の必要のない複雑さにより、エラーのリスクが高まり、デバッグが大幅に困難になります。

改善に向けた提案:

クエリ 1 は、クエリ 2 の簡素化と効率性に合わせて書き直す必要があります。過剰なネストや不要なフィルタリングは削除する必要があります。複数の EXCEPT オペレーションに論理的な理由がある場合は(この例の不自然な構造以外に)、慎重に確認し、可能であれば簡素化する必要があります。ほとんどの場合、オペレーションが少ない適切に構造化されたクエリは、大幅に効率的で容易に理解できます。

モデル: gemini-1.5-flash-002
温度: 0.2
最大出力トークン: 8192
トップ K 40.0
トップ P 0.95