2010-09-15 10 views
18

Czasami phpMyAdmin generuje zapytania jak:Co oznacza "WHERE 1" w SQL?

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

Zastanawiam się, czy WHERE 1 ma żadnego znaczenia w zapytaniu takiego.

+4

Powód jest dość prosty - jeśli dynamicznie generujesz ciąg zapytania, łatwiej jest stwierdzić, że jest ono zawsze prawdziwe, niż ma specjalny przypadek, który zmienia kolejność instrukcji, aby usunąć klauzulę "WHERE", gdy nie ma potrzebuję tego. – Rushyo

+2

Zwłaszcza w PHP często konstruuje się instrukcje SQL łącząc łańcuchy. Tak więc prawdopodobnie w phpMyAdmin mieli $ sql = "SELECT * FROM" item' WHERE ". $ whereClause gdzie zdefiniowano zmienną $ whereClause w innym miejscu. Jeden (prymitywny) sposób na rozwiązanie problemu, w którym nie potrzebujesz klauzuli where, aby użyć tej techniki. –

+0

phpmyadmin będzie również zawsze używać LIMIT, nawet jeśli nie jest to potrzebne, z tego samego powodu. –

Odpowiedz

28

Nie. To oznacza ALWAYS TRUE, więc nie będzie miało żadnego wpływu na filtrowanie zapytania. Narzędzie do planowania zapytań prawdopodobnie zignoruje tę klauzulę.

Jest zwykle używany podczas budowania zapytania po stronie klienta, łącząc warunki filtrowania.

Tak więc, jeśli zapytanie baza jest przechowywana w ciąg tak (przykładem jest w PHP, ale z pewnością odnosi się do wielu innych języków):

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

Następnie można po prostu złączyć wiele warunków filtrowania ze związkiem AND klauzula niezależnie od niego jako pierwszy warunek używasz czy nie:

// 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, wygląda na to, że generator zapytań phpMyAdmin będzie raczej miał klauzulę WHERE niż tylko usuwać, gdy nie ma żadnych warunków. – FrustratedWithFormsDesigner

+2

FrustratedWithFormsDesigner - czy to Windows Forms czy Oracle Forms? – flq

+0

@Frank: lub WebForms. Cóż, wszystkie ssą i tak. :) – rsenna

7

WHERE 1 jest synonimem „true” lub „wszystko”.

Jest to skrót, więc nie trzeba usuwać klauzuli where z wygenerowanego kodu SQL.

Inaczej byś napisać coś takiego:

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

Przypuszczam, że to artefakt string-konkatenacji: jeśli nie ma gdzie są określone warunki, „1” jest wyjście. W ten sposób nie trzeba decydować, czy słowo kluczowe WHERE powinno być wyprowadzane, czy nie.

Zawsze można go wypisać i po prostu połączyć warunki z "AND" i "LUB". Nie musisz decydować, że pierwszy warunek nie powinien zaczynać się słowem kluczowym AND, OR.