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

初心者向けのSQLNOT演算子

    SQLでは、NOT 演算子はブール入力を否定します(ブール式の値を逆にします)。したがって、TRUEを返します。 式がFALSEの場合 。

    ソーステーブル

    このページの例では、次の表を使用しています。

    SELECT * FROM Pets;

    結果:

    +---------+-------------+-----------+-----------+------------+
    | PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
    |---------+-------------+-----------+-----------+------------|
    | 1       | 2           | 3         | Fluffy    | 2020-11-20 |
    | 2       | 3           | 3         | Fetch     | 2019-08-16 |
    | 3       | 2           | 2         | Scratch   | 2018-10-01 |
    | 4       | 3           | 3         | Wag       | 2020-03-15 |
    | 5       | 1           | 1         | Tweet     | 2020-11-28 |
    | 6       | 3           | 4         | Fluffy    | 2020-09-17 |
    | 7       | 3           | 2         | Bark      | NULL       |
    | 8       | 2           | 4         | Meow      | NULL       |
    +---------+-------------+-----------+-----------+------------+
    (8 rows affected)

    例1

    NOTを示す簡単な例を次に示します。 オペレーター。

    SELECT * FROM Pets 
    WHERE PetName NOT LIKE 'F%';

    結果:

    +---------+-------------+-----------+-----------+------------+
    | PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
    |---------+-------------+-----------+-----------+------------|
    | 3       | 2           | 2         | Scratch   | 2018-10-01 |
    | 4       | 3           | 3         | Wag       | 2020-03-15 |
    | 5       | 1           | 1         | Tweet     | 2020-11-28 |
    | 7       | 3           | 2         | Bark      | NULL       |
    | 8       | 2           | 4         | Meow      | NULL       |
    +---------+-------------+-----------+-----------+------------+

    この場合、NOTを使用しました LIKEの結果を否定する演算子 オペレーター。クエリは、文字Fで始まらないすべてのペットを返します。

    例2–比較演算子でNOTを使用する

    NOTを使用している場合 演算子を使用して比較演算子を無効にするには、前の例で使用した構文から構文を少し変更する必要があります。

    たとえば、equals演算子(=)を無効にするために使用する場合 )、次の構文を使用します:

    SELECT * FROM Pets 
    WHERE NOT PetName = 'Fluffy';

    結果:

    +---------+-------------+-----------+-----------+------------+
    | PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
    |---------+-------------+-----------+-----------+------------|
    | 2       | 3           | 3         | Fetch     | 2019-08-16 |
    | 3       | 2           | 2         | Scratch   | 2018-10-01 |
    | 4       | 3           | 3         | Wag       | 2020-03-15 |
    | 5       | 1           | 1         | Tweet     | 2020-11-28 |
    | 7       | 3           | 2         | Bark      | NULL       |
    | 8       | 2           | 4         | Meow      | NULL       |
    +---------+-------------+-----------+-----------+------------+

    これにより、名前がFluffyではないすべてのペットが返されます。

    この例では、NOTを配置します 列名の前の演算子。それを行わなかった場合、次のようなエラーが発生します。

    SELECT * FROM Pets 
    WHERE PetName NOT = 'Fluffy';

    結果:

    Msg 102, Level 15, State 1, Line 2
    Incorrect syntax near '='.

    not equal to演算子(<>のいずれか)を使用して同じ結果を達成することもできます。 または!= DBMSによって異なります)。

    例:

    SELECT * FROM Pets 
    WHERE PetName <> 'Fluffy';

    またはこれ:

    SELECT * FROM Pets 
    WHERE PetName != 'Fluffy';

    例3–論理演算子を使用した同じ構文

    実は、LIKEなどの論理演算子を使用するときにもその構文を使用できます。 最初の例で使用した演算子。

    したがって、最初の例を次のように書き直すことができます。

    SELECT * FROM Pets 
    WHERE NOT PetName LIKE 'F%';

    結果:

    +---------+-------------+-----------+-----------+------------+
    | PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
    |---------+-------------+-----------+-----------+------------|
    | 3       | 2           | 2         | Scratch   | 2018-10-01 |
    | 4       | 3           | 3         | Wag       | 2020-03-15 |
    | 5       | 1           | 1         | Tweet     | 2020-11-28 |
    | 7       | 3           | 2         | Bark      | NULL       |
    | 8       | 2           | 4         | Meow      | NULL       |
    +---------+-------------+-----------+-----------+------------+

    違いがわからない場合は、NOTを移動しました PetNameの後の演算子 列、その前に。

    2つのステートメントを一緒に示します:

    SELECT * FROM Pets 
    WHERE PetName NOT LIKE 'F%';
    
    SELECT * FROM Pets 
    WHERE NOT PetName LIKE 'F%';

    例4–複数の条件を否定する

    NOT 演算子は単一の条件のみを否定します。否定する必要のある条件が複数ある場合は、別のNOTを使用してください 各条件の演算子

    SELECT * FROM Pets 
    WHERE NOT PetName = 'Fluffy'
    AND NOT PetName = 'Wag';

    結果:

    +---------+-------------+-----------+-----------+------------+
    | PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
    |---------+-------------+-----------+-----------+------------|
    | 2       | 3           | 3         | Fetch     | 2019-08-16 |
    | 3       | 2           | 2         | Scratch   | 2018-10-01 |
    | 5       | 1           | 1         | Tweet     | 2020-11-28 |
    | 7       | 3           | 2         | Bark      | NULL       |
    | 8       | 2           | 4         | Meow      | NULL       |
    +---------+-------------+-----------+-----------+------------+

    例5–優先順位

    複数の演算子がある複合条件を使用する場合、NOT 演算子は、論理演算子の前に評価されますが、後に評価されます。比較演算子、

    式内の2つの演算子の優先順位が同じである場合、式内の位置に基づいて左から右に評価されます。ただし、括弧を使用して、各条件を評価する順序を指定できます。

    これが例です。

    SELECT * FROM Pets 
    WHERE 
        NOT PetName = 'Fluffy'
        OR NOT PetName = 'Wag'
        AND NOT DOB > '2020-01-01';

    結果:

    +---------+-------------+-----------+-----------+------------+
    | PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
    |---------+-------------+-----------+-----------+------------|
    | 2       | 3           | 3         | Fetch     | 2019-08-16 |
    | 3       | 2           | 2         | Scratch   | 2018-10-01 |
    | 4       | 3           | 3         | Wag       | 2020-03-15 |
    | 5       | 1           | 1         | Tweet     | 2020-11-28 |
    | 7       | 3           | 2         | Bark      | NULL       |
    | 8       | 2           | 4         | Meow      | NULL       |
    +---------+-------------+-----------+-----------+------------+

    ここでは括弧を使用せず、すべての条件をNOTで無効にしました。 演算子、つまりAND 演算子はORよりも優先されました オペレーター。

    ただし、括弧を使用して、ORを指定できます。 ANDの前に条件を評価する必要があります 状態。

    SELECT * FROM Pets 
    WHERE 
        (NOT PetName = 'Fluffy'
        OR NOT PetName = 'Wag')
        AND NOT DOB > '2020-01-01';

    結果:

    +---------+-------------+-----------+-----------+------------+
    | PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
    |---------+-------------+-----------+-----------+------------|
    | 2       | 3           | 3         | Fetch     | 2019-08-16 |
    | 3       | 2           | 2         | Scratch   | 2018-10-01 |
    +---------+-------------+-----------+-----------+------------+

    この場合、異なる結果が得られます。

    例6–演算子間の否定

    別の例を次に示します。今回はNOTを使用します BETWEENの結果を否定する演算子 オペレーター。

    SELECT * FROM Pets 
    WHERE DOB NOT BETWEEN '2018-10-01' AND '2020-09-17';

    結果:

    +---------+-------------+-----------+-----------+------------+
    | PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
    |---------+-------------+-----------+-----------+------------|
    | 1       | 2           | 3         | Fluffy    | 2020-11-20 |
    | 5       | 1           | 1         | Tweet     | 2020-11-28 |
    +---------+-------------+-----------+-----------+------------+

    この例では、DOBが存在するすべての行を返しました。 列はではありません 2018-10-01の間 および2020-09-17

    この場合、2つの行がその基準に一致したため、2つの行が返されました。

    これは、次のクエリの反対の結果です:

    SELECT * FROM Pets 
    WHERE DOB BETWEEN '2018-10-01' AND '2020-09-17';

    結果:

    +---------+-------------+-----------+-----------+------------+
    | PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
    |---------+-------------+-----------+-----------+------------|
    | 2       | 3           | 3         | Fetch     | 2019-08-16 |
    | 3       | 2           | 2         | Scratch   | 2018-10-01 |
    | 4       | 3           | 3         | Wag       | 2020-03-15 |
    | 6       | 3           | 4         | Fluffy    | 2020-09-17 |
    +---------+-------------+-----------+-----------+------------+

    この例では、DOBが存在するすべての行を返しました。 列です 2018-10-01の間 および2020-09-17

    この場合、4つの行がその基準に一致したため、4つの行が返されました。


    1. SQL参加の質問

    2. Oracleプロシージャでグローバル一時テーブルを使用する方法は?

    3. Python / postgres / psycopg2:挿入されたばかりの行のIDを取得

    4. MySQLロードエラーを修正するにはどうすればよいですか