Зачем использовать оператор BETWEEN, когда мы можем обойтись без него?

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

SELECT *
FROM employees
WHERE salary BETWEEN 5000 AND 15000;

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

Ответы

Ответ 1

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 более разборчив.

Ответ 2

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

Ответ 3

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

5000 <= salary and salary <= 15000

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

Ответ 4

BETWEEN в T-SQL поддерживает NOT operator, поэтому вы можете использовать конструкции типа

WHERE salary not between 5000 AND 15000; 

По-моему, это более ясно для человека, тогда

WHERE salary < 5000 OR salary > 15000;

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

Ответ 5

Лично я бы не использовал 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".

Ответ 6

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

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

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

SELECT * 
FROM emplyees 
WHERE salary between 5000 AND 15000; 



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

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

Ответ 7

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

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

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

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

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

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

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

Ответ 8

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

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

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

Ответ 9

хуже, если он

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

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

Ответ 10

Я бы лучше использовал второй, так как вы всегда знаете, если оно <= или <

Ответ 11

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

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

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

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