Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

3 sposoby korzystania z ALL w SQL Server

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).


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak połączyć się z SQL Server z uwierzytelnianiem Windows z Node.JS za pomocą modułu mssql?

  2. 2 sposoby na wyświetlenie listy wszystkich funkcji wartościujących tabelę w bazie danych SQL Server

  3. datetime do totalminute w sql

  4. SQL Server:AKTUALIZUJ tabelę za pomocą ORDER BY

  5. Wykonywanie procedury składowanej z funkcji