16

2 つのクエリの下に示されているように、どちらもうまく機能していることがわかります。次に、 w3schoolに見られるように、異なるデータベースでは BETWEEN の動作が異なることがわかったため、なぜ BETWEEN を使用する必要があるのか​​ 混乱しています。

SELECT *
FROM employees
WHERE salary BETWEEN 5000 AND 15000;

SELECT *
FROM employees
WHERE salary >= 5000
AND salary <= 15000;
4

11 に答える 11

32

BETWEEN式の不必要な再評価を避けるのに役立ちます:

SELECT  AVG(RAND(20091225) BETWEEN 0.2 AND 0.4)
FROM    t_source;

---
0.1998

SELECT  AVG(RAND(20091225) >= 0.2 AND RAND(20091225) <= 0.4)
FROM    t_source;

---
0.3199

t_source1,000,000は、レコードを含む単なるダミー テーブルです。

もちろん、これはサブクエリを使用して回避できますが、MySQL効率が低下します。

そしてもちろん、BETWEENより読みやすくなります。3クエリで使用すると、構文を永遠に覚えるのに時間がかかります。

SQL ServerとではMySQLLIKE先頭のない定数に対する は'%'、 と のペアの省略形でも>=あり<ます。

SET SHOWPLAN_TEXT ON
GO
SELECT  *
FROM    master
WHERE   name LIKE 'string%'
GO
SET SHOWPLAN_TEXT OFF
GO


|--Index Seek(OBJECT:([test].[dbo].[master].[ix_name_desc]), SEEK:([test].[dbo].[master].[name] < 'strinH' AND [test].[dbo].[master].[name] >= 'string'),  WHERE:([test].[dbo].[master].[name] like 'string%') ORDERED FORWARD)

ただし、LIKE構文はより読みやすくなっています。

于 2009-12-25T09:17:12.197 に答える
16

BETWEEN を使用すると、比較される式が単純な列ではなく複雑な計算である場合に特別なメリットがあります。複雑な式を 2 回書き出す手間が省けます。

于 2009-12-25T09:07:48.340 に答える
5

T-SQL の BETWEEN は NOT 演算子をサポートしているため、次のような構造を使用できます。

WHERE salary not between 5000 AND 15000; 

私の意見では、それは人間にとってより明確です

WHERE salary < 5000 OR salary > 15000;

最後に、列名を 1 回だけ入力すると、間違える可能性が低くなります。

于 2009-12-25T09:06:38.170 に答える
5

「間」があるバージョンの方が読みやすいです。2番目のバージョンを使用する場合、おそらく次のように記述します

5000 <= salary and salary <= 15000

同じ理由で。

于 2009-12-25T08:51:53.450 に答える
2

個人的にはBETWEEN、条件をバインドするのに役立つ値を含めるか除外するかの明確な定義がないように見えるため、私は使用しません。

SELECT *
FROM emplyees
WHERE salary between 5000 AND 15000;

範囲には 5000 と 15000 を含めること、除外することもできます。

構文的には、値自体が指定された数値の間にない ため、それらを除外する必要があると思います。しかし、私の意見はまさにそれですが、などの演算子を使用することは非常に具体的です。また、データベース間、または同じ増分/バージョン間で変更される可能性が低くなります。>=


Pavel と Jonathan のコメントに応じて編集されました。

Pavel が指摘したように、ANSI SQL (http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt ) は 1992 年までさかのぼり、返された日付内でエンドポイントを考慮する必要があり、次のものと同等である必要がありますX >= lower_bound AND X <= upper_bound

8.3

     Function

     Specify a range comparison.

     Format

     <between predicate> ::=
          <row value constructor> [ NOT ] BETWEEN
            <row value constructor> AND <row value constructor>


     Syntax Rules

     1) The three <row value constructor>s shall be of the same degree.

     2) Let respective values be values with the same ordinal position
        in the two <row value constructor>s.

     3) The data types of the respective values of the three <row value
        constructor>s shall be comparable.

     4) Let X, Y, and Z be the first, second, and third <row value con-
        structor>s, respectively.

     5) "X NOT BETWEEN Y AND Z" is equivalent to "NOT ( X BETWEEN Y AND
        Z )".

     6) "X BETWEEN Y AND Z" is equivalent to "X>=Y AND X<=Z".
于 2009-12-25T08:50:04.957 に答える
2

私は@Quassnoiに投票します-正確さは大きな勝利です。

通常、<、<=、>、>=、!= などの構文記号よりもリテラルの方が便利だと思います。はい、(より正確な) 結果が必要です。そして少なくとも、視覚的にシンボルの意味を誤解したり元に戻したりする可能性を取り除きます。<= を使用していて、select クエリからの論理的に正しくない出力を感じた場合、しばらくさまよい、>= の代わりに <= を記述したという結論に達するだけです [視覚的な誤解?]。私がはっきりしていることを願っています。

そして、コードを短くして (より高レベルに見えるようにすると共に)、より簡潔で保守しやすくしているのではないでしょうか?

SELECT * 
FROM emplyees 
WHERE salary between 5000 AND 15000; 



SELECT * 
FROM emplyees 
WHERE salary >= 5000 AND salary <= 15000; 

最初のクエリでは 10 語しか使用されず、2 番目のクエリでは 12 語が使用されます。

于 2009-12-25T09:34:06.237 に答える
1

エンドポイントが包括的である場合BETWEENは、次の構文が優先されます。

列への参照が少ないということは、物事が変化したときに更新する場所が少なくなることを意味します。モノが減れば壊れる可能性も減る、というのがエンジニアリングの原則です。

これはまた、誰かが OR を含めるなどのために間違ったブラケットを入れる可能性が少ないことを意味します。いいえ:

WHERE salary BETWEEN 5000 AND (15000
  OR ...)

...BETWEEN ステートメントの AND 部分を括弧で囲むと、エラーが発生します。対:

WHERE salary >= 5000
 AND (salary <= 15000
  OR ...)

...誰かがクエリから返されたデータを確認したときにのみ、問題があることがわかります。

于 2009-12-25T08:59:56.570 に答える
0

意味的には、2 つの式は同じ結果になります。

ただし、BETWEENは単一の述語であり、 で結合された 2 つの比較述語ではありませんAND。RDBMS が提供するオプティマイザによっては、2 つの述語よりも 1 つの述語の方が最適化が容易な場合があります。

最新の RDBMS 実装のほとんどは、2 つの式を同じように最適化する必要があると思いますが。

于 2009-12-25T09:05:39.357 に答える
0

だったらもっと悪い

  SELECT id FROM entries 
  WHERE 
     (SELECT COUNT(id) FROM anothertable WHERE something LEFT JOIN something ON...) 
     BETWEEN entries.max AND entries.min;

一時ストレージを使用せずに、構文でこれを書き直してください。

于 2010-02-01T11:50:28.207 に答える
-1

<= または <

于 2009-12-25T08:49:25.327 に答える
-1

SQL では、これBETWEENはほとんど不要であり、構文的には でエミュレートできることに同意し5000 <= salary AND salary <= 15000ます。また、制限があります。包括的な下限と排他的な上限を適用したいことがよくあります: @start <= when AND when < @end、これは ではできませんBETWEEN

OTOH, BETWEEN は、テストされる値が複雑な式の結果である場合に便利です。

SQL や他の言語が適切な数学的表記法を使用するという点で Python の先例にならうとよいでしょう5000 <= salary <= 15000

コードを読みやすくするための小さなヒント: > と >= よりも < と <= を使用してください。

于 2009-12-25T08:51:03.957 に答える