sql >> Databáze >  >> RDS >> Sqlserver

3 způsoby použití VŠECHNY na serveru SQL

Možná znáte ALL možnost na serveru SQL Server. Možná jste jej používali spolu s UNION operátor zahrnout všechny duplikáty, které by mohly být vráceny do sady výsledků.

Ale věděli jste, že ALL lze také použít ve dvou jiných kontextech?

ALL lze použít v následujících třech kontextech:

  • Jako argument pro SELECT doložka.
  • Jako argument pro UNION doložka.
  • Jako logický operátor při porovnávání skalární hodnoty se sadou hodnot s jedním sloupcem.

Příklady každého z těchto kontextů následují.

ALL v SELECT Ustanovení

Při použití s ​​SELECT klauzule, ALL určuje, že v sadě výsledků budou vráceny duplicitní hodnoty.

Pravděpodobně to již implicitně používáte, aniž byste to věděli.

V T-SQL, syntaxe pro SELECT klauzule zní takto:

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 ]

Část, která jde [ ALL | DISTINCT ] znamená, že máte na výběr mezi ALL a DISTINCT .

Hranaté závorky znamenají, že tato část je volitelná.

  • ALL určuje, že v sadě výsledků se mohou objevit duplicitní řádky.
  • DISTINCT určuje, že v sadě výsledků se mohou objevit pouze jedinečné řádky.

ALL je výchozí hodnota, takže pokud nezadáte ALL nebo DISTINCT , ALL se používá.

Příklad

Následující dva příkazy jsou tedy ekvivalentní:

SELECT DogName 
FROM Dogs;

SELECT ALL DogName 
FROM Dogs;

Příklad výsledku:

+-----------+
| DogName   |
|-----------|
| Fetch     |
| Fluffy    |
| Wag       |
| Fetch     |
+-----------+
(4 rows affected)
+-----------+
| DogName   |
|-----------|
| Fetch     |
| Fluffy    |
| Wag       |
| Fetch     |
+-----------+
(4 rows affected)

Oba výsledky ukazují, že existují dva psi s názvem „Aport“.

Pokud prohodíme ALL argument pro DISTINCT , bude vrácen pouze jeden řádek pro „Načíst“. Důvodem je DISTINCT odstraní všechny duplicitní hodnoty ze sady výsledků.

SELECT DISTINCT DogName 
FROM Dogs;

Příklad výsledku:

+-----------+
| DogName   |
|-----------|
| Fetch     |
| Fluffy    |
| Wag       |
+-----------+
(3 rows affected)

ALL v UNION Ustanovení

ALL dělá to samé při použití s ​​UNION doložka. Určuje, že v sadě výsledků jsou vráceny duplicitní hodnoty.

Ale samozřejmě UNION je jiná klauzule než SELECT , takže kontext je mírně odlišný.

UNION klauzule zřetězí výsledky dvou dotazů do jediné sady výsledků. Můžete jej použít s nebo bez ALL argument:

  • UNION ALL – Zahrnuje duplikáty.
  • UNION – Nezahrnuje duplikáty.

Příklad

Zde je příklad použití UNION ALL zkombinovat dva dotazy.

Přidejme tabulku nazvanou Cats . Máme tedy dvě tabulky:Dogs a Cats

Dogs

+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 1       | Fetch     |
| 2       | Fluffy    |
| 3       | Wag       |
| 1002    | Fetch     |
+---------+-----------+

Cats

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 1       | Meow      |
| 2       | Fluffy    |
| 3       | Scratch   |
+---------+-----------+

Nyní vybereme jméno psa/kočky z každé tabulky a použijeme UNION ALL spojit výsledky z obou tabulek.

SELECT DogName AS PetName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats;

Výsledek:

+-----------+
| PetName   |
|-----------|
| Fetch     |
| Fluffy    |
| Wag       |
| Fetch     |
| Meow      |
| Fluffy    |
| Scratch   |
+-----------+
(7 rows affected)

V tomto případě se vrátí sedm řádků. Vidíme, že „Načíst“ je vráceno dvakrát. Je to proto, že existují dva psi jménem Fetch.

Je tu také kočka a pes se stejným jménem:Fluffy. (Víme, že ta druhá je kočka, protože v předchozím příkladu byl pouze jeden pes jménem Fluffy).

Uvidíme, co se stane, když odstraním ALL argument.

SELECT DogName AS PetName
FROM Dogs
UNION
SELECT CatName
FROM Cats;

Výsledek:

+-----------+
| PetName   |
|-----------|
| Fetch     |
| Fluffy    |
| Meow      |
| Scratch   |
| Wag       |
+-----------+
(5 rows affected)

Tentokrát je vráceno pouze pět řádků. Oba duplikáty jsou odstraněny.

Všimněte si, že se to liší od použití DISTINCT každému jednotlivému SELECT prohlášení. Pokud bychom to udělali, Fluffy by byl vrácen dvakrát, protože ALL platí pouze pro SELECT prohlášení, proti kterému je aplikováno (nikoli na zřetězené výsledky).

Zde je příklad pro ilustraci toho, co mám na mysli.

SELECT DISTINCT DogName AS PetName
FROM Dogs
UNION ALL
SELECT DISTINCT CatName
FROM Cats;

Výsledek:

+-----------+
| PetName   |
|-----------|
| Fetch     |
| Fluffy    |
| Wag       |
| Fluffy    |
| Meow      |
| Scratch   |
+-----------+
(6 rows affected)

ALL Operátor

ALL Operátor lze použít s poddotazem k porovnání skalární hodnoty s jednosloupcovou sadou hodnot vrácených poddotazem.

Příklad

Pro osvěžení zde jsou naše dvě tabulky:

Dogs

+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 1       | Fetch     |
| 2       | Fluffy    |
| 3       | Wag       |
| 1002    | Fetch     |
+---------+-----------+

Cats

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 1       | Meow      |
| 2       | Fluffy    |
| 3       | Scratch   |
+---------+-----------+

Nyní spusťte dílčí dotaz pomocí ALL operátor.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName = ALL (SELECT DogName FROM Dogs);

Výsledek:

(0 rows affected)

V tomto případě nebyly vráceny žádné řádky. Je to proto, že ALL vyžaduje, aby se skalární výraz porovnal pozitivně s každým hodnotu, která je vrácena poddotazem.

V tomto případě byl dílčí dotaz tak široký, že všechny řádky z Dogs stůl byl vrácen. To by vyžadovalo, aby každý pes měl alespoň jednu odpovídající kočku se stejným jménem.

Změňme mírně poddotaz.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName = ALL (
    SELECT DogName FROM Dogs 
    WHERE DogId = 2
    );

Výsledek:

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 2       | Fluffy    |
+---------+-----------+

Tentokrát dostanu kladný výsledek, protože všechny řádky vrácené poddotazem měly odpovídající řádek v Cats tabulka (v tomto případě pouze jeden řádek).


  1. Proč dotaz Microsoft SQL Server 2012 trvá několik minut oproti JDBC 4.0, ale sekundy v Management Studio?

  2. Výsledky MySQL jako seznam oddělený čárkami

  3. Jak mohu UPDATE z SELECT v SQL Server?

  4. Jak funguje COUNT() na serveru SQL Server