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
sql
select-query
Stephen Alexander
źródło
źródło
... WHERE TRUE
? Zdaję sobie sprawę, że (w większości SQL, w tym MySQL) TRUE to po prostu fantazyjne makro dla1
- 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
lubwhere 1 = 1
takwhere
warunki mogą być łatwo dodawane lub usuwane do / z zapytania poprzez dodanie / skomentowanie niektórychand
komponentów " ...".to znaczy
SELECT * FROM `tablename` WHERE 1=1 --AND Column1 = 'Value1' AND Column2 = 'Value2'
źródło
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ł zWHERE
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: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 zaleganieAND
.źródło
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.źródło
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')
źródło
W 1 MySQL nie musi oceniać żadnych warunków WHERE.
W 2 i 3 warunek gdzie jest statyczny i nie jest oparty na wartościach wierszy. Zostanie on oceniony za pomocą logiki boolowskiej i zawsze będzie prawdziwy.
Funkcjonalnie nie ma różnicy. Należy wybrać 1 dla przejrzystości kodu.
źródło
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ć
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”jeszcze
źródło
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.
źródło
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:
źródło
źródło
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
źródło