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

12一般的に使用されるSQL演算子

    SQLでは、演算子は1つ以上の式で実行されるアクションを指定する特殊文字またはキーワードです。

    SQL演算子はSQLの不可欠な部分であり、関連する結果を返すクエリを記述できます。

    この記事では、SQLクエリを作成するときに最も一般的に使用される12のSQL演算子を紹介します。

    等しい( = )オペレーター

    Equals演算子( = )は、おそらくSQLで最も一般的に使用される演算子です。 2つの式の同等性を比較します。 SQLに漠然と精通しているだけでも、おそらくこの演算子を知っているでしょう。

    ペットホテルのデータベースがあり、Fluffyという名前のすべてのペットに関する情報を取得したいとします。

    その場合、これを行うことができます:

    SELECT PetId, PetName, DOB 
    FROM Pets
    WHERE PetName = 'Fluffy';

    結果:

    +---------+-----------+------------+
    | PetId   | PetName   | DOB        |
    |---------+-----------+------------|
    | 1       | Fluffy    | 2020-11-20 |
    | 6       | Fluffy    | 2020-09-17 |
    +---------+-----------+------------+

    クエリではEquals演算子( =)を使用します ) PetNameの値が等しいかどうかを比較します 列と文字列Fluffy

    私たちの場合、ペットホテルには現在Fluffyという2匹のペットがいます。

    より大きい(> )オペレーター

    Greater Than演算子(> )2つの式を比較し、 TRUEを返します 左のオペランドの値が右のオペランドよりも大きい場合。それ以外の場合、結果は FALSEになります 。

    SELECT PetName, DOB 
    FROM Pets
    WHERE DOB > '2020-01-01';

    結果:

    +-----------+------------+
    | PetName   | DOB        |
    |-----------+------------|
    | Fluffy    | 2020-11-20 |
    | Wag       | 2020-03-15 |
    | Tweet     | 2020-11-28 |
    | Fluffy    | 2020-09-17 |
    +-----------+------------+

    この場合、 DOBの値を比較しています 列と日付2020-01-01 DOBかどうかを確認する 列が大きいです。

    未満( < )オペレーター

    より小さい演算子( < )反対のことをします。 2つの式を比較し、 TRUEを返します。 左のオペランドの値が右のオペランドよりも小さい場合。それ以外の場合、結果は FALSEになります 。

    SELECT PetName, DOB 
    FROM Pets
    WHERE DOB < '2020-01-01';

    結果:

    +-----------+------------+
    | PetName   | DOB        |
    |-----------+------------|
    | Fetch     | 2019-08-16 |
    | Scratch   | 2018-10-01 |
    +-----------+------------+

    以上(> = )オペレーター

    Greater Than or Equal To演算子(> = )2つの式を比較し、 TRUEを返します 左のオペランドの値が右のオペランド以上の場合。それ以外の場合は、 FALSEを返します 。

    SELECT PetName, DOB 
    FROM Pets
    WHERE DOB >= '2020-09-17';

    結果:

    +-----------+------------+
    | PetName   | DOB        |
    |-----------+------------|
    | Fluffy    | 2020-11-20 |
    | Tweet     | 2020-11-28 |
    | Fluffy    | 2020-09-17 |
    +-----------+------------+

    2020-09-17を返したことに注意してください そしてそれより大きいすべての日付。 Greater Than演算子(> )を使用した場合 )、最初の2行のみが返されます。

    以下( <= )オペレーター

    より小さいまたは等しい演算子( <= )2つの式を比較し、 TRUEを返します 左のオペランドの値が右のオペランド以下の場合。それ以外の場合、結果は FALSEになります 。

    SELECT PetName, DOB 
    FROM Pets
    WHERE DOB <= '2020-09-17';

    結果:

    +-----------+------------+
    | PetName   | DOB        |
    |-----------+------------|
    | Fetch     | 2019-08-16 |
    | Scratch   | 2018-10-01 |
    | Wag       | 2020-03-15 |
    | Fluffy    | 2020-09-17 |
    +-----------+------------+

    2020-09-17を返したことに注意してください そしてそれよりも少ないすべての日付。 Less Than演算子( <)を使用した場合 )、最初の3行のみが返されます。

    AND オペレーター

    AND 演算子は2つのブール式を組み合わせて、 TRUEを返します。 両方の式がTRUEの場合 。

    これが例です。

    SELECT PetId, DOB 
    FROM Pets
    WHERE PetName = 'Fluffy'
    AND DOB > '2020-01-01';

    結果:

    +---------+------------+
    | PetId   | DOB        |
    |---------+------------|
    | 1       | 2020-11-20 |
    | 6       | 2020-09-17 |
    +---------+------------+

    この場合、名前がFluffy andであるペットの詳細のみを取得します。 彼らの生年月日は2つの日付の間にあります。

    または オペレーター

    OR 演算子は2つのブール式を組み合わせて、 TRUEを返します。 いずれかの条件がTRUEの場合 。

    これが例です。

    SELECT 
        PetId, 
        PetName,
        DOB 
    FROM Pets
    WHERE PetName = 'Fluffy' OR PetName = 'Bark';

    結果:

    +---------+-----------+------------+
    | PetId   | PetName   | DOB        |
    |---------+-----------+------------|
    | 1       | Fluffy    | 2020-11-20 |
    | 6       | Fluffy    | 2020-09-17 |
    | 7       | Bark      | NULL       |
    +---------+-----------+------------+

    これは基本的にANDの反対です オペレーター。 ANDを使用した場合 、1つの列に同時に2つの異なる値を含めることはできないため、行は返されませんでした。

    BETWEEN オペレーター

    BETWEEN 演算子を使用すると、テストする範囲を指定できます。たとえば、2つの日付の間に生まれたペットを返すために使用できます。

    SELECT
        PetName,
        DOB
    FROM Pets
    WHERE DOB BETWEEN '2018-01-01' AND '2020-01-01';

    結果:

    +-----------+------------+
    | PetName   | DOB        |
    |-----------+------------|
    | Fetch     | 2019-08-16 |
    | Scratch   | 2018-10-01 |
    +-----------+------------+

    NOT オペレーター

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

    NOTを追加すると次のようになります 前の例の演算子。

    SELECT
        PetName,
        DOB
    FROM Pets
    WHERE DOB NOT BETWEEN '2018-01-01' AND '2020-01-01';

    結果:

    +-----------+------------+
    | PetName   | DOB        |
    |-----------+------------|
    | Fluffy    | 2020-11-20 |
    | Wag       | 2020-03-15 |
    | Tweet     | 2020-11-28 |
    | Fluffy    | 2020-09-17 |
    +-----------+------------+

    今回は他のすべてのペットを手に入れました– しなかったペット それらの日付の間に生まれました。

    MariaDBでは、 NOT INの無効化に制限されています 、 BETWEEN 、および EXISTS 条項。他のほとんどのDBMSでは、 NOTが許可されています 式を否定します。

    IN オペレーター

    IN 演算子は、指定された値がサブクエリまたはリストのいずれかの値と一致するかどうかを判別します。

    これが例です。

    SELECT 
        PetId, 
        PetName, 
        DOB 
    FROM Pets
    WHERE PetName IN ('Fluffy', 'Bark', 'Wag');

    結果:

    +---------+-----------+------------+
    | PetId   | PetName   | DOB        |
    |---------+-----------+------------|
    | 1       | Fluffy    | 2020-11-20 |
    | 4       | Wag       | 2020-03-15 |
    | 6       | Fluffy    | 2020-09-17 |
    | 7       | Bark      | NULL       |
    +---------+-----------+------------+

    2つのORを使用しても、同じ結果を得ることができます。 演算子:

    SELECT 
        PetId, 
        PetName, 
        DOB 
    FROM Pets
    WHERE PetName = 'Fluffy' 
        OR PetName = 'Bark' 
        OR PetName = 'Wag';

    ただし、 IN 演算子はそれを行うためのより簡潔な方法です。 IN 演算子は、比較する値のリストが長い場合に特に役立ちます。

    IN ほとんどの場合、演算子は複数の ORよりも高速に実行されます 演算子、特に大規模なデータセットの場合。

    INのもう1つの利点 演算子は、別の SELECTを含めることができるということです リスト。これはサブクエリとして知られています 。サブクエリは、別のクエリ(または別のサブクエリ)内にネストされたクエリです。

    これが例です。

    SELECT 
        PetTypeId,
        PetType
    FROM PetTypes
    WHERE PetTypeId IN ( SELECT PetTypeId FROM Pets );

    結果:

    +-------------+-----------+
    | PetTypeId   | PetType   |
    |-------------+-----------|
    | 1           | Bird      |
    | 2           | Cat       |
    | 3           | Dog       |
    +-------------+-----------+

    この例は、ペットホテルにペットの種類がいくつあるかを示しています。

    NOTを使用できます これを裏返して、ペットの種類がいくつあるかを確認するオペレーター 私たちのペットホテルで。

    SELECT 
        PetTypeId,
        PetType
    FROM PetTypes
    WHERE PetTypeId NOT IN ( SELECT PetTypeId FROM Pets );

    結果:

    +-------------+-----------+
    | PetTypeId   | PetType   |
    |-------------+-----------|
    | 4           | Rabbit    |
    +-------------+-----------+

    したがって、データベースにはペットタイプの Rabbit が含まれています 、しかし現在、ペットとしてのウサギはいない。

    + および|| 文字列連結演算子

    + および|| 文字列連結演算子を使用すると、文字列を連結できます。文字列の連結は、文字列をエンドツーエンドで結合する操作です。

    同じことを行う2つの演算子をリストした理由は、 + 演算子はSQLServerでサポートされており、 || 演算子は、DB2、Oracle、PostgreSQL、SQLiteでサポートされています。

    これがSQLServerで機能する例です。

    SELECT 
        FirstName,
        LastName,
        FirstName + LastName
    FROM Owners;

    結果:

    +-------------+------------+--------------------+
    | FirstName   | LastName   | (No column name)   |
    |-------------+------------+--------------------|
    | Homer       | Connery    | HomerConnery       |
    | Bart        | Pitt       | BartPitt           |
    | Nancy       | Simpson    | NancySimpson       |
    | Boris       | Trump      | BorisTrump         |
    +-------------+------------+--------------------+

    この場合、所有者の名と姓は異なる列に格納されます。 SELECTで リストでは、最初にそれらを個別に取得しますが、連結演算子を使用してそれらを結合し、再度取得します。

    ただし、結果にはいくつかの問題があります。

    • 名前と名前の間にスペースはありません。
    • 列名はありません。

    幸い、これは簡単に修正できます。

    同じ連結操作を使用して、名と姓の間にスペースを含めることができます。

    また、結果セットに列名を指定するために、連結された結果に列エイリアスを使用できます。

    SELECT 
        FirstName,
        LastName,
        FirstName + ' ' + LastName AS FullName
    FROM Owners;

    結果:

    +-------------+------------+---------------+
    | FirstName   | LastName   | FullName      |
    |-------------+------------+---------------|
    | Homer       | Connery    | Homer Connery |
    | Bart        | Pitt       | Bart Pitt     |
    | Nancy       | Simpson    | Nancy Simpson |
    | Boris       | Trump      | Boris Trump   |
    +-------------+------------+---------------+
    >

    DB2、Oracle、PostgreSQL、SQLiteを使用している場合は、 +を交換してください ||の場合 正常に動作するはずです。

    MySQLまたはMariaDBを使用している場合は、 CONCAT()を使用する必要があります 文字列を連結する関数。

    LIKE オペレーター

    LIKE 演算子を使用すると、パターンマッチングを実行できます。特定の文字列が指定されたパターンと一致するかどうかを判別します。パターンには、通常の文字とワイルドカード文字を含めることができます。

    SELECT 
        FirstName,
        LastName,
        Email
    FROM Owners
    WHERE Email LIKE '%.com';

    結果:

    +-------------+------------+-------------------+
    | FirstName   | LastName   | Email             |
    |-------------+------------+-------------------|
    | Homer       | Connery    | [email protected] |
    | Bart        | Pitt       | [email protected]  |
    +-------------+------------+-------------------+

    この例では、 LIKEを使用しました と組み合わせた演算子 メールアドレスが.comで終わる所有者を返すワイルドカード演算子 。

    ボーナスオペレーター! ワイルドカード演算子

    ワイルドカード演算子は、0文字以上の任意の文字列に一致します。プレフィックスまたはサフィックスとして使用でき、文字列の途中でも使用できます。

    接尾辞としてより一般的に使用される傾向があり、パターンの途中での使用は制限されていますが、次のように、パターンの途中で使用するための有効なユースケースがいくつかあります。

    SELECT 
        FirstName,
        LastName,
        Email
    FROM Owners
    WHERE Email LIKE '[email protected]%.com';

    結果:

    +-------------+------------+------------------+
    | FirstName   | LastName   | Email            |
    |-------------+------------+------------------|
    | Bart        | Pitt       | [email protected] |
    +-------------+------------+------------------+

    この場合、バートのメールアドレスはわかりませんでしたが、 [email protected]で始まっていることはわかっていました。 .comで終わりました 。したがって、 LIKEを使用することができました と組み合わせて 残りを入力するワイルドカード演算子。

    この手法では、データやSQLステートメントの作成方法によっては、無関係な行が多数返される可能性があることに注意してください。

    LIKEを含むクエリにも注意してください 句の実行速度は他のクエリよりも大幅に遅くなる可能性があるため、 LIKEの使用はおそらく避けてください。 あなたが本当にそれを必要としない限り、節。 を使用する 接頭辞としての演算子は特に遅くなる可能性があります。

    それはあなたがそれを全く使うべきではないということではありません。 LIKE 演算子はSQLの不可欠な部分であり、それが唯一のオプション(または少なくとも最良のオプション)になる多くのシナリオに遭遇します。

    その他のSQL演算子

    ここに含まれていない他の多くの演算子については、SQL演算子の完全なリストを参照してください。


    1. ブールパラメータをOracleプロシージャC#に渡す方法

    2. 新しいテーブルが作成されているときにのみ実行するトリガーを作成する

    3. PostgreSQLデータベースからの画像の表示、bytea

    4. ClusterControlを使用した高可用性データベースとクラスターのデプロイ