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つの行が返されました。