wake-up-neo.net

SQL: BETWEEN vs <= und> =

In SQL Server 2000 und 2005:

  • was ist der Unterschied zwischen diesen beiden WHERE-Klauseln?
  • welches sollte ich für welche Szenarien verwenden?

Abfrage 1:

SELECT EventId, EventName
FROM EventMaster
WHERE EventDate BETWEEN '10/15/2009' AND '10/18/2009'

Abfrage 2:

SELECT EventId, EventName
FROM EventMaster
WHERE EventDate >='10/15/2009'
  AND EventDate <='10/18/2009'

(Bearbeiten: Das zweite Eventdate fehlte ursprünglich, daher war die Abfrage syntaktisch falsch.)

92
Shyju

Sie sind identisch: BETWEEN ist eine Abkürzung für die längere Syntax in der Frage. 

Verwenden Sie eine alternative längere Syntax, bei der BETWEEN nicht funktioniert, z.

Select EventId,EventName from EventMaster
where EventDate >= '10/15/2009' and EventDate < '10/18/2009'

(Beachten Sie < anstelle von <= in der zweiten Bedingung.)

97
Tony Andrews

Sie sind gleich.

Seien Sie vorsichtig, wenn Sie dies gegen ein DATETIME verwenden, ist das Spiel für das Enddatum der Beginn des Tages:

<= 20/10/2009

ist nicht das Gleiche wie:

<= 20/10/2009 23:59:59

(es wäre würde mit <= 20/10/2009 00:00:00.000 übereinstimmen

31
Irfy

Obwohl BETWEEN einfach zu lesen und zu warten ist, empfehle ich die Verwendung nur selten, da es sich um ein geschlossenes Intervall handelt. Wie bereits erwähnt, kann dies bei Datumsangaben ein Problem sein - auch ohne Zeitkomponenten.

Beim Umgang mit monatlichen Daten ist es häufig üblich, Datumsangaben BETWEEN first AND last zu vergleichen. In der Praxis ist dies jedoch normalerweise einfacher dt >= first AND dt < next-first zu schreiben (wodurch auch das Zeitteilproblem gelöst wird), da das Ermitteln von last normalerweise einen Schritt länger ist als das Ermitteln von next-first (durch einen Tag abziehen).

Darüber hinaus besteht ein weiteres Argument darin, dass untere und obere Grenzen in der korrekten Reihenfolge (d. H. BETWEEN low AND high) angegeben werden müssen.

12
Cade Roux

Normalerweise gibt es keinen Unterschied. Das Schlüsselwort BETWEEN wird nicht auf allen RDBMS-Plattformen unterstützt. Wenn dies jedoch der Fall ist, sollten die beiden Abfragen identisch sein.

Da sie identisch sind, gibt es wirklich keinen Unterschied in Bezug auf Geschwindigkeit oder etwas anderes - verwenden Sie den, der Ihnen natürlicher erscheint.

4
marc_s

Wie von @ marc_s erwähnt, haben @Cloud et al. Sie sind im Grunde die gleichen für einen geschlossenen Bereich.

Bruchwerte Zeitwerte können jedoch Probleme mit einem geschlossenen Bereich (größer oder gleich und weniger oder gleich ) im Gegensatz zu einem halboffenen Bereich (größer oder gleich und weniger als -) verursachen. /) mit einem Endwert nach dem letzten möglichen Zeitpunkt.

Um zu vermeiden, dass die Abfrage wie folgt umgeschrieben wird:

SELECT EventId, EventName
  FROM EventMaster
 WHERE (EventDate >= '2009-10-15' AND
        EventDate <  '2009-10-19')    /* <<<== 19th, not 18th */

Da BETWEEN nicht für halboffene Intervalle funktioniert, schaue ich mir jede DatumsZeitabfrage, die sie verwendet, genau an, da dies wahrscheinlich ein Fehler ist.

4
devstuff

Ich denke, der einzige Unterschied ist die Menge an syntaktischem Zucker bei jeder Abfrage. BETWEEN ist nur eine kniffelige Art zu sagen, genau wie bei der zweiten Abfrage.

Es mag einige Unterschiede im RDBMS geben, die mir nicht bewusst sind, aber ich glaube nicht wirklich.

