2009-12-31 13 views
19

Podczas tworzenia zapytania MySQL bez ograniczeń WHERE większość ludzi używa WHERE 1 w zapytaniu. Pominięcie WHERE 1 nie ma wpływu na zapytanie. Czy istnieje różnica między tymi dwoma? Czy uważa się za najlepszą praktykę?Znaczenie WHERE 1 w zapytaniach MySQL

Odpowiedz

47

Nie sądzę, że jest to kwestia najlepszej praktyki, ale ludzie czasami używają go do łatwiejszego budowania dynamicznych zapytań.

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

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

... etc 

Bez WHERE 1 tam musiałbym sprawdzić w każdej if bloku czy musiałem włożyć w WHERE lub AND.

+1

+1 jesteś szybszy ode mnie: P – Diadistis

+0

@Eric Czy istnieje różnica prędkości między "WHERE 1" i "WHERE 1 = 1"? – fire

+0

@fire - nie mam pojęcia, musisz sprawdzić, aby dowiedzieć się, ale myślę, że każdy przyzwoity optymalizator wyeliminuje oba wyrażenia jako nieistotne dla zapytania. –

11

To nie jest konieczne. 99,9% czasu oznacza po prostu, że zapytanie zostało zbudowane dynamicznie, a wprowadzenie WHERE 1 prowadzi do uproszczenia logiki dynamicznych zdań warunkowych, co oznacza, że ​​można po prostu dodawać AND id = 3 na końcu zapytania i nie będzie ono łamało składni. Jeśli nie masz WHERE 1 musisz się martwić o to, czy istnieje klauzula WHERE i czy przedkładać swój stan z AND, czy też nie.

Zasadniczo to tylko lenistwo.

+6

+1 ale to wcale nie jest lenistwo. Jest także prostsza, szybsza i bezpieczniejsza – Diadistis

+0

zasada KISS :) – Lexib0y

8

Jest to jedna, mniej ważna sprawa dla automatycznych generatorów kodu i innych manipulatorów instrukcji SQL. Po uruchomieniu sekcji filtrowania za pomocą where 1 (lub where 1 = 1) twój automatyczny generator kodu może po prostu dodać nowe filtry z prefiksem and.

Inaczej masz tendencję do końca się z kodu, takich jak:

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

który nie jest tak czysty, jak:

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

Powinna ona bardzo małą różnicę żadnych godnych DBMS od egzekucji Silnik powinien rozebrać ten rodzaj klauzul przed wykonaniem zapytania.

Wybór najlepszej praktyki zależy od tego, czy wolisz mieć "czystszy" kod w generatorze zapytań, czy wolisz, aby firma DBA próbowała Cię wyśledzić i pobiła Cię na śmierć za używanie takich głupie klauzule :-) Oczywiście, jeśli używasz MySQL, możesz być DBA, więc nie może być problem.