Как замечено ниже двух запросов, мы находим что они оба работа хорошо. Затем я смущен, почему мы должны когда-либо использовать МЕЖДУ ТЕМ, потому что я нашел, что МЕЖДУ ведет себя по-другому в различных базах данных, как найдено в w3school
SELECT *
FROM employees
WHERE salary BETWEEN 5000 AND 15000;
SELECT *
FROM employees
WHERE salary >= 5000
AND salary <= 15000;
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
более разборчив.
Версия со словом "между" проще читать. Если бы я использовал вторую версию, то, вероятно, написал бы ее как
5000 <= salary and salary <= 15000
по той же причине
.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".
Если конечные точки включены, то предпочтительным синтаксисом является BETWEEN
.
Меньше ссылок на столбец означает меньше точек для обновления, когда что-то меняется. Это инженерный принцип, что меньшее количество вещей означает, что меньшее количество вещей может сломаться.
Это также означает меньшую вероятность того, что кто-то поставит неправильную скобку для таких вещей, как включение "ИЛИ". IE:
WHERE salary BETWEEN 5000 AND (15000
OR ...)
... вы получите ошибку, если поместите скобку вокруг AND части BETWEEN заявления. Против:
WHERE salary >= 5000
AND (salary <= 15000
OR ...)
... вы узнаете о проблеме только тогда, когда кто-то просмотрит данные, возвращенные из запроса.
.В SQL я согласен, что BETWEEN
в основном не нужен и может быть эмулирован синтаксически с 5000 <=Зарплата И Зарплата <= 15000
. Она также ограничена; я часто хочу применить включительно нижнюю границу и эксклюзивную верхнюю границу: @start <= when AND when < @end
, что нельзя сделать с BETWEEN
.
OTOH, BETWEEN удобно, если тестируемое значение является результатом сложного выражения.
Было бы неплохо, если бы SQL и другие языки последовали примеру Python в использовании правильной математической нотации: 5000 <= зарплата <= 15000
.
Один маленький совет, который сделает ваш код более читабельным: используйте < и <= вместо > и >=.
.Использование BETWEEN имеет дополнительные преимущества, когда сравниваемое выражение является сложным вычислением, а не простым столбцом; оно дважды экономит на записи этого сложного выражения.
BETWEEN в T-SQL не поддерживает оператор NOT, поэтому можно использовать конструкции типа
WHERE salary not between 5000 AND 15000;
На мой взгляд, для человека это более понятно, чем
WHERE salary < 5000 OR salary > 15000;
И наконец, если ввести имя столбца всего один раз, то это даст меньше шансов ошибиться
.Я голосую @Quassnoi - правильность - это большая победа.
Обычно я нахожу литералы более полезными, чем синтаксические символы типа <, <=, >, >=, != и так далее. Да, нам нужны (лучшие, точные) результаты. И, по крайней мере, я избавляюсь от вероятности неправильного истолкования и возврата значений символов визуально. Если вы используете <= и чувствуете логически некорректный вывод, исходящий из вашего запроса на выбор, вы можете побродить некоторое время и прийти к выводу, что вы написали <= вместо >= [визуальная неверная интерпретация?]. Надеюсь, я понял.
И не укорачиваем ли мы код (наряду с тем, что он выглядит более высокоуровневым), что означает более лаконичный и простой в обслуживании?
SELECT *
FROM emplyees
WHERE salary between 5000 AND 15000;
SELECT *
FROM emplyees
WHERE salary >= 5000 AND salary <= 15000;
Первый запрос использует только 10 слов, а второй - 12!
.Семанически оба выражения имеют один и тот же результат.
Однако BETWEEN
является одним предикатом, а не двумя предикатами сравнения, объединенными с И
. В зависимости от оптимизатора, предоставляемого СУБД, один предикат может быть проще оптимизировать, чем два предиката.
Хотя я ожидаю, что большинство современных реализаций СУБД должны оптимизировать два выражения одинаково.
.Лучше использовать 2-ю, как ты всегда знаешь, <= или <
.хуже, если это
SELECT id FROM entries
WHERE
(SELECT COUNT(id) FROM anothertable WHERE something LEFT JOIN something ON...)
BETWEEN entries.max AND entries.min;
Перепишите это с вашим синтаксисом без использования временного хранилища.