Ich war neugierig. Was sind die Unterschiede zwischen diesen jeweiligen Anfragen:SELECT * FROM Tabellenname WHERE 1
SELECT * FROM `tablename`
SELECT * FROM `tablename` WHERE 1
SELECT * FROM `tablename` WHERE 1=1
Ich war neugierig. Was sind die Unterschiede zwischen diesen jeweiligen Anfragen:SELECT * FROM Tabellenname WHERE 1
SELECT * FROM `tablename`
SELECT * FROM `tablename` WHERE 1
SELECT * FROM `tablename` WHERE 1=1
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'
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. –
Seit 6 Jahren programmiert und nie daran gedacht - danke! – SimonGates
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
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.
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.
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.
"Erste und dritte sind Standard SQL" - sehr guter Punkt. – icc97
Dies ist eine überlegene Antwort für alles sagen, was die andere Antwort tut, aber den Unterschied, dass # 2 nicht ANSI-konform ist. –
Schön erklärt und gute Punkte hervorgehoben. –
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')
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"
'Sie haben ein bisschen zu viel Code-Formatierung ' – skrrgwasme
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. –
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.
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 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.
Ergebnis - Gibt alle Datensätze in der Tabelle statt Tabellenname für alle
SELECT * FROM tablename WHERE 1
SELECT * FROM tablename WHERE 1=1
- Überprüfen Sie diese answer
für weitere Informationen über WHERE Klauseloptimierungen überprüfen diese: MYSQL, SQLite, SQL
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
@dlatikay Sie können die Tags bearbeiten ... – Braiam
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