あなたはALL
に精通しているかもしれません SQLServerのオプション。おそらく、 UNION
と一緒に使用したことがあるでしょう。 結果セットに返される可能性のある重複を含めるための演算子。
しかし、あなたはその ALL
を知っていましたか? 他の2つのコンテキストでも使用できますか?
ALL
次の3つのコンテキストで使用できます:
-
SELECT
の引数として 条項。 -
UNION
への引数として 条項。 - スカラー値を単一列の値のセットと比較するときの論理演算子として。
これらの各コンテキストの例を次に示します。
すべて
SELECT
で 条項
SELECT
と一緒に使用する場合 句、 ALL
結果セットに重複する値が返されることを指定します。
おそらく、知らないうちに暗黙のうちにこれを使用しているでしょう。
T-SQLでは、 SELECT
の構文 句は次のようになります:
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 ]
[ALL|に行く部分DISTINCT]
ALL
から選択できることを意味します およびDISTINCT
。
角括弧は、この部分がオプションであることを意味します。
すべて
重複する行が結果セットに表示される可能性があることを指定します。-
DISTINCT
結果セットに表示できるのは一意の行のみであることを指定します。
ALL
はデフォルト値であるため、 ALL
を指定しない場合 またはDISTINCT
、 ALL
使用されます。
例
したがって、次の2つのステートメントは同等です。
SELECT DogName
FROM Dogs;
SELECT ALL DogName
FROM Dogs;
結果の例:
+-----------+ | DogName | |-----------| | Fetch | | Fluffy | | Wag | | Fetch | +-----------+ (4 rows affected) +-----------+ | DogName | |-----------| | Fetch | | Fluffy | | Wag | | Fetch | +-----------+ (4 rows affected)
どちらの結果も、「Fetch」という名前の犬が2匹いることを示しています。
ALL
を交換した場合 DISTINCT
の引数 、「フェッチ」の場合は1行のみが返されます。これは、 DISTINCT
結果セットから重複する値を削除します。
SELECT DISTINCT DogName
FROM Dogs;
結果の例:
+-----------+ | DogName | |-----------| | Fetch | | Fluffy | | Wag | +-----------+ (3 rows affected)
すべて
UNION
で 条項
ALL
UNION
で使用した場合も同じことを行います 句。結果セットに重複する値が返されることを指定します。
しかし、明らかに、 UNION
SELECT
とは別の句です 、したがって、コンテキストは少し異なります。
UNION
句は、2つのクエリの結果を1つの結果セットに連結します。 ALL
の有無にかかわらず使用できます 引数:
-
UNION ALL
–重複を含みます。 -
UNION
–重複を除外します。
例
UNION ALL
の使用例を次に示します。 2つのクエリを組み合わせる。
Cats
というテーブルを追加しましょう 。したがって、2つのテーブルがあります: Dogs
およびCats
犬
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 1002 | Fetch | +---------+-----------+
猫
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
次に、各テーブルから犬/猫の名前を選択し、 UNION ALL
を使用します。 両方のテーブルの結果を結合します。
SELECT DogName AS PetName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats;
結果:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Wag | | Fetch | | Meow | | Fluffy | | Scratch | +-----------+ (7 rows affected)
この場合、7行が返されます。 「フェッチ」が2回返されることがわかります。これは、Fetchという名前の犬が2匹いるためです。
同じ名前の猫と犬もいます:ふわふわ。 (前の例ではFluffyという犬が1匹しかいなかったので、もう1匹は猫だとわかります)。
ALL
を削除するとどうなるか見てみましょう 引数。
SELECT DogName AS PetName
FROM Dogs
UNION
SELECT CatName
FROM Cats;
結果:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Meow | | Scratch | | Wag | +-----------+ (5 rows affected)
今回は5行のみが返されます。両方の重複が削除されます。
これは、 DISTINCT
を適用する場合とは異なることに注意してください。 個々のSELECT
に 声明。これを行うと、 ALL
が原因で、Fluffyが2回返されます。 SELECT
にのみ適用されます (連結された結果ではなく)適用されているというステートメント。
これが私が何を意味するかを説明するための例です。
SELECT DISTINCT DogName AS PetName
FROM Dogs
UNION ALL
SELECT DISTINCT CatName
FROM Cats;
結果:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Wag | | Fluffy | | Meow | | Scratch | +-----------+ (6 rows affected)
すべてコード> オペレーター
ALL
演算子をサブクエリとともに使用して、スカラー値をサブクエリによって返される単一列の値のセットと比較できます。
例
復習として、ここに2つの表があります:
犬
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 1002 | Fetch | +---------+-----------+
猫
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
次に、 ALL
を使用してサブクエリを実行しましょう オペレーター。
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (SELECT DogName FROM Dogs);
結果:
(0 rows affected)
この場合、行は返されませんでした。これは、 ALL
が原因です すべてと積極的に比較するスカラー式が必要です サブクエリによって返される値。
この場合、サブクエリは非常に広範であるため、 Dogs
のすべての行が テーブルが返されました。これには、各犬に同じ名前の対応する猫が少なくとも1匹いる必要があります。
サブクエリを少し変更しましょう。
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (
SELECT DogName FROM Dogs
WHERE DogId = 2
);
結果:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
今回は、サブクエリによって返されるすべての行の Cats
に対応する行があったため、肯定的な結果が得られました。 テーブル(この場合は1行のみ)。