1

私はアプリケーションを開発しており、クエリの仕組みについて読んでいました。SELECT * FROM... where blah = blah を避けるべきだとどこかで読みました

何故ですか?また、ほとんどすべてを選択しようとしている場合の回避策は何ですか?

4

2 に答える 2

0

これは、「それはなぜですか?」という質問に対する直接的な回答ではありません。(必要に応じて回答に反対票を投じてください。)これは、「必要な場合の回避策は何ですか」という質問に対する回答です。

テーブル内のすべての列が必要な場合に回避する唯一の回避策SELECT *は、すべての列のリストを取得することです。そして、それは私がすでに忙しいときに私が必要としない余分な忙しさです.

Office Spaceのキャラクターである Peter Gibbons のセリフをひねりを加えると、次のようになります

MySQL では、SQLyog の右クリック メニュー オプションを使用して、すべての列を含むスケルトンの SELECT ステートメントを生成することで、作業の負担を軽減しています。

複数のテーブルを参照する SQL ステートメントの場合、すべての列参照をテーブル エイリアスで修飾する必要があるため、SQL ステートメントを使用して、すぐに使用できる列のリストを取得します。

SELECT GROUP_CONCAT(CONCAT('t.',c.column_name) 
         ORDER BY c.ordinal_position
       ) AS col_list
  FROM information_schema.columns c
 WHERE c.table_schema = 'mydatabase'
   AND c.table_name = 'mytable'

長いリストから数個だけが必要な場合は、垂直リストから簡単に取り出すことができます

SELECT CONCAT(',s.`',c.column_name,'`') AS col_names
  FROM information_schema.columns c
 WHERE c.table_schema = 'mydatabase'
   AND c.table_name = 'mytable'
 ORDER BY c.ordinal_position

列参照が修飾されている場合、バッククォートは列名の「特殊」文字 (または、大文字と小文字を区別する奇妙な設定) にのみ必要です。

そのリストから始めて、不要だとわかっている列を削っていきます。

繰り返しますが、これが「なぜ?」という質問に答えていないことをお詫びします。同様の質問への回答に示されているように、いくつかの正当な理由があります。私にとって大きな理由は、このステートメントを将来読む人が、どの列が返されているかを調べるために別の場所を探す必要がなくなるからです。もちろん、ステートメントをコピーして別の環境で実行し、リストを表示することもできます。しかし、ステートメントに変数置換、バインド変数、およびドットと二重引用符、および mysql_real_escape_string への呼び出し (mysql_ インターフェースの場合) がある場合、それは必要以上に面倒です。確かに、実行前に SQL テキストをエコーアウトするようにコードを変更することができます。しかし、コードをレビューしているだけの人は、そうする必要はありません。そして、テーブル内の列の序数の位置よりも適切な順序で、ステートメントによって返される列と式のリストを持つことで、より読みやすいコードになると思います。(列がステートメントによって返されることが重要な場合は、列名がクエリに表示されるのが妥当だと思います。)

(これは、アプリケーション コード、アプリケーションに含まれるステートメントに関するものでした。アドホック クエリや開発などのために、私は をSELECT c.*自由に使用します。しかし、ステートメントがアプリケーションに入るとき、それ*は置き換えられます。

于 2013-08-17T03:13:42.727 に答える