SELECT * FROM tablename WHERE 1


129

気になった。これらのそれぞれのクエリの違いは何ですか?

  1. SELECT * FROM `tablename`

  2. SELECT * FROM `tablename` WHERE 1

  3. SELECT * FROM `tablename` WHERE 1=1


9
タグに「狭すぎる」フラグはありますか?それはすべてではないにしても、多くのSQL方言に当てはまるためです。MSSQLやOracleでも頻繁に見られます。ところでアポストロフィは何ですか?mysqlオブジェクト名を引用するためにバックティック `が使用されていませんか?
Cee McSharpface

3
@dlatikayタグを編集できます...
Braiam

2
うーん。なぜ単純ではないのです... WHERE TRUEか?(MySQLを含むほとんどのSQLでは)TRUEは単なる派手なマクロであることは知っています1が、それでも読者には少しわかりやすいでしょうか?

2
2はほとんどのSQL方言で無効です
edc65

回答:


177

MySQLでは2と3は同じですが、機能的には1も同じです。

where 1 他の方が指摘したように、標準ではないので、他の方言では動作しません。

人々は、追加where 1またはwhere 1 = 1そうwhere簡単にいくつかの「コメントアウト/に追加することで、クエリから/への追加または削除できる条件をand...」コンポーネントを。

すなわち

SELECT * FROM `tablename` WHERE 1=1
--AND Column1 = 'Value1'
AND Column2 = 'Value2'

11
また、プログラムでクエリを文字列に構築して後で実行するWHERE 1=1場合、追加する場合、文字列に追加しようとしている条件が最初の条件であるかどうかを気にする必要はありません(そのためWHERE、前に) か否か。
Vincent Olivert Riera 2016

45
6年間プログラミングをしていて、これを考えたことはありませんでした。ありがとうございます。
SimonGates

6
ORDER BY 12つ以上のSELECTステートメントの和集合を行う場合は、(列名ではなく)@dlatikay 構文が必要です。
マークスチュワート

5
@SimonGates私は6年間プログラミングをしていて、他に何もすることを考えたことはありませんlol
WernerCD

4
@WernerCDある種のリストでフィルター句のリストを作成し、それらを" AND "区切り文字として結合する方がはるかに賢明だと思います。
Zev Spitz

76

ご存知のように、3つとも同じ結果になります。(ブール値のコンテキストでは、MySQLは整数「1」をtrueとして扱います。実際、「0」以外の数値はすべてtrueとして扱われます)。

MySQLオプティマイザは、節の定数条件を削除するように明示的に文書化されていますWHERE

  • 一定の状態の除去。。。:

    (B> = 5 AND B = 5)OR(B = 6 AND 5 = 5)OR(B = 7 AND 5 = 6)-> B = 5 OR B = 6

したがって、3つすべてがまったく同じコードにコンパイルされます。

これらはすべて機能的に同等であり、同じパフォーマンス特性を持つ必要があります。

とはいえ、最初と3番目は標準SQLです。2番目は、多くのデータベースで何らかのブール式エラーを引き起こします。それで、私はあなたにそれを避けることを勧めます(MySQLの厳密なSQLモードでそれが機能するかどうかわかりません)。

多くの場合、3番目は動的WHERE句を構成するときに使用されます。AND <condition>残存するANDs を気にすることなく、条件を簡単に追加できます。


6
これは、他のすべての回答が行うすべてのことを述べる優れた回答ですが、#2がANSI準拠ではないという違いを決定的に指摘しています。
underscore_d

16

パフォーマンスと結果の違いについて質問する場合、2と3は同じWHERE TRUEではなく、最初の結果と同じになります。

1 - SELECT * FROM table_name

table_name(フィルターなし)からのすべてのデータの結果

2 - SELECT * FROM table_name WHERE 1

1はと評価されるTRUEため、フィルタは適用されず、すべてのレコードが返されます。

3 - SELECT * FROM table_name where 1=1

最後の1と同じように、1 = 1はTRUE式なので、フィルタはありません。すべてのレコードが選択されます。


14

すべて同じですが、2と3は次のAND/ORような条件を簡単に処理するために使用されます。

SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')

8

1では、MySQLはWHERE条件を評価する必要がありません。

2と3では、where条件は静的であり、行の値に基づいていません。ブール論理で評価され、常に真になります。

機能的には違いはありません。コードをわかりやすくするには、1を選択する必要があります。


7

すべて同じですが、2および3はAND / OR条件の動的クエリの作成に使用されます

sqlquery ="  SELECT * FROM `tablename` where 1 =1 "

2と3の形式を使用して動的クエリを作成しているため、「where」キーワードが追加されていることがわかっているので、さらにフィルターを追加し続けます。お気に入り

sqlquery  = sqlquery + "and columna =a"
"AND columna =a " then

数行後、新しいフィルターがある場合は、「AND coulmnb = b」などを追加します。

SQLクエリで、最初または最初のクエリに配置されたキーワードの場所を確認する必要はありません

SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')

そうでなければ、私たちは書くことができます sqlquery = "SELECT * FROM tablename"

その後

「どこ」節が存在しない場合sqlquery 、その後

sqlquery  = sqlquery + "where columna =a"

そうしないと

sqlquery  = sqlquery + "and columna =a"

先頭の4つのスペースは、コードブロックを示します。してください編集それを適切にフォーマットするあなたの答えを、そして参照ヘルプを編集全体の値下げは、聖書をフォーマットします。
Mathieu Guindon

4

それらはすべて同じ答えを出力します。ただし、2と3の記述方法は主に「Where」ステートメントを制御するためであり、後で追加または削除するのが簡単になります。

最初と3番目の方法はそれを書く適切な方法だと思います。あなたが3番で好きなwhereステートメントが必要な場合は、1番で十分です。


3

MS SQL 1と3は同じですが、オプション2は機能しません。オプション2はMS SQLと同様に無効なステートメントであり、WHEREを使用していくつかの値を比較します。例えば:

  1. 「myTable where ID = 3(valid)」から*を選択します
  2. Select * from 'myTable where 1 = 1 is Select * from' myTable where 2 = 2 is same * Select * from 'myTable where 3 = 3 you get the idea(valid)is same as Select * From' myTable '

2
  1. SELECT * FROM table_name:whereステートメントを実行すると、テーブルのすべてのレコードが表示されます。
  2. SELECT * FROM table_name WHERE 1:これは常に条件がtrueであり、ほとんどの場合、ハッカーが任意のシステムに侵入するために使用されます。2と3よりもSQLインジェクションについて聞いた場合は、テーブルのすべてのレコードを取得するためにハッカーによってビルドを強制されるシナリオです。
  3. SELECT * FROM table_name where 1 = 1:これはテーブルのすべてのレコードを提供しますが、whereステートメントを比較して次に進みます。基本的には、その後にステートメントを追加または削除するために追加されます。

1

結果 -3つのクエリすべてについて、テーブル名の代わりに指定されたテーブル内のすべてのレコードを提供します

SELECT * FROM tablename WHERE 1-この答えを確認してください

SELECT * FROM tablename WHERE 1=1-この答えを確認してください

WHERE句の最適化の詳細については、MYSQLSQLiteSQLを確認してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.