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

Как замечено ниже двух запросов, мы находим что они оба работа хорошо. Затем я смущен, почему мы должны когда-либо использовать МЕЖДУ ТЕМ, потому что я нашел, что МЕЖДУ ведет себя по-другому в различных базах данных, как найдено в w3school

SELECT *
FROM employees
WHERE salary BETWEEN 5000 AND 15000;

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

15
задан Johwhite 6 March 2015 в 09:58
поделиться

11 ответов

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

.
32
ответ дан 1 December 2019 в 00:01
поделиться

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

5000 <= salary and salary <= 15000

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

.
5
ответ дан 1 December 2019 в 00:01
поделиться
Лично я бы не стал использовать 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 >= low_bound AND X <= upper_bound:

8.3

 Function

 Укажите сравнение диапазонов.

 Формат

 <предикат между предикатами> ::=
 <строчный конструктор значений> [ NOT ] BETWEEN
 <строчный конструктор значений> И <строчный конструктор значений>


 Правила синтаксиса

 1) Три <построечных конструктора значений> должны быть одинаковой степени.

 2) Пусть соответствующие значения будут значениями с одинаковой порядковой позицией.
 в двух <строчном конструкторе значений>.

 3) Типы данных соответствующих значений из трех <строчных значений
 конструктор>ы должны быть сопоставимы.

 4) Пусть X, Y и Z будут первым, вторым и третьим <значение строки con->.
 соответственно.

 5) "X NOT BETWEEN Y AND Z" эквивалентно "NOT ( X BETWEEN Y AND
 Z )".

 6) "X BETWEEN Y AND Z" эквивалентно "X>=Y AND X<=Z".
2
ответ дан 1 December 2019 в 00:01
поделиться

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

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

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

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

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

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

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

.
1
ответ дан 1 December 2019 в 00:01
поделиться

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

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

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

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

.
-1
ответ дан 1 December 2019 в 00:01
поделиться

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

16
ответ дан 1 December 2019 в 00:01
поделиться

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

WHERE salary not between 5000 AND 15000; 

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

WHERE salary < 5000 OR salary > 15000;

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

.
5
ответ дан 1 December 2019 в 00:01
поделиться

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

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

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

SELECT * 
FROM emplyees 
WHERE salary between 5000 AND 15000; 



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

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

.
2
ответ дан 1 December 2019 в 00:01
поделиться

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

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

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

.
0
ответ дан 1 December 2019 в 00:01
поделиться

Лучше использовать 2-ю, как ты всегда знаешь, <= или <

.
-1
ответ дан 1 December 2019 в 00:01
поделиться

хуже, если это

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

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

0
ответ дан 1 December 2019 в 00:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: