2016-08-07 13 views
124

Ich war neugierig. Was sind die Unterschiede zwischen diesen jeweiligen Anfragen:SELECT * FROM Tabellenname WHERE 1

  1. SELECT * FROM `tablename`

  2. SELECT * FROM `tablename` WHERE 1

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

+9

gibt es ein "zu schmal" -Flag für Tags? denn das gilt für viele, wenn nicht alle SQL-Dialekte. Ich sehe es häufig in MSSQL und Oracle. Was sind die Apostrophe? ist nicht der Backtick 'verwendet, um mysql Objektnamen zu zitieren? – dlatikay

+3

@dlatikay Sie können die Tags bearbeiten ... – Braiam

+2

hm. warum nicht einfach "... WO WAHR"? Ich bin mir bewusst, dass (in den meisten SQL, einschließlich MySQL) TRUE nur ein schickes Makro für '1' ist - aber immer noch, ist es nicht ein bisschen offensichtlicher für den Leser? – vaxquis

Antwort

172

2 und 3 sind die gleichen in MySQL, funktionell 1 ist auch die gleich.

where 1 ist kein Standard, so wie andere darauf hingewiesen haben, wird nicht in anderen Dialekten funktionieren.

Menschen hinzufügen where 1 oder where 1 = 1 so where Bedingungen zu/von einer Abfrage durch Zugabe in/out kommentiert einige „and ...“ Komponenten einfach hinzugefügt oder entfernt werden können.

heißt

SELECT * FROM `tablename` WHERE 1=1 
--AND Column1 = 'Value1' 
AND Column2 = 'Value2' 
+11

Und auch, wenn Sie programmatisch eine Abfrage in eine Zeichenfolge erstellen, um es später auszuführen, wenn Sie 'WHERE 1 = 1 'hinzufügen, müssen Sie nicht darauf achten, ob die Bedingung Sie sind versuchen, die Zeichenfolge hinzuzufügen, ist die erste (so wird es eine 'WHERE 'vor) benötigen oder nicht. –

+45

Seit 6 Jahren programmiert und nie daran gedacht - danke! – SimonGates

+2

Es mag erwähnenswert sein, dass dies sehr verschieden von "ORDER BY 1" ist, was nicht empfohlen wird und eher selten ist: Hier ist die Nummer der Index der zu sortierenden Spalte. – dlatikay

15

Wenn Sie über die Unterschiede in den Leistungen und Ergebnissen fragen, gibt es keine, 2 und 3 sind die gleichen WHERE TRUE, und sie werden die gleiche wie die erste Folge. Kein Filter - -

1 - SELECT * FROM table_name 

Ergebnisse in allen Daten von table_name (ohne Filter)

2 - SELECT * FROM table_name WHERE 1 

1 wird als TRUE daher ausgewertet werden alle Datensätze zurückgegeben.

3 - SELECT * FROM table_name where 1=1 

Gleiche wie die letzten, 1 = 1 ist ein TRUE Ausdruck, also - kein Filter - wird jeder Datensatz ausgewählt werden.

6

In 1 muss MySQL keine WHERE-Bedingungen auswerten.

In 2 und 3 ist die Where-Bedingung statisch und basiert nicht auf den Werten der Zeilen. Es wird mit boolescher Logik ausgewertet und ist immer wahr.

Funktionell gibt es keinen Unterschied. Sie sollten 1 für die Klarheit des Codes wählen.

69

Wie Sie wissen, produzieren alle drei die gleichen Ergebnisse. (In einem booleschen Kontext behandelt MySQL die ganze Zahl "1" als wahr - tatsächlich wird jede Zahl, die nicht "0" ist, als wahr behandelt).

Der MySQL-Optimierer ist ausdrücklich documented konstante Bedingungen in der WHERE Klausel zu entfernen:

  • Constant Zustand Entfernung. . .:

    (B> = ​​5 und B = 5) oder (b = 6 und 5 = 5) oder (B = 7 und 5 = 6) -> B = 5 oder B = 6

Daher werden alle drei in genau den gleichen Code kompiliert.

Sie sind alle funktionell gleichwertig und sollten die gleichen Leistungsmerkmale haben.

Das heißt, die erste und dritte sind Standard-SQL. Die zweite wird in vielen Datenbanken zu einem booleschen Ausdruck führen. Daher würde ich Ihnen raten, dies zu vermeiden (ich bin mir nicht sicher, ob es im strikten SQL-Modus von MySQL funktioniert oder nicht).

