In SQL Server 2000 und 2005:
- Was ist der Unterschied zwischen diesen beiden
WHERE
Klauseln? - Welches sollte ich in welchen 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 Ereignisdatum fehlte ursprünglich, daher war die Abfrage syntaktisch falsch.)
Antworten:
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
BETWEEN
der z(Beachten Sie
<
eher als<=
in der zweiten Bedingung.)quelle
Sie sind gleich.
Eine Sache, auf die Sie achten sollten, ist, wenn Sie dies gegen eine DATETIME verwenden, wird das Match für das Enddatum der Anfang des Tages sein:
ist nicht dasselbe wie:
(es würde gegen passen
<= 20/10/2009 00:00:00.000
)quelle
Obwohl
BETWEEN
es leicht zu lesen und zu warten ist, empfehle ich die Verwendung selten, da es sich um ein geschlossenes Intervall handelt. Wie bereits erwähnt, kann dies ein Problem mit Datumsangaben sein - auch ohne Zeitkomponenten.Wenn Sie beispielsweise mit monatlichen Daten arbeiten, ist es häufig üblich, Daten zu vergleichen.
BETWEEN first AND last
In der Praxis ist dies jedoch normalerweise einfacher zu schreibendt >= first AND dt < next-first
(wodurch auch das Zeitteilproblem gelöst wird), da das Bestimmenlast
normalerweise einen Schritt länger ist als das Bestimmennext-first
(durch Subtrahieren eines Tages). .Ein weiteres Problem ist, dass die unteren und oberen Grenzen in der richtigen Reihenfolge (dh
BETWEEN low AND high
) angegeben werden müssen.quelle
Normalerweise gibt es keinen Unterschied - das
BETWEEN
Schlüsselwort wird nicht auf allen RDBMS-Plattformen unterstützt, aber wenn dies der Fall ist, sollten die beiden Abfragen identisch sein.Da sie identisch sind, gibt es wirklich keinen Unterschied in Bezug auf Geschwindigkeit oder irgendetwas anderes - verwenden Sie den, der Ihnen natürlicher erscheint.
quelle
Wie von @marc_s erwähnt, haben @Cloud et al. Für einen geschlossenen Bereich sind sie im Grunde gleich.
Jeder Zeitbruchteil kann jedoch Probleme mit einem geschlossenen Bereich (größer oder gleich und kleiner oder gleich ) verursachen, im Gegensatz zu einem halboffenen Bereich (größer oder gleich und kleiner als ) mit einem Endwert nach dem letzter möglicher Augenblick.
Um zu vermeiden, dass die Abfrage wie folgt umgeschrieben wird:
Da
BETWEEN
dies nicht für halboffene Intervalle funktioniert, schaue ich mir jede Datums- / Zeitabfrage, die es verwendet, immer genau an, da es wahrscheinlich ein Fehler ist.quelle
Ich habe eine leichte Präferenz für,
BETWEEN
weil es dem Leser sofort klar macht, dass Sie ein Feld auf einen Bereich prüfen . Dies gilt insbesondere dann, wenn Ihre Tabelle ähnliche Feldnamen enthält.Wenn zum Beispiel unsere Tabelle sowohl a
transactiondate
als auch a hattransitiondate
, wenn ich leseIch weiß sofort, dass beide Enden des Tests gegen dieses eine Feld sind.
Wenn ich lese
Ich muss mir einen zusätzlichen 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 trennen. Ich habe viele Anfragen gesehen, die so etwas wie sagen
Wenn sie dies mit a versuchen
BETWEEN
, handelt es sich natürlich um einen Syntaxfehler, der umgehend behoben wird.quelle
Ich denke, der einzige Unterschied ist die Menge an syntaktischem Zucker bei jeder Abfrage. ZWISCHEN ist nur eine raffinierte Art, genau dasselbe wie die zweite Abfrage zu sagen.
Möglicherweise gibt es einen RDBMS-spezifischen Unterschied, den ich nicht kenne, aber ich denke nicht wirklich.
quelle
Logischerweise gibt es überhaupt keinen Unterschied. In Bezug auf die Leistung gibt es bei den meisten DBMS normalerweise keinen Unterschied.
quelle
In diesem ausgezeichneten Blog-Beitrag von Aaron Bertrand erfahren Sie, warum Sie Ihr Zeichenfolgenformat ändern sollten und wie die Grenzwerte in Datumsbereichsabfragen behandelt werden.
quelle
Haftungsausschluss: Alles unten ist nur anekdotisch und stammt direkt aus meiner persönlichen Erfahrung. Jeder, der Lust hat, eine empirisch strengere Analyse durchzuführen, kann diese gerne durchführen und abstimmen, wenn ich es bin. Mir ist auch bewusst, dass SQL eine deklarative Sprache ist und Sie nicht berücksichtigen müssen, wie Ihr Code beim Schreiben verarbeitet wird, aber weil ich meine Zeit schätze, tue ich das auch.
Es gibt unendlich viele logisch äquivalente Aussagen, aber ich werde drei (ish) betrachten.
Fall 1: Zwei Vergleiche in einer Standardreihenfolge (Bewertungsreihenfolge festgelegt)
Fall 2: Syntaktischer Zucker (Bewertungsreihenfolge wird vom Autor nicht gewählt)
Fall 3: Zwei Vergleiche in einer gebildeten Reihenfolge (Bewertungsreihenfolge zum Zeitpunkt des Schreibens gewählt)
Oder
Nach meiner Erfahrung weisen Fall 1 und Fall 2 keine konsistenten oder bemerkenswerten Leistungsunterschiede auf, da sie den Datensatz nicht kennen.
Fall 3 kann jedoch die Ausführungszeiten erheblich verbessern. Insbesondere, wenn Sie mit einem großen Datensatz arbeiten und zufällig heuristische Kenntnisse darüber haben, ob A mit größerer Wahrscheinlichkeit größer als MaxBound ist oder kleiner als der MinBound ist , können Sie die Ausführungszeiten spürbar verbessern, indem Sie Fall 3 verwenden und die Vergleiche anordnen entsprechend.
Ein Anwendungsfall, den ich habe, ist das Abfragen 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 weitere Daten vorhanden sind, und kann meine Vergleiche entsprechend anordnen. Die Ausführungszeiten wurden je nach Größe des Datasets, der Komplexität der Abfrage und der Anzahl der durch den ersten Vergleich gefilterten Datensätze um die Hälfte reduziert.
quelle
A
beide Grenzen größer sind, überprüfen Sie einfach, ob dieA
größer als die istMaxBound
. Ihr Beitrag muss angepasst werden.In diesem Szenario
col BETWEEN ... AND ...
undcol <= ... and col >= ...
sind gleichwertig.SQL Standard definiert auch T461 Symmetric ZWISCHEN Prädikat :
BETWEEN
erfordert, dass die Werte sortiert sind. Zum Beispiel:Andererseits:
Es funktioniert genauso wie normal,
BETWEEN
jedoch nach dem Sortieren der Vergleichswerte.db <> Geigen-Demo
quelle