SELECT * FROM tablename WHERE 1

129

Byłem ciekawy. Jakie są różnice między tymi zapytaniami:

  1. SELECT * FROM `tablename`

  2. SELECT * FROM `tablename` WHERE 1

  3. SELECT * FROM `tablename` WHERE 1=1

Stephen Alexander
źródło
9
czy istnieje flaga „zbyt wąska” dla tagów? ponieważ dotyczy to wielu, jeśli nie wszystkich dialektów języka SQL. Widzę to również często w MSSQL i Oracle. przy okazji, jakie są apostrofy? czy lewy przycisk `nie jest używany do cytowania nazw obiektów mysql?
Cee McSharpface
3
@dlatikay, możesz edytować tagi ...
Braiam
2
hm. dlaczego nie po prostu ... 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?
2
2 jest nieprawidłowy w większości dialektów SQL
edc65

Odpowiedzi:

177

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 1lub where 1 = 1tak wherewarunki mogą być łatwo dodawane lub usuwane do / z zapytania poprzez dodanie / skomentowanie niektórych andkomponentów " ...".

to znaczy

SELECT * FROM `tablename` WHERE 1=1
--AND Column1 = 'Value1'
AND Column2 = 'Value2'
brent
źródło
11
A także, gdy programistycznie budujesz zapytanie w ciąg znaków, aby wykonać je później, jeśli dodasz 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 WHEREprzodu ) albo nie.
Vincent Olivert Riera
45
Programuję od 6 lat i nigdy o tym nie myślałem - dzięki!
SimonGates,
6
ORDER BY 1Składnia @dlatikay jest wymagana (zamiast nazw kolumn), jeśli tworzysz sumę dwóch lub więcej instrukcji SELECT.
Mark Stewart,
5
@SimonGates Programuję od 6 lat i nigdy nie myślałem o zrobieniu czegoś innego lol
WernerCD
4
@WernerCD Myślę, że bardziej sensowne jest utworzenie listy klauzul filtrujących na jakiejś liście, a następnie połączenie ich za pomocą łańcucha " AND "jako separatora.
Zev Spitz
76

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 WHEREklauzuli:

  • 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 WHEREklauzul. Ułatwia to dodawanie dodatkowych warunków, ponieważ AND <condition>nie trzeba martwić się o zaleganie AND.

Gordon Linoff
źródło
6
Jest to doskonała odpowiedź, jeśli chodzi o powiedzenie wszystkiego, co robi druga odpowiedź, ale przede wszystkim wskazuje na różnicę, że # 2 nie jest zgodny z ANSI.
underscore_d
16

Jeśli pytasz o różnice w osiągnięciach i wynikach, nie ma żadnych, 2 i 3 są takie same WHERE TRUEi 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 TRUEwyrażeniem, dlatego - bez filtru - każdy rekord zostanie wybrany.

sagi
źródło
14

Wszystkie są takie same, ale 2 i 3 są używane do łatwego radzenia sobie z AND/ORtakimi warunkami, jak:

SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')
Ashraf.Shk786
źródło
8

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.

delx
źródło
7

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"
Jin Thakur
źródło
4 wiodące spacje oznaczają blok kodu. Proszę edytować swoją odpowiedź, aby go sformatować poprawnie, zobacz Pomoc w edycji dla całego formatowania Markdown Biblię.
Mathieu Guindon
4

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.

Cedric F.
źródło
3

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:

  1. Wybierz * z 'myTable, gdzie ID = 3 (ważne)
  2. Wybierz * z 'myTable, gdzie 1 = 1 to to samo, co Select * from' myTable, gdzie 2 = 2 to to samo, co Select * from 'myTable, gdzie 3 = 3 otrzymasz pomysł (poprawny) to to samo, co Select * From' myTable '
Krishneil
źródło
2
  1. SELECT * FROM nazwa_tabeli : daje wszystkie rekordy tabeli z uruchomioną instrukcją where.
  2. SELECT * FROM nazwa_tabeli WHERE 1 : to, gdzie warunek jest zawsze prawdziwy, najczęściej używany przez hakera, aby dostać się do dowolnego systemu. Jeśli słyszałeś o wstrzyknięciach sql, to 2 i 3 to scenariusze, które są zmuszane do zbudowania przez hakera, aby uzyskać wszystkie rekordy tabeli.
  3. SELECT * FROM nazwa_tabeli, gdzie 1 = 1 : To da ci wszystkie rekordy tabeli, ale porówna instrukcję gdzie, a następnie przejdzie do przodu, po prostu dodaje się lub usuwa kolejne instrukcje.
Ghayyour Ahmed Butt
źródło
1

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

Keshan Nageswaran
źródło