Być może znasz ALL
opcja w SQL Server. Być może używałeś go razem z UNION
operatora, aby uwzględnić wszelkie duplikaty, które mogą zostać zwrócone w zestawie wyników.
Ale czy wiesz, że ALL
może być również używany w dwóch innych kontekstach?
ALL
może być używany w następujących trzech kontekstach:
- Jako argument do
SELECT
klauzula. - Jako argument do
UNION
klauzula. - Jako operator logiczny przy porównywaniu wartości skalarnej z jednokolumnowym zestawem wartości.
Poniżej znajdują się przykłady każdego z tych kontekstów.
ALL
w SELECT
Klauzula
W przypadku użycia z SELECT
klauzula, ALL
określa, że zduplikowane wartości są zwracane w zestawie wyników.
Prawdopodobnie już używasz tego niejawnie, nawet o tym nie wiedząc.
W T-SQL składnia SELECT
klauzula brzmi tak:
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 ]
Część, która idzie [ ALL | DISTINCT ]
oznacza, że masz wybór między ALL
i DISTINCT
.
Nawiasy kwadratowe oznaczają, że ta część jest opcjonalna.
ALL
określa, że w zestawie wyników mogą pojawić się zduplikowane wiersze.DISTINCT
określa, że w zestawie wyników mogą pojawiać się tylko unikatowe wiersze.
ALL
jest wartością domyślną, więc jeśli nie określisz ALL
lub DISTINCT
, ALL
jest używany.
Przykład
Zatem następujące dwa stwierdzenia są równoważne:
SELECT DogName
FROM Dogs;
SELECT ALL DogName
FROM Dogs;
Przykładowy wynik:
+-----------+ | DogName | |-----------| | Fetch | | Fluffy | | Wag | | Fetch | +-----------+ (4 rows affected) +-----------+ | DogName | |-----------| | Fetch | | Fluffy | | Wag | | Fetch | +-----------+ (4 rows affected)
Oba wyniki pokazują, że istnieją dwa psy o nazwie „Fetch”.
Jeśli zamienimy ALL
argument dla DISTINCT
, tylko jeden wiersz zostanie zwrócony dla „Pobierz”. Dzieje się tak, ponieważ DISTINCT
usuwa wszystkie zduplikowane wartości z zestawu wyników.
SELECT DISTINCT DogName
FROM Dogs;
Przykładowy wynik:
+-----------+ | DogName | |-----------| | Fetch | | Fluffy | | Wag | +-----------+ (3 rows affected)
ALL
w UNION
Klauzula
ALL
robi to samo, gdy jest używany z UNION
klauzula. Określa, że zduplikowane wartości są zwracane w zestawie wyników.
Ale oczywiście UNION
jest inną klauzulą niż SELECT
, więc kontekst jest nieco inny.
UNION
klauzula łączy wyniki dwóch zapytań w jeden zestaw wyników. Możesz go używać z lub bez ALL
argument:
UNION ALL
– Zawiera duplikaty.UNION
– Wyklucza duplikaty.
Przykład
Oto przykład użycia UNION ALL
połączyć dwa zapytania.
Dodajmy tabelę o nazwie Cats
. Mamy więc dwie tabele:Dogs
i Cats
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 1002 | Fetch | +---------+-----------+
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Teraz wybierzmy imię psa/kota z każdej tabeli i użyjmy UNION ALL
połączyć wyniki z obu tabel.
SELECT DogName AS PetName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats;
Wynik:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Wag | | Fetch | | Meow | | Fluffy | | Scratch | +-----------+ (7 rows affected)
W takim przypadku zwracanych jest siedem wierszy. Widzimy, że „Fetch” jest zwracane dwukrotnie. Dzieje się tak, ponieważ istnieją dwa psy o imieniu Fetch.
Jest też kot i pies o tym samym imieniu:Fluffy. (Wiemy, że drugi to kot, ponieważ w poprzednim przykładzie był tylko jeden pies o imieniu Fluffy).
Zobaczmy, co się stanie, gdy usunę ALL
argument.
SELECT DogName AS PetName
FROM Dogs
UNION
SELECT CatName
FROM Cats;
Wynik:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Meow | | Scratch | | Wag | +-----------+ (5 rows affected)
Tym razem zwracanych jest tylko pięć wierszy. Oba duplikaty są usuwane.
Zauważ, że różni się to od stosowania DISTINCT
do każdego z osobna SELECT
oświadczenie. Gdybyśmy to zrobili, Fluffy zostałby zwrócony dwa razy, ponieważ ALL
dotyczy tylko SELECT
oświadczenie, że jest stosowany przeciwko (nie do połączonych wyników).
Oto przykład ilustrujący, o co mi chodzi.
SELECT DISTINCT DogName AS PetName
FROM Dogs
UNION ALL
SELECT DISTINCT CatName
FROM Cats;
Wynik:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Wag | | Fluffy | | Meow | | Scratch | +-----------+ (6 rows affected)
ALL
Operator
ALL
Operator może być używany z podzapytaniem do porównania wartości skalarnej z jednokolumnowym zestawem wartości zwracanych przez podzapytanie.
Przykład
Dla przypomnienia, oto nasze dwie tabele:
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 1002 | Fetch | +---------+-----------+
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Teraz uruchommy podzapytanie za pomocą ALL
operatora.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (SELECT DogName FROM Dogs);
Wynik:
(0 rows affected)
W tym przypadku nie zostały zwrócone żadne wiersze. Dzieje się tak, ponieważ ALL
wymaga wyrażenia skalarnego do pozytywnego porównania z każdym wartość zwracana przez podzapytanie.
W tym przypadku podzapytanie było tak szerokie, że wszystkie wiersze z Dogs
tabela została zwrócona. Wymagałoby to, aby każdy pies miał co najmniej jednego odpowiadającego kota o tym samym imieniu.
Zmieńmy nieco podzapytanie.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (
SELECT DogName FROM Dogs
WHERE DogId = 2
);
Wynik:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
Tym razem otrzymuję wynik pozytywny, ponieważ wszystkie wiersze zwrócone przez podzapytanie miały odpowiedni wiersz w Cats
tabela (w tym przypadku tylko jeden wiersz).