2020年6月3日水曜日

VS Query と順序

Query ... はい、SQL Server のステートメントに関してです。
暫くぶりに、プログラミングを弄っていて、嵌まりました。
基本中の基本。
でも、忘れていました、 記述の順序!。


専門外のプログラマーが SQL Query を発行する場合、
どうしても、見落し勝ちな事項があります。

特に、
データ取得時。

恐らく、何らかの手段で、Query を試してから、
プログラムに埋め込むでしょう。
でも、単純なサンプルデータ時と違い、
実運用では DataBase は 巨大な ばけもの に変容しているケースも多いですよね。
詳しくは、専門家対象のページをご検索戴くとして、
忘れてはならない ふたつの基本 から、
ステートメント記述順序 を書きます。

   ふたつの基本
       ORDER で表示順序を明確化
       ORDER 句 では 記述の順序も重要

ちょっと、脱線。

どうして、ORDER 句 が 必須なのか?。
単一の値を返す 集計関数等では無視出来ますが、
結果セットが複数行になる場合、ORDER 句 が無いと、
SQL Server (RDBMS) は順序未定で答えを返します。
はい。  編集や削除・追加を繰り返した生データは、内部で、順番がバラバラになっています。
最適化された実行は、環境に応じて、同じ順序に並んだ答えを返す訳では無いのですね。
試しに書いた Query が希望の順序で答えを返しても、 それは偶然かも知れないのです。
故に、SELECT で ORDER BY は 必須 と考えて下さい。.


さて、
実は表示用に書いたフロントエンドでの出来事。

試しに書いたものを叩き台に練り上げていた時の事です。
結果的には、
珍しく、ORDER BY を落として仕舞った Query をアドホック的に投げていました。
表示のみのものなので、
VS Project では .xsd を使わずに、
Query を直接投げ込んでいたのです。
当然、 条件に依っては、希望の一団は分散されて表示されます。

ORDER を加えなければ!。

そこで、何も考えずに、文末に ORDER 句 を追加 ... 。
ここで、落とし穴!。
WHERE 句 は その有無に応じて、文末に更に追加する形のプログラムにしていたので、
基本文の文末に ORDER 句が追加されると ... 。
WHERE 句 付き で、条件を絞った時に、
投げた Query が活きません。

  WHERE 句 の無い、全数表示では OK ですが、絞り込みをすると OUT !。.

当然ですね。
SERLECT ... ORDER ... WHERE ... になるので、
不正な文 になって仕舞い、答えは返りませんから。

正解は、
SERLECT ... WHERE ... ORDER ... にしないといけません!。

  基本文(末尾 ORDER 句) + WHERE 句 の2変数では無く、 
  基本文 + WHERE 句 + ORDER 句 の3変数扱いにする必要があった訳です。.

基本的に、ORDER 句 は 最後! と覚えて置くと良いでしょう。( TOP 句 が無い場合 )



以下、公式ドキュメントから抜粋引用します。

SELECT (Transact-SQL)
https://docs.microsoft.com/ja-jp/sql/t-sql/queries/select-transact-sql?view=sql-server-ver15

SQL Serverで、データベースから行を取得し、1 つ以上のテーブルから 1 つ以上の行または列を選択できるようにします。 SELECT ステートメントの完全な構文は複雑ですが、主な句は次のとおりです。

[ WITH { [ XMLNAMESPACES ,] [ <common_table_expression> ] } ]

SELECT select_list [ INTO new_table ]

[ FROM table_source ] [ WHERE search_condition ]

[ GROUP BY group_by_expression ]

[ HAVING search_condition ]

[ ORDER BY order_expression [ ASC | DESC ] ]

UNION、EXCEPT、INTERSECT 演算子をクエリ間で使用すると、クエリの結果を結合または比較して単一の結果セットにできます。

<中略>

SELECT ステートメント内の句の順序は重要です。 オプションの句は省略できます。ただし、オプションの句を使用する場合は、適切な順序で指定する必要があります。

<中略>

SELECT ステートメントの論理的な処理順序

以下のステップは、SELECT ステートメントの論理的な処理順序 (バインド順序) を示しています。 この順序によって、1 つのステップで定義されたオブジェクトが、以降のステップにおける句でいつ利用可能になるかが決まります。 たとえば、クエリ プロセッサが FROM 句で定義されているテーブルまたはビューにバインド (アクセス) できる場合、これらのオブジェクトとその列は、以降のすべてのステップで利用できます。 逆に、SELECT 句はステップ 8 にあるので、この句で定義されているすべての列の別名と派生列は、それより前の句では参照できません。 ただし、ORDER BY 句などの後続の句で参照されていることができます。 ステートメントの実際の物理的な実行は、クエリ プロセッサによって決定され、このリストでの順序とは異なる場合があります。

  1.     FROM
  2.     ON
  3.     JOIN
  4.     WHERE
  5.     GROUP BY
  6.     WITH CUBE または WITH ROLLUP
  7.     HAVING
  8.     SELECT
  9.     DISTINCT
  10.     ORDER BY
  11.     TOP

皆さん!、気を付けましょうね。  ;)



0 件のコメント:

コメントを投稿