Du kanske är bekant med ALL
alternativ i SQL Server. Du kanske har använt den tillsammans med UNION
operatorn för att inkludera alla dubbletter som kan returneras i resultatuppsättningen.
Men visste du att ALL
kan även användas i två andra sammanhang?
ALL
kan användas i följande tre sammanhang:
- Som ett argument till
SELECT
klausul. - Som ett argument till
UNION
klausul. - Som en logisk operator när man jämför ett skalärt värde med en uppsättning värden i en kolumn.
Exempel på vart och ett av dessa sammanhang följer.
ALL
i SELECT
Klausul
När den används med SELECT
klausul, ALL
anger att dubbletter av värden returneras i resultatuppsättningen.
Du använder förmodligen redan detta implicit utan att ens veta det.
I T-SQL, syntaxen för SELECT
klausul går så här:
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 ]
Delen som går till [ ALL | DISTINCT ]
innebär att du får ett val mellan ALL
och DISTINCT
.
De fyrkantiga parenteserna betyder att denna del är valfri.
ALL
anger att dubbletter av rader kan visas i resultatuppsättningen.DISTINCT
anger att endast unika rader kan visas i resultatuppsättningen.
ALL
är standardvärdet, så om du inte anger ALL
eller DISTINCT
, ALL
används.
Exempel
Så följande två påståenden är likvärdiga:
SELECT DogName
FROM Dogs;
SELECT ALL DogName
FROM Dogs;
Exempelresultat:
+-----------+ | DogName | |-----------| | Fetch | | Fluffy | | Wag | | Fetch | +-----------+ (4 rows affected) +-----------+ | DogName | |-----------| | Fetch | | Fluffy | | Wag | | Fetch | +-----------+ (4 rows affected)
Båda resultaten visar att det finns två hundar som heter "Fetch".
Om vi byter ALL
argument för DISTINCT
, kommer endast en rad att returneras för "Hämta". Detta beror på att DISTINCT
tar bort alla dubbletter av värden från resultatuppsättningen.
SELECT DISTINCT DogName
FROM Dogs;
Exempelresultat:
+-----------+ | DogName | |-----------| | Fetch | | Fluffy | | Wag | +-----------+ (3 rows affected)
ALL
i UNION
Klausul
ALL
gör samma sak när den används med UNION
klausul. Den anger att dubbletter av värden returneras i resultatuppsättningen.
Men självklart, UNION
är en annan klausul än SELECT
, så sammanhanget är något annorlunda.
UNION
sats sammanfogar resultaten av två frågor till en enda resultatuppsättning. Du kan använda den med eller utan ALL
argument:
UNION ALL
– Inkluderar dubbletter.UNION
– Exkluderar dubbletter.
Exempel
Här är ett exempel på hur du använder UNION ALL
för att kombinera två frågor.
Låt oss lägga till en tabell som heter Cats
. Så vi har två tabeller:Dogs
och Cats
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 1002 | Fetch | +---------+-----------+
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Låt oss nu välja hundens/kattnamnet från varje tabell och använda UNION ALL
för att kombinera resultaten från båda tabellerna.
SELECT DogName AS PetName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats;
Resultat:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Wag | | Fetch | | Meow | | Fluffy | | Scratch | +-----------+ (7 rows affected)
I detta fall returneras sju rader. Vi kan se att "Hämta" returneras två gånger. Detta beror på att det finns två hundar som heter Fetch.
Det finns också en katt och en hund med samma namn:Fluffy. (Vi vet att den andra är en katt eftersom det bara fanns en hund som hette Fluffy i föregående exempel).
Låt oss se vad som händer när jag tar bort ALL
argument.
SELECT DogName AS PetName
FROM Dogs
UNION
SELECT CatName
FROM Cats;
Resultat:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Meow | | Scratch | | Wag | +-----------+ (5 rows affected)
Denna gång returneras endast fem rader. Båda dubbletterna tas bort.
Observera att detta skiljer sig från att tillämpa DISTINCT
till varje enskild SELECT
påstående. Om vi hade gjort det skulle Fluffy ha returnerats två gånger, eftersom ALL
skulle endast gälla för SELECT
uttalande som det appliceras mot (inte på de sammanlänkade resultaten).
Här är ett exempel för att illustrera vad jag menar.
SELECT DISTINCT DogName AS PetName
FROM Dogs
UNION ALL
SELECT DISTINCT CatName
FROM Cats;
Resultat:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Wag | | Fluffy | | Meow | | Scratch | +-----------+ (6 rows affected)
ALL
Operatör
ALL
operatorn kan användas med en underfråga för att jämföra ett skalärt värde med en uppsättning värden i en kolumn som returneras av underfrågan.
Exempel
Som en uppfräschning, här är våra två tabeller:
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 1002 | Fetch | +---------+-----------+
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Låt oss nu köra en underfråga med ALL
operatör.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (SELECT DogName FROM Dogs);
Resultat:
(0 rows affected)
I det här fallet returnerades inga rader. Detta beror på att ALL
kräver att det skalära uttrycket jämförs positivt med alla värde som returneras av underfrågan.
I det här fallet var underfrågan så bred att alla rader från Dogs
bordet returnerades. Detta skulle kräva att varje hund hade minst en motsvarande katt med samma namn.
Låt oss ändra underfrågan något.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (
SELECT DogName FROM Dogs
WHERE DogId = 2
);
Resultat:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
Den här gången får jag ett positivt resultat, eftersom alla rader som returneras av underfrågan hade en motsvarande rad i Cats
tabell (i detta fall endast en rad).