Pregunta

Como se ve por debajo de las dos consultas, nos encontramos con que ambos funcionan bien. Entonces estoy confundido por qué debemos utilizar nunca ENTRE porque he encontrado que entre el comporta de manera diferente en diferentes bases de datos que se encuentra en w3school

SELECT *
FROM employees
WHERE salary BETWEEN 5000 AND 15000;

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

Solución

BETWEEN puede ayudar a evitar la innecesaria reevaluación de la expresión:

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 es sólo una tabla ficticia con registros 1,000,000.

Por supuesto, esto se puede evitar utilizando una subconsulta, pero en MySQL es menos eficiente.

Y, por supuesto, BETWEEN es más fácil de leer. Se necesita tiempos 3 utilizarlo en una consulta que recordar la sintaxis para siempre.

En SQL Server y MySQL, LIKE contra una constante con no conduce-'%' también es una abreviatura para un par de >= y <:

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)

Sin embargo, la sintaxis LIKE es más legible.

Otros consejos

Uso ENTRE tiene méritos adicionales cuando la expresión que se compara es un cálculo complejo en lugar de sólo una columna sencilla; guarda la escritura que la expresión compleja dos veces.

Entre en T-SQL no soporta un operador, por lo que se puede utilizar como construcciones

WHERE salary not between 5000 AND 15000; 

En mi opinión, es más claro para un ser humano después

WHERE salary < 5000 OR salary > 15000;

Y finalmente, si escribe el nombre de columna sólo una vez se le da menos posibilidades de cometer un error

La versión con "entre" es más fácil de leer. Si tuviera que utilizar la segunda versión probablemente me escribo como

5000 <= salary and salary <= 15000

por la misma razón.

Yo voto @Quassnoi - corrección es una gran victoria.

Por lo general encontramos literales más útil que los símbolos de sintaxis como <, <=,>,> =,! =, Etc. Sí, necesitamos resultados (mejores y precisas). Y al menos me libro de las probabilidades de errores de interpretación y revertir significados de los símbolos visuales. Si utiliza <= y sentido lógicamente salida incorrecta procedente de su consulta de selección, puede vagar algún tiempo y sólo llegar a la conclusión de que has escrito <= en lugar de> = [visual interpretación errónea?]. Espero estar clara.

Y no estamos acortando el código (junto con lo que es más, un mayor nivel de aspecto), lo que significa más concisa y fácil de mantener?

SELECT * 
FROM emplyees 
WHERE salary between 5000 AND 15000; 



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

En primer lugar consulta utiliza sólo 10 palabras y la segunda utiliza 12!

En lo personal, yo no usaría BETWEEN, simplemente porque no parece haber ninguna definición clara de si se debe incluir o excluir, los valores que sirven para delimitar la condición, en su ejemplo dado:

SELECT *
FROM emplyees
WHERE salary between 5000 AND 15000;

El rango de podría incluir el 5000 y 15000, o podría excluirlos.

sintácticamente creo que debería excluir a ellos, ya que los propios valores son no entre los números dados. Pero mi opinión es precisamente que, mientras que el uso de los operadores como >= es muy específico. Y menos probabilidades de cambiar entre bases de datos, o entre incremements / versiones de la misma.


Editado en respuesta a los comentarios de Pavel y de Jonathan.

Como señaló Pavel, ANSI SQL ( http://www.contrib.andrew.cmu.edu/~ sombra / sql / sql1992.txt ) tan atrás como 1992, los mandatos de los puntos finales deben ser consideradas dentro de la fecha devuelta y 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".

Si los puntos finales están incluidos, a continuación, BETWEEN es la sintaxis preferida.

Menos referencias a una columna significa menos puntos para actualizar cuando las cosas cambian. Es el principio de la ingeniería, que significa menos cosas menos cosas puede romper.

También significa menos posibilidades de una persona que pone el soporte mal para cosas como que incluye un quirófano. IE:

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

... obtendrá un error si se pone el soporte en torno a la Y ENTRE parte de un comunicado. Versus:

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

... usted sólo sabe que hay un problema cuando alguien revisa los datos devueltos por la consulta.

punto de vista semántico, las dos expresiones tienen el mismo resultado.

Sin embargo, BETWEEN es un solo predicado, en lugar de dos predicados de comparación combinados con AND. Dependiendo del optimizador proporcionado por sus RDBMS, un solo predicado puede ser más fácil de optimizar que dos predicados.

Aunque espero más modernas implementaciones RDBMS debe optimizar las dos expresiones de forma idéntica.

peor si es

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

Vuelve a escribir éste con su sintaxis sin necesidad de utilizar el almacenamiento temporal.

I mejor que usar el segundo uno, ya que siempre se sabe si se trata de <= o <

En SQL, estoy de acuerdo que BETWEEN es prácticamente innecesaria, y puede ser emulado sintácticamente con 5000 <= salary AND salary <= 15000. También está limitado; A menudo me quiero aplicar un criterio inclusivo límite inferior y un límite superior exclusiva:. @start <= when AND when < @end, que no se puede hacer con BETWEEN

Otoh, ENTRE es conveniente si el valor siendo probado es el resultado de una expresión compleja.

Sería bueno si SQL y otras lenguas haría sigue el ejemplo de Python en el uso de la notación matemática correcta:. 5000 <= salary <= 15000

Una pequeña punta que Wil hacer que su código sea más legible:. Usar y> =

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top