3
pyrocumulus

Ich habe eine leichte Vorliebe für BETWEEN, weil dem Leser sofort klar wird, dass Sie ein Feld für einen Bereich markieren. Dies gilt insbesondere, wenn Sie ähnliche Feldnamen in Ihrer Tabelle haben.

Wenn unsere Tabelle beispielsweise eine transactiondate und eine transitiondate hat, wenn ich lese

transactiondate between ...

Ich weiß sofort, dass beide Enden des Tests gegen dieses eine Feld sind.

Wenn ich lese

transactiondate>='2009-04-17' and transactiondate<='2009-04-22'

Ich muss noch einen Moment Zeit nehmen, um sicherzustellen, dass die beiden Felder gleich sind.

Wenn eine Abfrage im Laufe der Zeit bearbeitet wird, kann ein schlampiger Programmierer die beiden Felder auch trennen. Ich habe viele Anfragen gesehen, die etwas sagen

where transactiondate>='2009-04-17'
  and salestype='A'
  and customernumber=customer.idnumber
  and transactiondate<='2009-04-22'

Wenn sie dies mit einer BETWEEN versuchen, wird dies natürlich ein Syntaxfehler sein und umgehend behoben.

2
Jay

Logisch gibt es überhaupt keinen Unterschied. Performance-weise gibt es -typisch bei den meisten DBMS-überhaupt keinen Unterschied.

2
mjv

In diesem ausgezeichneten Blogbeitrag von Aaron Bertrand erfahren Sie, warum Sie das Zeichenfolgenformat ändern und wie die Randwerte in Datumsbereichsabfragen behandelt werden.

2
Andy Jones

Haftungsausschluss: Alles, was unten aufgeführt ist, ist nur eine Erzählung und bezieht sich direkt auf meine persönlichen Erfahrungen. Jeder, der sich für eine empirisch strengere Analyse bereit fühlt, kann dies gerne durchführen und die Abstimmung nach unten durchführen, wenn ich bin. Mir ist auch bewusst, dass SQL eine deklarative Sprache ist und Sie nicht berücksichtigen müssen, WIE Ihr Code verarbeitet wird, wenn Sie ihn schreiben, aber weil ich meine Zeit schätze, tue ich das.

Es gibt unendlich viele logisch äquivalente Aussagen, aber ich werde drei (ish) betrachten.

Fall 1: Zwei Vergleiche in einer Standardreihenfolge (Auswertungsreihenfolge behoben)

A> = MinBound UND A <= MaxBound 

Fall 2: Syntaktischer Zucker (Bewertungsreihenfolge wird vom Autor nicht ausgewählt)

Ein ZWISCHEN MinBound UND MaxBound

Fall 3: Zwei Vergleiche in gebildeter Reihenfolge (Auswertungsreihenfolge zum Zeitpunkt des Schreibens)

A> = MinBound UND A> = MaxBound

Oder

A> = MaxBound UND A> = MinBound

Nach meiner Erfahrung weisen Fall 1 und Fall 2 keine konsistenten oder bemerkenswerten Leistungsunterschiede auf, da sie keine Daten enthalten. 

Fall 3 kann jedoch die Ausführungszeiten erheblich verbessern. Insbesondere wenn Sie mit einem großen Datensatz arbeiten und zufällig ein heuristisches Wissen darüber haben, obAwahrscheinlicher größer ist als das MaxBound oder weniger als das MinBound Sie können die Ausführungszeiten spürbar verbessern, indem Sie Fall 3 verwenden und die Vergleiche entsprechend anordnen.

Ein Anwendungsfall, den ich habe, ist die Abfrage eines großen historischen Datensatzes mit nicht indizierten Daten für Datensätze innerhalb eines bestimmten Intervalls. Beim Schreiben der Abfrage habe ich eine gute Vorstellung davon, ob vor dem angegebenen Intervall oder NACH dem angegebenen Intervall mehr Daten vorhanden sind oder nicht, und kann meine Vergleiche entsprechend anordnen. Je nach Größe des Datensatzes, der Komplexität der Abfrage und der Menge der durch den ersten Vergleich gefilterten Datensätze wurde die Ausführungszeit um die Hälfte verkürzt.

0
LanchPad