2010-09-15 69 views
18

veces phpMyAdmin genera preguntas como:¿Qué significa "WHERE 1" en SQL?

SELECT * 
FROM `items` 
WHERE 1 
LIMIT 0 , 30 

Me pregunto si WHERE 1 tiene ningún significado en una consulta de esa manera.

+4

La razón de esto es bastante simple: si está generando dinámicamente una cadena de consulta, es más fácil decir que siempre es cierto que tener un caso especial que reorganice la instrucción para eliminar la cláusula 'WHERE' cuando no haya Necesito para eso. – Rushyo

+2

Especialmente en PHP, es común construir sentencias SQL al concatenar cadenas. Así que presumiblemente en phpMyAdmin tenían $ sql = "SELECT * FROM' item' WHERE ". $ whereClause donde definieron la variable $ whereClause en otro lugar. Una forma (cruda) de resolver el problema donde no se quiere realmente una cláusula Where es usar esta técnica. –

+0

phpmyadmin también usará siempre LIMIT, incluso cuando no lo necesite, por el mismo motivo. –

Respuesta

28

No es así. Significa ALWAYS TRUE por lo que no tendrá ningún efecto de filtrado en su consulta. El planificador de consultas probablemente ignorará esa cláusula.

Se usa generalmente cuando se genera una consulta del lado del cliente mediante la concatenación de las condiciones de filtrado.

Por lo tanto, si la consulta de base se almacena en una cadena como esta (ejemplo está en PHP, pero ciertamente se aplica a muchos otros idiomas):

$sql = "select * from foo where 1 "; 

continuación, sólo puede concatenar una gran cantidad de condiciones de filtrado con una cláusula de AND independientemente de que sea la primera condición que está utilizando o no:

// pseudo php follows... 
if ($filter_by_name) { 
    $sql = $sql . " and name = ? "; 
} 
if ($filter_by_number) { 
    $sql = $sql . " and number = ? "; 
} 
// so on, and so forth. 
+0

Hmm, parece que el generador de consultas phpMyAdmin preferiría tener siempre una cláusula WHERE que simplemente eliminarla cuando no hay condiciones. – FrustratedWithFormsDesigner

+2

FrustratedWithFormsDesigner: ¿Windows Forms u Oracle Forms? – flq

+0

@Frank: o WebForms. Bueno, todos apestan de todos modos. :) – rsenna

7

WHERE 1 es un sinónimo de "verdadero" o "todo".

Es un atajo para que no tengan que eliminar la cláusula where del SQL generado.

De lo contrario, podría escribir algo como esto:

$sql = "SELECT * FROM `errors`"; 
if ($hasWhereClause == true) { 
    $sql .= " WHERE $whereClause"; 
} 
$sql .= "LIMIT 0 , 30"; 
4

supongo que es un artefacto cadena de concatenación: si no hay donde se especifican las condiciones, un "1" es la salida. De esta forma, no tiene que decidirse si la palabra clave WHERE se debe generar o no.

También siempre puede dar salida y simplemente concatenar condiciones con "Y" y "O". No tiene que decidir que la primera condición no debe comenzar con la palabra clave AND, OR.

Cuestiones relacionadas