Wie unterscheidet sich die Verwendung von OR in einer MySQL-Anweisung mit / ohne Klammern?

9

Ich habe diese Abfrage:

%Vor%

Was nicht die richtigen Ergebnisse liefert. Das Hinzufügen von Klammern um die OR-Bedingungen funktioniert jedoch folgendermaßen:

%Vor%

Meine Frage ist, warum ist es anders? Ich verstehe, dass die OR-Anweisung anders ohne die Klammern betrachtet wird; aber ich verstehe nicht, wie es anders ist.

Ich habe keine Dokumente gefunden, die hilfreich gewesen wären. Wenn da draußen irgendwelche Links sind, würde ich es sehr zu schätzen wissen.

    
drewjoh 02.02.2011, 08:24
quelle

8 Antworten

16

Dies liegt daran, dass OR eine niedrigere Priorität Operatoren als UND. Immer wenn die DB einen Ausdruck wie

sieht %Vor%

Das AND wird zuerst ausgewertet, d. h. es ist äquivalent zu

%Vor%

Also wenn du explizit

willst %Vor%

stattdessen müssen Sie die Klammern setzen.

Dies ist übrigens nicht spezifisch für SQL. Die Rangfolge dieser Operatoren ist in allen mir bekannten Programmiersprachen (d. H. Mindestens C-, C ++ -, C # -, Java- und Unix-Shell-Skripten) gleich.

    
Péter Török 02.02.2011, 08:30
quelle
4
%Vor%

In diesem Beispiel erhalten Sie alle Datensätze, die entweder

sind

a) Die date_next_payment ist vor dem 2. Februar 2011 UND Status ist aktiv

b) Der Status ist past_due

So werden die Datensätze für die Vergangenheit nicht durch das Datum eingeschränkt.

%Vor%

In diesem Beispiel erhalten Sie alle Datensätze mit

a) Die date_next_payment ist vor dem 2. Februar 2011

AND

b) Der Status ist entweder aktiv oder past_due

Die Klammern funktionieren wie in Mathematik oder Logik - die Anweisungen in den Klammern werden zuerst ausgewertet ... stellen Sie sich also vor, dass jeder Schritt wie folgt abläuft:

%Vor%

Es wurde also ein Datensatz mit einem Status von aktiv ...

gefunden %Vor%

Dies wird dann mit der OR-Bedingung ... (TRUE OR FALSE) == TRUE

ausgewertet %Vor%

Und das Datum ist 2011-01-01

%Vor%

Und schließlich, TRUE und TRUE == TRUE

%Vor%

Und so wird der Datensatz zurückgegeben ...

Wenn Sie sich vorstellen, dass Ihre Abfrage in solchen Schritten für jede Zeile in der Datenbank ausgeführt wird, hilft es manchmal zu verstehen, wo Sie Ihre Klammern setzen müssen.

    
Fenton 02.02.2011 08:31
quelle
2

in

%Vor%

wird zuerst date_next_payment <= '2011-02-02' AND status = 'active' berücksichtigen und dann wird die boolesche Antwort ODER mit status = 'past due'

gemacht

Während in

%Vor%

Zuerst ODER wird gemacht und dann Und wird gemacht ... Das ist die Antwort

    
Bhavik Goyal 02.02.2011 08:31
quelle
2

Das MySQL-Handbuch enthält eine Seite zu Vorrang für den Betreiber . Es zeigt, dass AND eine höhere Priorität hat. So wird p1 AND p2 OR p3 als (p1 AND p2) OR p3 interpretiert. Eine Wahrheitstabelle wird Sie leicht davon überzeugen, dass dies anders ist als p1 AND (p2 OR p3) .

    
Ted Hopp 02.02.2011 08:31
quelle
1

Es ist nicht speziell in SQL, es geht um boolesche Logik. Ihre erste Aussage lautet:

a UND b ODER c

Das heißt, wenn ein c wahr ist, erhalten Sie die Zeile.

In einem AND (b OR c)

Sie erhalten nur Zeilen, in denen a wahr ist und (b oder c) wahr ist.

    
YvesR 02.02.2011 08:32
quelle
1

Sie ändern die Bedingung, wenn Sie die Klammern hinzufügen.

Im ersten Fall besteht die Ergebnismenge aus den Datensätzen, die die Bedingungen

erfüllen %Vor%

oder die Bedingung

%Vor%

Nachdem Sie die Klammern hinzugefügt haben, besteht die Ergebnismenge aus den Datensätzen, die die Bedingung

erfüllen %Vor%

und eine der Bedingungen

%Vor%

oder

%Vor%     
gsk 02.02.2011 08:33
quelle
0

Bei Ihrer ersten Suchanfrage status = 'active' ist die Bedingung false und nicht die nächste Statusspaltenbedingung ( status ).

in Ihrer zweiten Abfrage

  

Klammern () haben eine hohe Priorität

. Also ( status = 'aktiv' ODER status = 'überfällig') Bedingung zuerst auswerten.

    
Manish Trivedi 02.02.2011 08:30
quelle
0

Wenn Sie die Klammern nicht verwenden, sagen Sie tatsächlich:

%Vor%

Dies bedeutet, dass bei Status '=' überfällig 'auch dieser Datensatz angezeigt wird. ohne die anderen Bedingungen zu überschreiten.

Aber wenn Sie Klammern verwenden, benötigen Sie:

%Vor%

AND, um eine der beiden anderen Bedingungen zu bestehen.

    
Hagai L 02.02.2011 08:32
quelle

Tags und Links