SELECCIONE * DEL nombre de la tabla DONDE 1


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

Author: chŝdk, 2016-08-07

10 answers

2 y 3 son lo mismo en MySQL, funcionalmente 1 también es lo mismo.

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

La gente agrega where 1 o where 1 = 1 de modo que where las condiciones se pueden agregar o eliminar fácilmente a/desde una consulta agregando/comentando algunos "and..." componente.

Es decir,

SELECT * FROM `tablename` WHERE 1=1
--AND Column1 = 'Value1'
AND Column2 = 'Value2'
 174
Author: brent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-09 20:12:14

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

El optimizador de MySQL está explícitamente documentado para eliminar las condiciones constantes en la cláusula WHERE:

  • Eliminació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 serán ser compilado en exactamente 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 aconsejo que evite eso (no estoy seguro de si funciona o no en el modo SQL estricto de MySQL).

A menudo se usa la tercera cuando se construyen cláusulas dinámicas WHERE. Hace que sea fácil de añadir adicional condiciones como AND <condition> sin preocuparse por la persistencia AND s.

 72
Author: Gordon Linoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-07 11:56:41

Si estás preguntando por las diferencias en rendimiento y resultados, no hay ninguna , 2 y 3 son lo mismo WHERE TRUE , y resultarán lo mismo que el primero.

1 - SELECT * FROM table_name

Da como resultado todos los datos de table_name (sin filtro)

2 - SELECT * FROM table_name WHERE 1

1 será evaluado como TRUE, por lo tanto - sin filtro - cada registro será devuelto .

3 - SELECT * FROM table_name where 1=1

Igual que el último, 1=1 es una expresión TRUE, por lo tanto - sin filtro - cada registro será seleccionado.

 15
Author: sagi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-07 11:53:05

Todos son iguales pero 2 y 3 se utilizan para manejar fácilmente las condiciones AND/OR como:

SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')
 12
Author: Ashraf.Shk786,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-22 03:24:11

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.

 7
Author: delx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-07 11:55:24

Todos son iguales pero 2 y 3 se utilizan para crear consultas dinámicas para Y/O condiciones

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

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

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

Usted no tiene que comprobar la consulta sql para donde palabra clave como su colocado en primera o consulta inicial

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

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

Entonces

Si no hay ninguna cláusula 'where' en sqlquery entonces

sqlquery  = sqlquery + "where columna =a"

Else

sqlquery  = sqlquery + "and columna =a"
 6
Author: Jin Thakur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-10 05:13:42

Todos dan la misma respuesta. Sin embargo, la forma en que se escriben 2 y 3 es principalmente para tener el control de la declaración "Where", por lo que sería 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 de dónde le gusta en el número 3, de lo contrario, el número 1 sería lo suficientemente bueno.

 3
Author: Cedric F.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-08 20:45:26

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

  1. Seleccione * desde ' MyTable donde ID = 3 (valid)
  2. Select * from 'MyTable where 1 = 1 is same as Select * from' MyTable where 2= 2 is same as Select * from 'MyTable where 3 = 3 you get the idea (valid) is same as Select * From 'MyTable'
 2
Author: Krishneil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-11 00:42:49
  1. SELECT * FROM table_name: te dará todos los registros de la tabla con ejecución de cualquier declaración where.
  2. SELECT * FROM table_name WHERE 1 : this where condition is always es cierto, su más utilizado por hacker para entrar en cualquier sistema. Si escuchaste acerca de las inyecciones sql que 2 y 3 son escenarios que se ven obligados a construir por hacker para obtener todos los registros de la tabla.
  3. SELECT * FROM table_name where 1 = 1 : This will give you all the registros de la tabla pero comparará la declaración where y luego avanza, básicamente se agrega para agregar o eliminar más declaraciones después de eso.
 2
Author: Ghayyour Ahmed Butt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-22 05:36:07

Result - Proporciona todos los registros de la tabla especificada en lugar de tablename para las tres consultas

SELECT * FROM tablename WHERE 1 - Marque esta respuesta

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

Para obtener más información acerca de las optimizaciones de la cláusula WHERE, compruebe esto: MYSQL, SQLite, SQL

 1
Author: Keshan Nageswaran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:53:50