2010-09-15 16 views
18

volte phpMyAdmin genera domande come:Che cosa significa "WHERE 1" in SQL?

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

mi chiedo se WHERE 1 ha alcun significato in una query del genere.

+4

La ragione di questo è abbastanza semplice - se si sta generando dinamicamente una stringa di query, è più facile affermare che è sempre vero di quello che è quello di avere un caso speciale che riorganizza la dichiarazione di rimuovere il 'dove' la clausola quando non c'è ne ho bisogno. – Rushyo

+2

Soprattutto in PHP, è comune costruire istruzioni SQL concatenando insieme le stringhe. Quindi presumibilmente in phpMyAdmin avevano $ sql = "SELECT * FROM' item' WHERE ". $ whereClause dove hanno definito altrove la variabile $ whereClause. Un modo (rozzo) per risolvere il problema in cui in realtà non si desidera una clausola where è utilizzare questa tecnica. –

+0

phpmyadmin utilizzerà sempre LIMIT, anche quando non ce n'è bisogno, per lo stesso motivo. –

risposta

28

Non funziona. Significa ALWAYS TRUE quindi non avrà alcun effetto di filtro sulla tua query. Il pianificatore di query probabilmente ignorerà quella clausola.

Viene in genere utilizzato quando si crea una query lato client concatenando le condizioni di filtro.

Quindi, se la query di base è memorizzato in una stringa come questo (esempio è in PHP, ma vale certamente per molte altre lingue):

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

allora si può solo concatenare un sacco di condizioni di filtraggio con una clausola AND a prescindere che sia la prima condizione che si sta utilizzando 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 suona come il generatore di query phpMyAdmin preferiscono sempre avere una clausola WHERE di una semplice rimuoverla quando non ci sono le condizioni. – FrustratedWithFormsDesigner

+2

FrustratedWithFormsDesigner - è Windows Form o Oracle Form? – flq

+0

@Frank: o WebForms. Beh, fanno tutti schifo comunque. :) – rsenna

7

WHERE 1 è un sinonimo di "vero" o "tutto".

È una scorciatoia per cui non è necessario rimuovere la clausola where dall'SQL generato.

In caso contrario, si potrebbe scrivere qualcosa del genere:

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

direi che è un artefatto stringa di concatenazione: se no, dove sono specificate le condizioni, un "1" è in uscita. In questo modo non è necessario decidere se la parola chiave WHERE debba essere emessa o meno.

Inoltre, è possibile emetterlo sempre e concatenare semplicemente le condizioni con "AND" e "OR". Non è necessario decidere che la prima condizione non debba iniziare con AND, OR parola chiave.