気になった。これらのそれぞれのクエリの違いは何ですか?
SELECT * FROM `tablename`
SELECT * FROM `tablename` WHERE 1
SELECT * FROM `tablename` WHERE 1=1
... WHERE TRUE
か?(MySQLを含むほとんどのSQLでは)TRUEは単なる派手なマクロであることは知っています1
が、それでも読者には少しわかりやすいでしょうか?
気になった。これらのそれぞれのクエリの違いは何ですか?
SELECT * FROM `tablename`
SELECT * FROM `tablename` WHERE 1
SELECT * FROM `tablename` WHERE 1=1
... WHERE TRUE
か?(MySQLを含むほとんどのSQLでは)TRUEは単なる派手なマクロであることは知っています1
が、それでも読者には少しわかりやすいでしょうか?
回答:
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'
WHERE 1=1
場合、追加する場合、文字列に追加しようとしている条件が最初の条件であるかどうかを気にする必要はありません(そのためWHERE
、前に) か否か。
ORDER BY 1
2つ以上のSELECTステートメントの和集合を行う場合は、(列名ではなく)@dlatikay 構文が必要です。
" AND "
区切り文字として結合する方がはるかに賢明だと思います。
ご存知のように、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>
残存するAND
s を気にすることなく、条件を簡単に追加できます。
パフォーマンスと結果の違いについて質問する場合、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
式なので、フィルタはありません。すべてのレコードが選択されます。
すべて同じですが、2と3は次のAND/OR
ような条件を簡単に処理するために使用されます。
SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')
すべて同じですが、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"
MS SQL 1と3は同じですが、オプション2は機能しません。オプション2はMS SQLと同様に無効なステートメントであり、WHEREを使用していくつかの値を比較します。例えば: