SELECT * FROM Tabellenname WHERE 1

129

Ich war neugierig Was sind die Unterschiede zwischen diesen jeweiligen Abfragen:

  1. SELECT * FROM `tablename`

  2. SELECT * FROM `tablename` WHERE 1

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

Stephen Alexander
quelle
9
Gibt es eine "zu schmale" Flagge für Tags? denn das gilt für viele, wenn nicht alle SQL-Dialekte. Ich sehe es häufig auch in MSSQL und Oracle. Übrigens, was sind die Apostrophe? Wird nicht das Backtick verwendet, um MySQL-Objektnamen zu zitieren?
Cee McSharpface
3
@dlatikay können Sie die Tags bearbeiten ...
Braiam
2
Hm. warum nicht einfach ... WHERE TRUE? Ich bin mir bewusst, dass (in den meisten SQL-Versionen, einschließlich MySQL) TRUE nur ein ausgefallenes Makro ist 1- aber ist es für den Leser nicht ein bisschen offensichtlicher?
2
2 ist in den meisten SQL-Dialekten ungültig
edc65

Antworten:

177

2 und 3 sind in MySQL gleich, funktional ist 1 auch gleich.

where 1 ist kein Standard, funktioniert also, wie andere betont haben, nicht in anderen Dialekten.

Personen, die Bedingungen hinzufügen where 1oder where 1 = 1so hinzufügen where, können einfach zu einer Abfrage hinzugefügt oder daraus entfernt werden, indem einige " and..." - Komponenten hinzugefügt / auskommentiert werden .

dh

SELECT * FROM `tablename` WHERE 1=1
--AND Column1 = 'Value1'
AND Column2 = 'Value2'
brent
quelle
11
Und auch wenn Sie eine Abfrage programmgesteuert in eine Zeichenfolge einbauen, um sie später auszuführen, müssen Sie beim Hinzufügen WHERE 1=1nicht darauf achten, ob die Bedingung, die Sie der Zeichenfolge hinzufügen möchten, die erste ist (daher wird eine WHEREvordere erforderlich sein) ) oder nicht.
Vincent Olivert Riera
45
Ich programmiere seit 6 Jahren und habe nie daran gedacht - danke!
SimonGates
6
Die @ dlatikay- ORDER BY 1Syntax ist erforderlich (anstelle von Spaltennamen), wenn Sie zwei oder mehr SELECT-Anweisungen zusammenführen.
Mark Stewart
5
@ SimonGates Ich programmiere seit 6 Jahren und habe nie daran gedacht, etwas anderes zu tun lol
WernerCD
4
@WernerCD Ich denke, es ist weitaus sinnvoller, eine Liste von Filterklauseln in einer Liste zu erstellen und sie dann " AND "als Trennzeichen zu verbinden.
Zev Spitz
76

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

Das MySQL-Optimierungsprogramm wird explizit dokumentiert , um konstante Bedingungen in der WHEREKlausel zu entfernen :

  • Ständige Entfernung des Zustands. . .:

    (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 funktional gleichwertig und sollten die gleichen Leistungsmerkmale aufweisen.

Das heißt, das erste und dritte sind Standard-SQL. Der zweite verursacht in vielen Datenbanken einen booleschen Ausdrucksfehler. Daher würde ich Ihnen raten, dies zu vermeiden (ich bin nicht sicher, ob es im strengen SQL-Modus von MySQL funktioniert oder nicht).

Oft wird die dritte beim Erstellen dynamischer WHEREKlauseln verwendet. Es macht es einfach, zusätzliche Bedingungen hinzuzufügen, AND <condition>ohne sich Gedanken über das Verweilen zu machen AND.

Gordon Linoff
quelle
6
Dies ist eine überlegene Antwort, um alles zu sagen, was die andere Antwort tut, aber entscheidend auf den Unterschied hinzuweisen, dass # 2 nicht ANSI-konform ist.
underscore_d
16

Wenn Sie nach den Unterschieden in Leistung und Ergebnissen fragen, gibt es keine, 2 und 3 sind gleich WHERE TRUEund sie ergeben dasselbe wie die erste.

1 - SELECT * FROM table_name

Ergebnisse in allen Daten von table_name(kein Filter)

2 - SELECT * FROM table_name WHERE 1

1 wird ausgewertet TRUE, daher wird - kein Filter - jeder Datensatz zurückgegeben.

3 - SELECT * FROM table_name where 1=1

Wie beim letzten ist 1 = 1 ein TRUEAusdruck, daher wird - kein Filter - jeder Datensatz ausgewählt.

sagi
quelle
14

Alle sind gleich, aber 2 und 3 werden verwendet, um AND/ORBedingungen wie:

SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')
Ashraf.Shk786
quelle
8

In 1 muss MySQL keine WHERE-Bedingungen auswerten.

In 2 und 3 ist die where-Bedingung statisch und basiert nicht auf den Zeilenwerten. Es wird mit boolescher Logik ausgewertet und ist immer wahr.

Funktionell gibt es keinen Unterschied. Sie sollten aus Gründen der Codeklarheit 1 auswählen.

delx
quelle
7

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

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

Wir verwenden die Formate 2 und 3, um dynamische Abfragen durchzuführen, sodass wir bereits wissen, wo das Schlüsselwort "wo" hinzugefügt wird, und wir fügen weitere Filter hinzu. Mögen

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

Nach wenigen Zeilen, wenn wir neue Filter haben, fügen wir "AND coulmnb = b" hinzu und so weiter

Sie müssen die SQL-Abfrage nicht auf das Schlüsselwort where in der ersten oder ersten Abfrage überprüfen

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

Ansonsten können wir schreiben sqlquery = "SELECT * FROM tablename"

dann

Wenn es keine 'where'-Klausel gibt, sqlquery dann

sqlquery  = sqlquery + "where columna =a"

sonst

sqlquery  = sqlquery + "and columna =a"
Jin Thakur
quelle
4 führende Leerzeichen bezeichnen einen Codeblock. Bitte bearbeiten Sie Ihre Antwort, um sie richtig zu formatieren, und lesen Sie die Bearbeitungshilfe für die gesamte Markdown-Formatierungsbibel.
Mathieu Guindon
4

Sie alle geben die gleiche Antwort aus. Die Art und Weise, wie 2 und 3 geschrieben werden, dient jedoch hauptsächlich dazu, die Kontrolle über die "Where" -Anweisung zu haben, damit sie später leichter hinzugefügt oder entfernt werden kann.

Ich denke, dass der erste und dritte Weg die richtige Art sind, es zu schreiben. Wenn Sie eine where-Anweisung benötigen, die Sie in Nummer 3 mögen, wäre Nummer 1 gut genug.

Cedric F.
quelle
3

In MS SQL sind 1 und 3 identisch, Option 2 funktioniert jedoch nicht. Option 2 ist eine ungültige Anweisung wie in MS SQL. WHERE wird zum Vergleichen einiger Werte verwendet. Beispielsweise:

  1. Wählen Sie * aus 'myTable, wobei ID = 3 (gültig)
  2. Wählen Sie * aus 'myTable, wobei 1 = 1 mit Select * aus' myTable, wobei 2 = 2 mit Select * aus 'myTable, wobei 3 = 3 identisch ist. Sie erhalten die Idee (gültig), die mit Select * From' myTable 'identisch ist.
Krishneil
quelle
2
  1. SELECT * FROM Tabellenname : Hier erhalten Sie alle Datensätze der Tabelle, in denen eine beliebige where-Anweisung ausgeführt wird.
  2. SELECT * FROM table_name WHERE 1 : Hier ist die Bedingung immer wahr. Sie wird hauptsächlich von Hackern verwendet, um in ein beliebiges System zu gelangen. Wenn Sie von SQL-Injektionen gehört haben, sind 2 & 3 Szenarien, die vom Hacker erstellt werden müssen, um alle Datensätze der Tabelle abzurufen.
  3. SELECT * FROM tabellenname wobei 1 = 1 : Dies gibt Ihnen alle Datensätze der Tabelle, vergleicht jedoch die where-Anweisung und geht dann weiter. Es wird im Grunde hinzugefügt, um danach weitere Anweisungen hinzuzufügen oder zu entfernen.
Ghayyour Ahmed Butt
quelle