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

WHERE句の論理処理順序またはSQL標準

    これはSQL標準のルールです(SQLのユーザーがおそらく考えていない詳細がたくさん含まれているため、かなり複雑です)。

    ルールの背後には2つの原則があります。 1つ目は、論理的に必要な場合(having)を除いて、標準では操作の順序が強制されないことです。 たとえば、句はgroup byの後に論理的に処理する必要があります )。これは、SQLが記述的であるという概念の基礎です。 結果が説明されている言語。特定のデータベースエンジンは、独自の実行パスを決定できます。

    2番目の原則は、あいまいさを回避することです。ここで、SQLコンパイラがいつ知っているかを定義するスコープルールが登場します。

    次のステートメントを検討してください。

    select a as b, b as a, a + 1 as d
    -----------------------^
    from t
    

    問題は、どのa a+1を実行します 列aを参照してください 表または列b (これはaとしてエイリアスされます )select 。規格によれば、これは明白です。 selectでは列のエイリアスが不明です それらが定義されている句。

    これはwhereにまで及びます 同じスコープで評価される句も同様です。同じ例を考えてみましょう:

    select a as b, b as a, a + 1 as d
    from t
    where a > 100
    

    どのa where 状態は?標準は明確です。 where 句はselectの列エイリアスを理解しません 。これは、select whereの後に(論理的に)評価されます 。だから、あなたが言うとき:

    select row_number() over (order by a) as seqnum
    from t
    where a > 100
    

    返される値は、最初のaから始まります 100.列挙は最初には行われず、フィルター処理された行はフィルター処理されたシーケンス番号を取得します。




    1. InnoDBが明らかに誤った空き領域情報を提供するのはなぜですか

    2. OracleAQでキューをクリアする方法

    3. C#からデータベースを一括挿入するための最良の方法は何ですか?

    4. 制約の名前を知らずに外部キーを削除しますか?