Pergunta

Como visto abaixo das duas consultas, descobrimos que ambos funcionam bem. Então estou confuso por que deveríamos usar, porque descobri que entre se comporta de maneira diferente em diferentes bancos de dados, conforme encontrado em W3SCOOL

SELECT *
FROM employees
WHERE salary BETWEEN 5000 AND 15000;

SELECT *
FROM employees
WHERE salary >= 5000
AND salary <= 15000;
Foi útil?

Solução

BETWEEN pode ajudar a evitar reavaliação desnecessária da expressão:

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 é apenas uma mesa fictícia com 1,000,000 registros.

Claro que isso pode ser trabalhado usando uma subconsulta, mas em MySQL É menos eficiente.

E claro, BETWEEN é mais legível. Leva 3 tempos para usá -lo em uma consulta para lembrar a sintaxe para sempre.

Dentro SQL Server e MySQL, LIKE contra uma constante com não líder '%' também é uma abreviação de um par de >= e <:

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)

No entanto, LIKE A sintaxe é mais legível.

Outras dicas

O uso entre possui méritos extras quando a expressão comparada é um cálculo complexo e não apenas uma coluna simples; Economiza a redação dessa expressão complexa duas vezes.

Entre o T-SQL suporta não o operador, para que você possa usar construções como

WHERE salary not between 5000 AND 15000; 

Na minha opinião, é mais claro para um humano então

WHERE salary < 5000 OR salary > 15000;

E finalmente se você digitar o nome da coluna apenas uma vez, ele lhe dará menos chances de cometer um erro

A versão com "entre" é mais fácil de ler. Se eu usasse a segunda versão, provavelmente escrevia como

5000 <= salary and salary <= 15000

pela mesma razão.

Eu voto @quassnoi - a correção é uma grande vitória.

Normalmente, acho os literais mais úteis do que os símbolos de sintaxe como <, <=,>,> = ,! = etc. Sim, precisamos de resultados (melhores, precisos). E pelo menos me livro das probabilidades de interpretar mal e reverter significados dos símbolos visualmente. Se você usa <= e o sentido de saída logicamente incorreta proveniente da sua consulta selecionada, poderá passear algum tempo e chegar apenas à conclusão de que escreveu <= no lugar de> = [Visual Malpreation?]. Espero estar claro.

E não estamos reduzindo o código (além de torná-lo mais de nível superior), o que significa mais conciso e fácil de manter?

SELECT * 
FROM emplyees 
WHERE salary between 5000 AND 15000; 



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

A First Query usa apenas 10 palavras e o segundo usa 12!

Pessoalmente, eu não usaria BETWEEN, simplesmente porque parece não haver uma definição clara de incluir ou excluir os valores que servem para vincular a condição, em seu exemplo dado:

SELECT *
FROM emplyees
WHERE salary between 5000 AND 15000;

O alcance poderia Inclua os 5000 e 15000, ou ele poderia exclui -los.

Sintaticamente, acho que deveria excluí -los, uma vez que os próprios valores são não entre os números dados. Mas minha opinião é precisamente isso, enquanto o uso de operadores como >= é muito específico. E menos probabilidade de mudar entre bancos de dados, ou entre incrementos/versões do mesmo.


Editado Em resposta aos comentários de Pavel e Jonathan.

Como observado por Pavel, Ansi SQL (http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt) em 1992, exige os pontos finais devem ser considerados dentro da data de retorno e equivalente a 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".

Se os terminais forem inclusivos, então BETWEEN é a sintaxe preferida.

Menos referências a uma coluna significa menos pontos para atualizar quando as coisas mudam. É o princípio de engenharia, que menos coisas significam que menos coisas podem quebrar.

Isso também significa menos possibilidade de alguém colocar o suporte errado para coisas como incluir um OR. Ou seja:

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

... você receberá um erro se colocar o suporte em torno da e parte de uma declaração entre. Contra:

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

... Você só saberia que há um problema quando alguém revisa os dados retornados da consulta.

Semanticamente, as duas expressões têm o mesmo resultado.

No entanto, BETWEEN é um único predicado, em vez de dois predicados de comparação combinados com AND. Dependendo do otimizador fornecido pelo seu RDBMS, um único predicado pode ser mais fácil de otimizar do que dois predicados.

Embora eu espere as implementações mais modernas do RDBMS deve Otimize as duas expressões de forma idêntica.

pior se for

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

Reescreva este com sua sintaxe sem usar o armazenamento temporário.

É melhor eu usar o segundo, como você sempre sabe se é <= ou

Em SQL, eu concordo que BETWEEN é principalmente desnecessário e pode ser emulado sintaticamente com 5000 <= salary AND salary <= 15000. Também é limitado; Muitas vezes, quero aplicar um limite inferior inclusivo e um limite superior exclusivo: @start <= when AND when < @end, o que você não pode fazer com BETWEEN.

OTOH, entre a conveniência, se o valor que está sendo testado for o resultado de uma expressão complexa.

Seria bom se o SQL e outros idiomas seguiriam a liderança do Python no uso de notação matemática adequada: 5000 <= salary <= 15000.

Uma pequena dica que tornará seu código mais legível: use <e <= em preferência para> e> =.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top