SELECCIONAR * DESDE nombre de tabla DONDE 1

129

He tenido curiosidad ¿Cuáles son las diferencias entre estas consultas respectivas?

  1. SELECT * FROM `tablename`

  2. SELECT * FROM `tablename` WHERE 1

  3. SELECT * FROM `tablename` WHERE 1=1

Stephen Alexander
fuente
9
¿hay una bandera "demasiado estrecha" para las etiquetas? porque eso se aplica a muchos, si no a todos, dialectos SQL. Lo veo con frecuencia en MSSQL y Oracle también. por cierto, ¿qué son los apóstrofes? ¿No se usa el backtick `para citar nombres de objetos mysql?
Cee McSharpface
3
@dlatikay puedes editar las etiquetas ...
Braiam
2
hm. ¿Por qué no simplemente ... WHERE TRUE? Soy consciente de que (en la mayoría de SQL, incluido MySQL) TRUE es solo una macro elegante para 1, pero aún así, ¿no es un poco más obvio para el lector?
2
2 no es válido en la mayoría de los dialectos de SQL
edc65

Respuestas:

177

2 y 3 son iguales en MySQL, funcionalmente 1 también es igual.

where 1 no es estándar, por lo que, como han señalado otros, no funcionará en otros dialectos.

Las personas agregan where 1o where 1 = 1más wherecondiciones pueden agregarse o eliminarse fácilmente a / desde una consulta agregando / comentando algunos andcomponentes " ...".

es decir

SELECT * FROM `tablename` WHERE 1=1
--AND Column1 = 'Value1'
AND Column2 = 'Value2'
brent
fuente
11
Y también cuando está construyendo programáticamente una consulta en una cadena para ejecutarla más tarde, si agrega WHERE 1=1, no tendrá que preocuparse si la condición que está tratando de agregar a la cadena es la primera (por lo que necesitará un WHEREfrente) ) o no.
Vincent Olivert Riera el
45
He estado programando durante 6 años y nunca pensé en hacer esto, ¡gracias!
SimonGates
66
Se requiere la ORDER BY 1sintaxis @dlatikay (en lugar de los nombres de columna) si está haciendo una unión de dos o más instrucciones SELECT.
Mark Stewart el
55
@SimonGates He estado programando durante 6 años y nunca pensé en hacer otra cosa jajaja
WernerCD
44
@WernerCD Creo que es mucho más sensato crear una lista de cláusulas de filtro en una lista de algún tipo, y luego unirlas con " AND "el delimitador.
Zev Spitz
76

Como saben, los tres producen los mismos resultados. (En un contexto booleano, MySQL trata el número entero "1" como verdadero; de hecho, cualquier número que no sea "0" se trata como verdadero).

El optimizador MySQL está explícitamente documentado para eliminar condiciones constantes en la WHEREcláusula:

  • Remoción de condición constante. . .:

    (B> = ​​5 Y B = 5) O (B = 6 Y 5 = 5) O (B = 7 Y 5 = 6) -> B = 5 O B = 6

Por lo tanto, los tres se compilarán exactamente en el mismo código.

Todos son funcionalmente equivalentes y deben tener las mismas características de rendimiento.

Dicho esto, el primero y el tercero son SQL estándar. El segundo causará algún tipo de error de expresión booleana en muchas bases de datos. Por lo tanto, le aconsejaría que evite eso (no estoy seguro de si funciona o no en el estricto modo SQL de MySQL).

A menudo, el tercero se usa al construir WHEREcláusulas dinámicas . Facilita la adición de condiciones adicionales, ya que AND <condition>sin preocuparse por la persistencia de ANDs.

Gordon Linoff
fuente
66
Esta es una respuesta superior para decir todo lo que hace la otra respuesta, pero señala de manera crucial la diferencia de que # 2 no cumple con ANSI.
underscore_d
16

Si está preguntando sobre las diferencias en el rendimiento y los resultados, no hay ninguno, 2 y 3 son iguales WHERE TRUE, y resultarán igual que el primero.

1 - SELECT * FROM table_name

Resultados en todos los datos de table_name(sin filtro)

2 - SELECT * FROM table_name WHERE 1

1 se evaluará como TRUE, por lo tanto, sin filtro, se devolverán todos los registros.

3 - SELECT * FROM table_name where 1=1

Igual que el último, 1 = 1 es una TRUEexpresión, por lo tanto, sin filtro, se seleccionarán todos los registros.

sagi
fuente
14

Todos son iguales, pero 2 y 3 se usan para manejar fácilmente AND/ORcondiciones como:

SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')
Ashraf.Shk786
fuente
8

En 1, MySQL no necesita evaluar ninguna condición WHERE.

En 2 y 3, la condición where es estática y no se basa en los valores de las filas. Será evaluado con lógica booleana y siempre será verdadero.

Funcionalmente, no hay diferencia. Debe elegir 1 para la claridad del código.

delx
fuente
7

Todos son iguales, pero 2 y 3 se utilizan para crear consultas dinámicas para condiciones AND / OR

sqlquery ="  SELECT * FROM `tablename` where 1 =1 "

Usamos el formato 2 y 3 para realizar consultas dinámicas, por lo que ya sabemos "dónde" se agrega la palabra clave y seguimos agregando más filtros. Me gusta

sqlquery  = sqlquery + "and columna =a"
"AND columna =a " then

después de algunas líneas, si tenemos nuevos filtros, agregamos "AND coulmnb = b" y así sucesivamente

No tiene que verificar la consulta SQL para saber dónde se encuentra la palabra clave en la primera consulta o en la consulta inicial

SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')

De lo contrario podemos escribir sqlquery = "SELECT * FROM tablename"

luego

si no hay 'dónde' cláusula de sqlquery entonces

sqlquery  = sqlquery + "where columna =a"

más

sqlquery  = sqlquery + "and columna =a"
Jin Thakur
fuente
4 espacios iniciales denotan un bloque de código. Por favor, editar su respuesta a formatear correctamente, y ver la edición de ayuda para todo el formateo de rebajas Biblia.
Mathieu Guindon
4

Todos dan la misma respuesta. Sin embargo, la forma en que se escriben 2 y 3 es principalmente para tener el control de la instrucción "Dónde" para que sea más fácil agregarla o eliminarla más tarde.

Creo que la primera y la tercera forma son la forma correcta de escribirlo. Si necesita una declaración where que le guste en el número 3, de lo contrario, el número 1 sería lo suficientemente bueno.

Cedric F.
fuente
3

En MS SQL 1 y 3 son iguales, sin embargo, la opción 2 no funcionará, la opción 2 es una declaración inválida como en MS SQL, DONDE se usa para comparar algunos valores. Por ejemplo:

  1. Seleccione * de 'myTable donde ID = 3 (válido)
  2. Seleccione * de 'myTable donde 1 = 1 es igual que Select * de' myTable donde 2 = 2 es igual que Select * de 'myTable donde 3 = 3 obtiene la idea (válida) es igual que Select * From' myTable '
Krishneil
fuente
2
  1. SELECT * FROM table_name : le dará todos los registros de la tabla con la ejecución de cualquier instrucción where.
  2. SELECCIONAR * DESDE nombre_tabla DONDE 1 : esto donde la condición siempre es verdadera, es utilizada principalmente por piratas informáticos para ingresar a cualquier sistema. Si escuchó acerca de las inyecciones sql, 2 y 3 son escenarios que el pirata informático obliga a construir para obtener todos los registros de la tabla.
  3. SELECT * FROM table_name donde 1 = 1 : Esto le dará todos los registros de la tabla, pero comparará la instrucción where y luego avanzará, básicamente se agrega para agregar o eliminar más declaraciones después de eso.
Ghayyour Ahmed Butt
fuente
1

Resultado : proporciona todos los registros de la tabla especificada en lugar del nombre de la tabla para las tres consultas

SELECT * FROM tablename WHERE 1- Comprueba esta respuesta

SELECT * FROM tablename WHERE 1=1- Comprueba esta respuesta

Para obtener más información sobre las optimizaciones de la cláusula WHERE, consulte estas: MYSQL , SQLite , SQL

Keshan Nageswaran
fuente