2009-12-31 26 views
19

Al hacer una consulta MySQL sin restricciones DONDE, la mayoría de las personas usan WHERE 1 en la consulta. Sin embargo, omitir DONDE 1 no influye en la consulta. ¿Hay diferencia entre los dos? ¿Se considera que uno es la mejor práctica?Importancia de DONDE 1 en consultas MySQL

Respuesta

47

No creo que sea una cuestión de mejores prácticas, pero a veces la gente lo usa para hacer las consultas dinámicas un poco más fáciles.

string sql = "SELECT * FROM mytable WHERE 1 "; 
if (somecondition) { 
    sql += "AND somefield = somevalue "; 
} 

if (someothercondition) { 
    sql += "AND someotherfield = someothervalue "; 
} 

... etc 

Sin la WHERE 1 ahí que tendría que comprobar en cada bloque de if si necesitaba para poner en un WHERE o un AND.

+1

+1 eres más rápido que yo: P – Diadistis

+0

@Eric ¿hay una diferencia de velocidad entre 'WHERE 1' y' WHERE 1 = 1'? – fire

+0

@fire - no tengo idea, harías pruebas para averiguarlo, pero creo que cualquier optimizador decente eliminaría ambas expresiones como irrelevantes para la consulta. –

11

No es necesario. 99.9% del tiempo significa que la consulta fue construida dinámicamente y poner en WHERE 1 conduce a una lógica más simple para las cláusulas condicionales dinámicas, lo que significa que puede seguir agregando AND id = 3 al final de la consulta y no romperá la sintaxis. Si no tiene WHERE 1, tiene que preocuparse de si existe o no una cláusula WHERE y de si su condición es anterior al AND o no.

Así que es simplemente la pereza, básicamente.

+6

+1 pero no es SOLO pereza. También es más simple, más rápido y más seguro – Diadistis

+0

el principio KISS :) – Lexib0y

8

Es un caso de esquina menos para generadores de código automatizados y otros manipuladores de instrucciones SQL. Al iniciar la sección de filtrado con where 1 (o where 1 = 1), su generador de código automatizado solo puede agregar nuevos filtros con el prefijo and.

De lo contrario, tienden a terminar con un código como:

query = "select * from tbl" 
sep = " where " 
foreach clause in all_clauses: 
    query = query + sep + clause 
    sep = "and " 

que no es tan limpia como:

query = "select * from tbl where 1 = 1" 
foreach clause in all_clauses: 
    query = query + " and " + clause 

Se debe hacer muy poca diferencia en cualquier DBMS decente desde la ejecución el motor debería quitar ese tipo de cláusulas antes de que se ejecute la consulta.

Si es mejor o no, depende de si prefiere tener un código "más limpio" en los generadores de consultas o si prefiere que los DBA de la empresa intenten rastrearlo y golpearlo hasta la muerte por usarlo cláusulas tontas :-) Por supuesto, si está utilizando MySQL, puede ser DBA, por lo que puede no ser un problema.