Oft wird die dritte verwendet, wenn dynamische WHERE-Klauseln konstruiert werden. Es macht es einfach, zusätzliche Bedingungen wie AND <condition> hinzuzufügen, ohne sich um das Verweilen zu kümmern AND s.

+10

"Erste und dritte sind Standard SQL" - sehr guter Punkt. – icc97

+6

Dies ist eine überlegene Antwort für alles sagen, was die andere Antwort tut, aber den Unterschied, dass # 2 nicht ANSI-konform ist. –

+0

Schön erklärt und gute Punkte hervorgehoben. –

12

alle gleich sind, aber 2 und 3 werden verwendet, um easly handhaben und/oder Bedingungen

wie

SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value') 
6

Alle sind gleich, aber 2 und 3 verwendet werden, um dynamische Abfragen zu erstellen für UND/OR Bedingungen

sqlquery =" SELECT * FROM `tablename` where 1 =1 " 

verwenden wir 2 und 3 Format dynamische Abfrage zu machen, so wissen wir schon, „wo“ Stichwort hinzugefügt wird, und wir halten das Hinzufügen von mehr Filter. Wie

sqlquery = sqlquery + "and columna =a" 
"AND columna =a " then 

nach wenigen Zeilen, wenn wir neue Filter haben wir „AND coulmnb = b“ und so weiter hinzufügen

Sie haben nicht die SQL-Abfrage für wo Schlüsselwort zu überprüfen, wie in der ersten seiner platziert oder Erstabfrage

SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value') 

Sonst können wir sqlquery = "SELECT * FROM tablename"

schreiben dann

, wenn es keine 'wo' Klausel in sqlquery ist dann

sqlquery = sqlquery + "where columna =a" 

sonst

sqlquery = sqlquery + "and columna =a" 
+4

'Sie haben ein bisschen zu viel Code-Formatierung ' – skrrgwasme

+0

4 führende Leerzeichen bezeichnen einen Codeblock. Bitte [bearbeiten] Sie Ihre Antwort, um sie richtig zu formatieren, und sehen Sie [Hilfe bearbeiten] (http://stackoverflow.com/editing-help) für die gesamte Markdown-Formatierungsbibel. –

3

Sie alle Ausgaben die gleiche Antwort. Die Art und Weise, wie 2 und 3 geschrieben werden, ist meistens, um Kontrolle über die "Wo" -Anweisung zu haben, so dass es einfacher ist, sie hinzuzufügen oder später zu entfernen.

Ich denke, dass der erste und dritte Weg der richtige Weg ist, es zu schreiben. Wenn Sie eine Where-Anweisung benötigen, die Ihnen in Nummer 3 gefällt, wäre Nummer 1 gut genug.

2

In MS SQL sind 1 und 3 gleich, Option 2 wird jedoch nicht funktionieren, Option 2 ist eine ungültige Anweisung wie in MS SQL, WHERE wird verwendet, um einige Werte zu vergleichen.Zum Beispiel:

  1. Select * from 'myTable wo ID = 3 (gültig)
  2. Select * from' myTable wobei 1 = 1, wie Select * from ‚myTable gleich ist, wobei 2 = 2 gleiche wie Select * von ‚myTable wo 3 = 3 Sie auf die Idee (gültig) ist wie Select * gleiche aus 'myTable'
2

1 - SELECT * FROM table_name es wird Ihnen alle Datensätze der Tabelle, wo jeder mit fliessendem Erklärung.

2 - AUSWÄHLEN * FROM table_name WHERE 1 Dies ist die Bedingung immer wahr, es wird meist von Hackern verwendet, um in ein beliebiges System zu gelangen. Wenn Sie von SQL-Injektionen als 2 & 3 sind Szenarien gehört, die gezwungen sind, durch Hacker zu bauen, um alle Datensätze der Tabelle zu bekommen.

3 - SELECT * FROM Tabellenname wobei 1 = 1 Dies gibt Ihnen alle Datensätze der Tabelle, aber es wird die WHERE-Anweisung und dann weitergehen, es ist im Grunde hinzugefügt hinzufügen oder entfernt mehr Anweisungen danach.

1

Ergebnis - Gibt alle Datensätze in der Tabelle statt Tabellenname für alle

SELECT * FROM tablename WHERE 1

drei Abfragen angegeben - Aktivieren Sie diese answer

SELECT * FROM tablename WHERE 1=1 - Überprüfen Sie diese answer

für weitere Informationen über WHERE Klauseloptimierungen überprüfen diese: MYSQL, SQLite, SQL

Verwandte Themen