Зачем использовать оператор МЕЖДУ, когда мы можем обойтись без него? - PullRequest
15 голосов
/ 25 декабря 2009

Как видно из двух запросов, мы находим, что они оба работают хорошо. Тогда я запутался, почему мы должны когда-либо использовать BETWEEN, потому что я обнаружил, что BETWEEN ведет себя по-разному в разных базах данных, как в w3school

SELECT *
FROM employees
WHERE salary BETWEEN 5000 AND 15000;

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

Ответы [ 11 ]

32 голосов
/ 25 декабря 2009

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_source - это просто фиктивная таблица с 1,000,000 записями.

Конечно, это можно обойти, используя подзапрос, но в MySQL это менее эффективно.

И, конечно же, BETWEEN более читабелен. Потребуется 3 раз, чтобы использовать его в запросе, чтобы запомнить синтаксис навсегда.

В SQL Server и MySQL, LIKE против константы с не ведущим '%' также является сокращением для пары >= и <:

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 более читабелен.

16 голосов
/ 25 декабря 2009

Использование BETWEEN имеет дополнительные преимущества, когда сравниваемое выражение является сложным вычислением, а не простым столбцом; это спасает от записи этого сложного выражения дважды.

5 голосов
/ 25 декабря 2009

Версия с «между» легче читать. Если бы я использовал вторую версию, я, вероятно, написал бы ее как

5000 <= salary and salary <= 15000

по той же причине.

5 голосов
/ 25 декабря 2009

МЕЖДУ в T-SQL поддерживает оператор NOT, поэтому вы можете использовать такие конструкции, как

WHERE salary not between 5000 AND 15000; 

На мой взгляд, человеку понятнее, чем

WHERE salary < 5000 OR salary > 15000;

И, наконец, если вы наберете имя столбца всего один раз, это даст вам меньше шансов ошибиться

2 голосов
/ 25 декабря 2009

Я голосую @Quassnoi - правильность - большая победа.

Обычно я нахожу литералы более полезными, чем синтаксические символы, такие как <, <=,>,> =,! = И т. Д. Да, нам нужны (лучше, точные) результаты. И, по крайней мере, я избавляюсь от вероятностей неправильного толкования и изменения значений символов визуально. Если вы используете <= и чувствуете логически неправильный вывод, полученный из вашего запроса select, вы можете некоторое время бродить и прийти к выводу, что вы написали <= вместо> = [визуальная неверная интерпретация?]. Надеюсь, я ясно.

И разве мы не сокращаем код (и не делаем его более высокоуровневым), что означает более лаконичный и простой в обслуживании?

SELECT * 
FROM emplyees 
WHERE salary between 5000 AND 15000; 



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

Первый запрос использует только 10 слов, а второй использует 12!

2 голосов
/ 25 декабря 2009

Лично я бы не стал использовать BETWEEN просто потому, что, кажется, нет четкого определения того, должно ли оно включать или исключать значения, которые служат для ограничения условия, в вашем данном примере:

SELECT *
FROM emplyees
WHERE salary between 5000 AND 15000;

Диапазон может включать 5000 и 15000 или может исключать их.

Синтаксически я думаю, что это должно исключить их, поскольку сами значения не между заданными числами. Но мое мнение именно таково, тогда как использование таких операторов, как >=, очень специфично. И менее вероятно изменение между базами данных, или между инкрементами / версиями того же самого.

<ч />

Отредактировано в ответ на комментарии Павла и Джонатана.

Как отметил Павел, 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".
1 голос
/ 25 декабря 2009

Если конечные точки включительно, то предпочтительным синтаксисом является BETWEEN.

Меньше ссылок на столбец означает меньше мест для обновления при изменении ситуации. Это инженерный принцип: меньше вещей означает, что меньше вещей могут сломаться.

Это также означает меньшую вероятность того, что кто-то поставит неправильную скобку для таких вещей, как включение ИЛИ. IE:

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

... вы получите ошибку, если поставите скобку вокруг части AND оператора BETWEEN. Против:

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

... вы могли бы знать, что есть проблема, только если кто-то просматривает данные, возвращенные из запроса.

0 голосов
/ 01 февраля 2010

хуже, если

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

Перепишите его с вашим синтаксисом без использования временного хранилища.

0 голосов
/ 25 декабря 2009

Семантически два выражения имеют одинаковый результат.

Однако BETWEEN - это один предикат, а не два предиката сравнения в сочетании с AND. В зависимости от оптимизатора, предоставляемого вашей СУБД, один предикат может быть легче оптимизировать, чем два предиката.

Хотя я ожидаю, что большинство современных реализаций СУБД должны оптимизировать два выражения одинаково.

0 голосов
/ 25 декабря 2009

В SQL я согласен, что BETWEEN в основном не нужен и может быть синтаксически эмулирован с 5000 <= salary AND salary <= 15000. Это также ограничено; Я часто хочу применить инклюзивную нижнюю границу и эксклюзивную верхнюю границу: @start <= when AND when < @end, чего нельзя сделать с BETWEEN.

OTOH, МЕЖДУ удобно, если проверяемое значение является результатом сложного выражения.

Было бы неплохо, если бы SQL и другие языки следовали примеру Python по правильной математической записи: 5000 <= salary <= 15000.

Один небольшой совет, который сделает ваш код более читабельным: используйте <и <= в предпочтении> и> =.

...