Byłem ciekawy. Jakie są różnice między tymi zapytaniami:
SELECT * FROM `tablename`
SELECT * FROM `tablename` WHERE 1
SELECT * FROM `tablename` WHERE 1=1
Byłem ciekawy. Jakie są różnice między tymi zapytaniami:
SELECT * FROM `tablename`
SELECT * FROM `tablename` WHERE 1
SELECT * FROM `tablename` WHERE 1=1
... WHERE TRUE
? Zdaję sobie sprawę, że (w większości SQL, w tym MySQL) TRUE to po prostu fantazyjne makro dla 1
- ale czy nie jest to trochę bardziej oczywiste dla czytelnika?
Odpowiedzi:
2 i 3 są takie same w MySQL, funkcjonalnie 1 jest również takie samo.
where 1
nie jest standardem, więc, jak zauważyli inni, nie będzie działać w innych dialektach.
Ludzie dodają where 1
lub where 1 = 1
tak where
warunki mogą być łatwo dodawane lub usuwane do / z zapytania poprzez dodanie / skomentowanie niektórych and
komponentów " ...".
to znaczy
SELECT * FROM `tablename` WHERE 1=1
--AND Column1 = 'Value1'
AND Column2 = 'Value2'
WHERE 1=1
, nie będziesz musiał zwracać uwagi, czy warunek, który próbujesz dodać do ciągu, jest pierwszym (więc będzie wymagał z WHERE
przodu ) albo nie.
ORDER BY 1
Składnia @dlatikay jest wymagana (zamiast nazw kolumn), jeśli tworzysz sumę dwóch lub więcej instrukcji SELECT.
" AND "
jako separatora.
Jak wiesz, wszystkie trzy dają takie same wyniki. (W kontekście logicznym MySQL traktuje liczbę całkowitą „1” jako prawdę - w rzeczywistości każda liczba inna niż „0” jest traktowana jako prawda).
Optymalizator MySQL jest wyraźnie udokumentowany w celu usunięcia stałych warunków w WHERE
klauzuli:
Ciągłe usuwanie stanu. . .:
(B> = 5 AND B = 5) LUB (B = 6 I 5 = 5) LUB (B = 7 I 5 = 6) -> B = 5 LUB B = 6
W związku z tym wszystkie trzy zostaną skompilowane do dokładnie tego samego kodu.
Wszystkie są funkcjonalnie równoważne i powinny mieć te same właściwości użytkowe.
To powiedziawszy, pierwszy i trzeci to standardowy SQL. Drugi spowoduje błąd wyrażenia boolowskiego w wielu bazach danych. Radziłbym więc tego unikać (nie jestem pewien, czy działa, czy nie w ścisłym trybie SQL MySQL).
Często trzeci jest używany podczas konstruowania dynamicznych WHERE
klauzul. Ułatwia to dodawanie dodatkowych warunków, ponieważ AND <condition>
nie trzeba martwić się o zaleganie AND
.
Jeśli pytasz o różnice w osiągnięciach i wynikach, nie ma żadnych, 2 i 3 są takie same WHERE TRUE
i będą takie same jak pierwsze.
1 - SELECT * FROM table_name
Wyniki we wszystkich danych z table_name
(bez filtra)
2 - SELECT * FROM table_name WHERE 1
1 zostanie oceniony jako TRUE
, w związku z tym - bez filtru - każdy rekord zostanie zwrócony.
3 - SELECT * FROM table_name where 1=1
Tak jak poprzednio, 1 = 1 jest TRUE
wyrażeniem, dlatego - bez filtru - każdy rekord zostanie wybrany.
Wszystkie są takie same, ale 2 i 3 są używane do łatwego radzenia sobie z AND/OR
takimi warunkami, jak:
SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')
Wszystkie są takie same, ale 2 i 3 są używane do tworzenia dynamicznych zapytań dla warunków AND / OR
sqlquery =" SELECT * FROM `tablename` where 1 =1 "
używamy formatu 2 i 3 do tworzenia dynamicznych zapytań, więc wiemy już „gdzie” słowo kluczowe jest dodane i dodajemy kolejne filtry. Lubić
sqlquery = sqlquery + "and columna =a"
"AND columna =a " then
po kilku liniach, jeśli mamy nowe filtry, dodajemy „AND coulmnb = b” i tak dalej
Nie musisz sprawdzać zapytania sql pod kątem słowa kluczowego where, które zostało umieszczone w pierwszym lub początkowym zapytaniu
SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')
W przeciwnym razie możemy pisać sqlquery = "SELECT * FROM tablename"
następnie
jeśli nie ma sqlquery
wtedy klauzuli „gdzie”
sqlquery = sqlquery + "where columna =a"
jeszcze
sqlquery = sqlquery + "and columna =a"
Wszystkie wypisują tę samą odpowiedź. Jednak sposób, w jaki zapisywane są 2 i 3, polega głównie na kontrolowaniu instrukcji „Where”, aby łatwiej było ją później dodać lub usunąć.
Myślę, że pierwszy i trzeci sposób to właściwy sposób pisania. Jeśli potrzebujesz stwierdzenia gdzie podoba ci się w numerze 3, w przeciwnym razie numer 1 będzie wystarczający.
W MS SQL 1 i 3 są takie same, jednak opcja 2 nie będzie działać, opcja 2 jest niepoprawną instrukcją, tak jak w MS SQL, GDZIE służy do porównywania niektórych wartości. Na przykład:
Wynik - podaje wszystkie rekordy w określonej tabeli zamiast nazwy tabeli dla wszystkich trzech zapytań
SELECT * FROM tablename WHERE 1
- Sprawdź tę odpowiedź
SELECT * FROM tablename WHERE 1=1
- Sprawdź tę odpowiedź
Aby uzyskać więcej informacji na temat optymalizacji klauzul WHERE, sprawdź te: MYSQL , SQLite , SQL