Vielleicht kennen Sie den ALL
Option in SQL Server. Vielleicht haben Sie es zusammen mit UNION
verwendet -Operator, um alle Duplikate einzuschließen, die möglicherweise in die Ergebnismenge zurückgegeben werden.
Aber wussten Sie, dass ALL
kann auch in zwei anderen Kontexten verwendet werden?
ALL
kann in den folgenden drei Kontexten verwendet werden:
- Als Argument für
SELECT
Klausel. - Als Argument für
UNION
Klausel. - Als logischer Operator beim Vergleichen eines Skalarwerts mit einem einspaltigen Satz von Werten.
Es folgen Beispiele für jeden dieser Kontexte.
ALL
im SELECT
Klausel
Bei Verwendung mit SELECT
Klausel, ALL
gibt an, dass doppelte Werte in der Ergebnismenge zurückgegeben werden.
Sie verwenden dies wahrscheinlich bereits implizit, ohne es zu wissen.
In T-SQL die Syntax für SELECT
Klausel geht so:
SELECT [ ALL | DISTINCT ]
[ TOP ( expression ) [ PERCENT ] [ WITH TIES ] ]
<select_list>
<select_list> ::=
{
*
| { table_name | view_name | table_alias }.*
| {
[ { table_name | view_name | table_alias }. ]
{ column_name | $IDENTITY | $ROWGUID }
| udt_column_name [ { . | :: } { { property_name | field_name }
| method_name ( argument [ ,...n] ) } ]
| expression
[ [ AS ] column_alias ]
}
| column_alias = expression
} [ ,...n ]
Der Teil, der [ ALL | DISTINCT ]
bedeutet, dass Sie die Wahl zwischen ALL
haben und DISTINCT
.
Die eckigen Klammern bedeuten, dass dieser Teil optional ist.
ALL
gibt an, dass doppelte Zeilen in der Ergebnismenge erscheinen können.DISTINCT
gibt an, dass nur eindeutige Zeilen in der Ergebnismenge erscheinen können.
ALL
ist der Standardwert, wenn Sie also ALL
nicht angeben oder DISTINCT
, ALL
verwendet wird.
Beispiel
Die folgenden beiden Anweisungen sind also äquivalent:
SELECT DogName
FROM Dogs;
SELECT ALL DogName
FROM Dogs;
Beispielergebnis:
+-----------+ | DogName | |-----------| | Fetch | | Fluffy | | Wag | | Fetch | +-----------+ (4 rows affected) +-----------+ | DogName | |-----------| | Fetch | | Fluffy | | Wag | | Fetch | +-----------+ (4 rows affected)
Beide Ergebnisse zeigen, dass es zwei Hunde mit dem Namen „Fetch“ gibt.
Wenn wir die ALL
vertauschen Argument für DISTINCT
, wird nur eine Zeile für „Fetch“ zurückgegeben. Das liegt daran, dass DISTINCT
entfernt alle doppelten Werte aus der Ergebnismenge.
SELECT DISTINCT DogName
FROM Dogs;
Beispielergebnis:
+-----------+ | DogName | |-----------| | Fetch | | Fluffy | | Wag | +-----------+ (3 rows affected)
ALL
in der UNION
Klausel
ALL
macht dasselbe, wenn es mit UNION
verwendet wird Klausel. Es gibt an, dass doppelte Werte in der Ergebnismenge zurückgegeben werden.
Aber natürlich UNION
ist eine andere Klausel als SELECT
, daher ist der Kontext etwas anders.
Die UNION
-Klausel verkettet die Ergebnisse zweier Abfragen zu einer einzigen Ergebnismenge. Sie können es mit oder ohne ALL
verwenden Argument:
UNION ALL
– Enthält Duplikate.UNION
– Schließt Duplikate aus.
Beispiel
Hier ist ein Beispiel für die Verwendung von UNION ALL
um zwei Abfragen zu kombinieren.
Lassen Sie uns eine Tabelle namens Cats
hinzufügen . Wir haben also zwei Tabellen:Dogs
und Cats
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 1002 | Fetch | +---------+-----------+
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Lassen Sie uns nun den Hunde-/Katzennamen aus jeder Tabelle auswählen und UNION ALL
verwenden um die Ergebnisse aus beiden Tabellen zu kombinieren.
SELECT DogName AS PetName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats;
Ergebnis:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Wag | | Fetch | | Meow | | Fluffy | | Scratch | +-----------+ (7 rows affected)
In diesem Fall werden sieben Zeilen zurückgegeben. Wir können sehen, dass „Fetch“ zweimal zurückgegeben wird. Das liegt daran, dass es zwei Hunde namens Fetch gibt.
Es gibt auch eine Katze und einen Hund mit demselben Namen:Fluffy. (Wir wissen, dass der andere eine Katze ist, weil es im vorherigen Beispiel nur einen Hund namens Fluffy gab).
Mal sehen, was passiert, wenn ich ALL
entferne Argument.
SELECT DogName AS PetName
FROM Dogs
UNION
SELECT CatName
FROM Cats;
Ergebnis:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Meow | | Scratch | | Wag | +-----------+ (5 rows affected)
Diesmal werden nur fünf Zeilen zurückgegeben. Beide Duplikate werden entfernt.
Beachten Sie, dass sich dies von der Anwendung von DISTINCT
unterscheidet zu jedem einzelnen SELECT
Erklärung. Wenn wir das getan hätten, wäre Fluffy zweimal zurückgegeben worden, weil die ALL
würde nur für SELECT
gelten Aussage, gegen die es angewendet wird (nicht auf die verketteten Ergebnisse).
Hier ist ein Beispiel, um zu veranschaulichen, was ich meine.
SELECT DISTINCT DogName AS PetName
FROM Dogs
UNION ALL
SELECT DISTINCT CatName
FROM Cats;
Ergebnis:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Wag | | Fluffy | | Meow | | Scratch | +-----------+ (6 rows affected)
Die ALL
Betreiber
Die ALL
-Operator kann mit einer Unterabfrage verwendet werden, um einen Skalarwert mit einem einspaltigen Wertesatz zu vergleichen, der von der Unterabfrage zurückgegeben wird.
Beispiel
Zur Auffrischung hier unsere beiden Tabellen:
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 1002 | Fetch | +---------+-----------+
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Lassen Sie uns nun eine Unterabfrage mit ALL
ausführen Betreiber.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (SELECT DogName FROM Dogs);
Ergebnis:
(0 rows affected)
In diesem Fall wurden keine Zeilen zurückgegeben. Das liegt daran, dass ALL
erfordert, dass der skalare Ausdruck positiv mit every verglichen werden kann Wert, der von der Unterabfrage zurückgegeben wird.
In diesem Fall war die Unterabfrage so breit angelegt, dass alle Zeilen aus Dogs
Tisch wurde zurückgegeben. Dies würde erfordern, dass jeder Hund mindestens eine entsprechende Katze mit demselben Namen hat.
Lassen Sie uns die Unterabfrage etwas ändern.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (
SELECT DogName FROM Dogs
WHERE DogId = 2
);
Ergebnis:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
Dieses Mal erhalte ich ein positives Ergebnis, da alle von der Unterabfrage zurückgegebenen Zeilen eine entsprechende Zeile in den Cats
hatten Tabelle (in diesem Fall nur eine Zeile).