web-dev-qa-db-ja.com

SELECT * FROMテーブル名WHERE 1

私は興味がありました。これらの各クエリの違いは何ですか:

  1. SELECT * FROM `tablename`

  2. SELECT * FROM `tablename` WHERE 1

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

127

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'
176
brent

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

MySQLオプティマイザーは、明示的に documented であり、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モードで機能するかどうかはわかりません)。

動的なWHERE句を作成するときに、3番目の要素がよく使用されます。 ANDsが残ることを心配せずに、AND <condition>として追加条件を簡単に追加できます。

73
Gordon Linoff

パフォーマンスと結果の違いについて質問している場合、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の式であるため、フィルターなし-すべてのレコードが選択されます。

15
sagi

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

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

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

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

機能的には、違いはありません。コードを明確にするために1を選択する必要があります。

7
delx

すべて同じですが、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に 'where'句がない場合、

sqlquery  = sqlquery + "where columna =a"

else

sqlquery  = sqlquery + "and columna =a"
6
Jin Thakur

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

第一と第三の方法が適切な書き方だと思います。 3番で好きなwhereステートメントが必要な場合は、1番で十分でしょう。

3
Cedric F.
  1. SELECT * FROM table_name:whereステートメントを実行して、テーブルのすべてのレコードを提供します。
  2. SELECT * FROM table_name WHERE 1:これは条件が常に真であり、ハッカーがほとんどのシステムに入るために使用します。 SQLインジェクションについて聞いた場合、2および3よりも、ハッカーがテーブルのすべてのレコードを取得することを余儀なくされるシナリオです。
  3. SELECT * FROM table_name where 1 = 1:これにより、テーブルのすべてのレコードが取得されますが、whereステートメントを比較してから先に進みます。
2

MS SQL 1と3は同じですが、オプション2は機能せず、オプション2はMS SQLのように無効なステートメントです。WHEREはいくつかの値を比較するために使用されます。例えば:

  1. ID = 3(有効)の 'my​​Tableから*を選択します
  2. Select * from 'myTable where 1 = 1はSelect *と同じ* from' myTable where 2 = 2はSelectと同じ
2
Krishneil

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

SELECT * FROM tablename WHERE 1-これを確認してください answer

SELECT * FROM tablename WHERE 1=1-これを確認してください answer

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

1