sql >> データベース >  >> RDS >> Database

初心者のためのSQLUNION句

    SQLでは、 UNION 句は、2つのクエリの結果を1つの結果セットに連結します。

    UNIONを使用できます ALLの有無にかかわらず句 引数:

    • UNION ALL –重複を含みます。
    • UNION –重複を除外します。

    以下は、それがどのように機能するかを示すためのいくつかの基本的な例です。

    サンプルテーブル

    2つのテーブルがあるとします: Cats およびDogs

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

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

    SELECTを使用できます UNIONを含むステートメント 両方のテーブルの結果を1つの結果セットに結合する句。

    UNION ALLを使用した例

    まず、 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匹いるためです。

    同じ名前の猫と犬もいます:ふわふわ。

    操作によって返されるフィールドに名前を付けるために列エイリアスを使用したことに注意してください。それを行わなかった場合、結果には最初のクエリの列名が使用されます。その場合、列ヘッダーは DogNameと呼ばれます。 PetNameの代わりに 。

    SELECT DogName
    FROM Dogs
    UNION ALL
    SELECT CatName
    FROM Cats;

    結果:

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

    これは、クエリで返すデータに応じて、受け入れられる場合と受け入れられない場合があります。私たちの場合、すべての結果が犬であるとは限らないため、適切ではありません。

    UNIONを使用した例

    ALLを削除するとどうなるか見てみましょう 引数。

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

    結果:

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

    今回は5行のみが返されます。両方の重複が削除されます。

    UNION vs DISTINCT

    これは、 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)

    すべてのクエリは同じ数の列を返す必要があります

    UNIONを使用する場合 句では、各クエリの列数は同じで、順序も同じである必要があります。

    そうでない場合は、エラーが発生します。

    SELECT CatName FROM Cats
    UNION ALL
    SELECT DogId, DogName FROM Dogs;

    結果:

    Msg 205, Level 16, State 1, Line 1
    All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.

    これは、列の数が等しくない場合にSQLServerが返すエラーです。この特定のエラーは、同じ制限が INTERSECTにも適用されることを示しています およびEXCEPT 演算子。表示されるエラーメッセージは、DBMSによって異なる場合があります。

    データ型は互換性がなければなりません

    同じ数の列を必要とすることに加えて、それらの列は互換性のあるデータ型を持っている必要があります。

    必ずしも同じデータ型である必要はありませんが、互換性がある必要があります。つまり、暗黙的な変換を通じて互換性がなければなりません。データ型が一致しない場合、DBMSは、それらが一致するように暗黙的な変換を実行できる必要があります。

    そうでない場合は、エラーが発生します。

    SELECT CatName FROM Cats
    UNION ALL
    SELECT DogId FROM Dogs;

    結果:

    Msg 245, Level 16, State 1, Line 1
    Conversion failed when converting the varchar value 'Meow' to data type int.

    結果の注文

    ORDER BYで結果を並べ替える場合 句、最後のクエリに配置する必要があります。別のORDERBYを配置することはできません 各クエリの句、さらに言えば、最後のクエリではないクエリ。

    SQLServerでこれを実行しようとすると発生するエラーは次のとおりです。

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

    結果:

    Msg 156, Level 15, State 1, Line 4
    Incorrect syntax near the keyword 'UNION'.

    したがって、結果を注文する場合は、次のようにする必要があります。

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

    UNIONを適用する 2つ以上のクエリへ

    前の例では、2つの異なるクエリの結果を組み合わせましたが、さらに追加することを妨げるものは何もありません。必要に応じて、これを使用して多くのクエリの結果を組み合わせることができます。

    たとえば、 Birdsもある場合 テーブル、これを行うことができます:

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

    正規化

    このページの例では、猫と犬を2つの別々のテーブルに配置しています。私がこれを行った理由は、 UNIONがどのようにUNIONであるかを明確かつ簡潔に説明するためです。 動作します。

    実際には、これらは同じテーブルに Petsと呼ばれる場合があります。 、次に別の PetTypes テーブル(または同様のもの)。これは正規化と呼ばれ、リレーショナルデータベースが通常設計される方法です。

    次に、これらのテーブルで結合を実行して、必要に応じてデータを返すことができます。


    1. NetBeans 9.0、パート2のJava9でJShellを使用する

    2. Linux上のSQLServer2016

    3. SQLROWNUM特定の範囲の間の行を返す方法

    4. SQLServerの基本ALTERTABLEステートメント