SQLでは、OR
演算子を使用すると、クエリをフィルタリングするときに代替条件を使用できます。
OR
演算子は2つの条件を組み合わせて、TRUE
を返します いずれかの条件がTRUE
の場合 。
ソーステーブル
このページの例では、次の表を使用しています。
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)
例
OR
を示す簡単な例を次に示します。 オペレーター。
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR PetName = 'Tweet';
結果:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | +---------+-------------+-----------+-----------+------------+
PetName
が実際に行を返したことがわかります。 列はFluffy
のいずれかでした またはTweet
。他の行は返されませんでした。
異なる列
前の例では、両方の条件が同じ列に対して値を比較していましたが、これは必須ではありません。 OR
の両側の式 演算子は、異なる列を使用して値を比較できます。 OR
オペレーターは単にTRUE
を返します これらの条件のいずれかがTRUE
の場合 。
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR DOB < '2020-01-01';
結果:
+---------+-------------+-----------+-----------+------------+ | 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 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | +---------+-------------+-----------+-----------+------------+
他のオペレーターと組み合わせる
フィルタリング基準では、OR
に加えて他の演算子を使用する式を組み合わせることができます オペレーター。
AND
を含む例を次に示します オペレーター。
SELECT * FROM Pets
WHERE (PetName = 'Fluffy' OR PetName = 'Tweet')
AND DOB >= '2020-11-20';
結果:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +---------+-------------+-----------+-----------+------------+
OR
を囲んでいることに注意してください 括弧付きの条件。私がそれをした理由は、デフォルトでOR
演算子はAND
の後に評価されます 演算子。 SQLには、式内の演算子の優先順位が定義されており、これにより、AND
演算子はOR
の前に評価されます オペレーター。
ただし、括弧を使用して、式で定義されている演算子の優先順位をオーバーライドできます。括弧内はすべて、単一の値を返すように評価されます。その値は、これらの括弧の外のすべての演算子で使用できます。
つまり、括弧を使用して、式で各論理演算子を評価する順序を指定できます。
なぜこれが問題なのですか?
かっこを外したときの結果を見てください。
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR PetName = 'Tweet'
AND DOB >= '2020-11-20';
結果:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | +---------+-------------+-----------+-----------+------------+
実際には異なる結果が得られます。
これは、クエリがPetName = 'Tweet' AND DOB >= '2020-11-20'
をチェックするようになったためです。 まず、OR
を確認します 式PetName = 'Fluffy'
。
AND
をかっこで囲んでいるかのようです このような表現:
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR (PetName = 'Tweet'
AND DOB >= '2020-11-20');
ただし、さらに混乱させるために、かっこを使用しないようにクエリを再配置しても、かっこを使用した最初の例と同じ結果を得ることができます。
このように:
SELECT * FROM Pets
WHERE DOB >= '2020-11-20'
AND PetName = 'Fluffy' OR PetName = 'Tweet';
結果:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +---------+-------------+-----------+-----------+------------+
この場合、AND
予想通り、式が最初に評価されました。 DOB >= '2020-11-20' AND PetName = 'Fluffy'
となるように、式の順序がたまたま並んでいます。 最初に評価されたので、DOB
のためにFluffyと呼ばれる他のペットを除外しました その範囲外になります。その後、OR
既存のAND
の代替条件として評価された式 結果。
この話の教訓は?複数の演算子を使用する場合は、括弧を使用してください。このようにして、各式を評価する正確な順序を指定できます。