17 Stimmen

Warum den Operator BETWEEN verwenden, wenn es auch ohne ihn geht?

Wie aus den beiden Abfragen hervorgeht, funktionieren beide gut. Dann bin ich verwirrt, warum wir überhaupt BETWEEN verwenden sollten, denn ich habe festgestellt, dass BETWEEN sich in verschiedenen Datenbanken unterschiedlich verhält, wie man in w3schule

SELECT *
FROM employees
WHERE salary BETWEEN 5000 AND 15000;

SELECT *
FROM employees
WHERE salary >= 5000
AND salary <= 15000;

32voto

Quassnoi Punkte 396418

BETWEEN kann dazu beitragen, eine unnötige Neubewertung des Ausdrucks zu vermeiden:

SELECT  AVG(RAND(20091225) BETWEEN 0.2 AND 0.4)
FROM    t_source;

---
0.1998

SELECT  AVG(RAND(20091225) >= 0.2 AND RAND(20091225) <= 0.4)
FROM    t_source;

---
0.3199

t_source ist nur eine Dummy-Tabelle mit 1,000,000 Aufzeichnungen.

Natürlich kann dies mit einer Unterabfrage umgangen werden, aber in MySQL es ist weniger effizient.

Und natürlich, BETWEEN ist besser lesbar. Es dauert 3 mal in einer Abfrage zu verwenden, um sich die Syntax für immer zu merken.

Unter SQL Server y MySQL , LIKE gegen eine Konstante mit nicht-führendem '%' ist auch eine Kurzform für ein Paar von >= y < :

SET SHOWPLAN_TEXT ON
GO
SELECT  *
FROM    master
WHERE   name LIKE 'string%'
GO
SET SHOWPLAN_TEXT OFF
GO

|--Index Seek(OBJECT:([test].[dbo].[master].[ix_name_desc]), SEEK:([test].[dbo].[master].[name] < 'strinH' AND [test].[dbo].[master].[name] >= 'string'),  WHERE:([test].[dbo].[master].[name] like 'string%') ORDERED FORWARD)

Allerdings, LIKE Die Syntax ist besser lesbar.

16voto

Jonathan Leffler Punkte 694013

Die Verwendung von BETWEEN hat zusätzliche Vorteile, wenn es sich bei dem zu vergleichenden Ausdruck um eine komplexe Berechnung und nicht nur um eine einfache Spalte handelt; es erspart das doppelte Ausfüllen des komplexen Ausdrucks.

5voto

Rich Punkte 3035

Die Version mit "zwischen" ist leichter zu lesen. Wenn ich die zweite Version verwenden würde, würde ich es wahrscheinlich so schreiben

5000 <= salary and salary <= 15000

aus demselben Grund.

5voto

bniwredyc Punkte 8399

BETWEEN in T-SQL unterstützt den NOT-Operator, so dass Sie Konstruktionen verwenden können wie

WHERE salary not between 5000 AND 15000; 

Meiner Meinung nach ist es für einen Menschen dann klarer

WHERE salary < 5000 OR salary > 15000;

Und schließlich, wenn Sie den Spaltennamen nur einmal eingeben, ist die Gefahr eines Fehlers geringer

2voto

David Thomas Punkte 239063

Persönlich würde ich nicht verwenden BETWEEN weil es keine klare Definition dafür gibt, ob die Werte, die in Ihrem Beispiel zur Begrenzung der Bedingung dienen, einbezogen oder ausgeschlossen werden sollen:

SELECT *
FROM emplyees
WHERE salary between 5000 AND 15000;

Der Bereich podría die 5000 und 15000 einschließen, oder es podría sie ausschließen.

Syntaktisch sollte es sie ausschließen, da die Werte selbst no zwischen die angegebenen Zahlen. Meiner Meinung nach ist es aber so, dass die Verwendung von Operatoren wie >= ist sehr spezifisch. Und es ist weniger wahrscheinlich, dass sie sich zwischen verschiedenen Datenbanken oder zwischen Erweiterungen/Versionen derselben ändern.


Bearbeitet als Antwort auf die Kommentare von Pavel und Jonathan.

Wie von Pavel erwähnt, ist ANSI SQL ( http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt ) aus dem Jahr 1992 schreibt vor, dass die Endpunkte innerhalb des Rückgabedatums zu betrachten sind und gleichwertig sind mit X >= lower_bound AND X <= upper_bound :

8.3

     Function

     Specify a range comparison.

     Format

     <between predicate> ::=
          <row value constructor> [ NOT ] BETWEEN
            <row value constructor> AND <row value constructor>

     Syntax Rules

     1) The three <row value constructor>s shall be of the same degree.

     2) Let respective values be values with the same ordinal position
        in the two <row value constructor>s.

     3) The data types of the respective values of the three <row value
        constructor>s shall be comparable.

     4) Let X, Y, and Z be the first, second, and third <row value con-
        structor>s, respectively.

     5) "X NOT BETWEEN Y AND Z" is equivalent to "NOT ( X BETWEEN Y AND
        Z )".

     6) "X BETWEEN Y AND Z" is equivalent to "X>=Y AND X<=Z".

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X