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

初心者向けのSQLOR演算子

    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の代替条件として評価された式 結果。

    この話の教訓は?複数の演算子を使用する場合は、括弧を使用してください。このようにして、各式を評価する正確な順序を指定できます。


    1. AmazonAWSでのMySQLまたはMariaDBデータベースのコールドスタンバイの構築

    2. ストアドプロシージャのパラメータとしてリストを渡すにはどうすればよいですか?

    3. T-SQLで日付から年を取得する方法

    4. 可能な限り2番目に高い給与の最良の方法を見つける