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

MariaDBでどのように機能しないか

    MariaDBでは、NOT LIKE 演算子は、文字列がしないかどうかをテストするために使用されます パターンに一致します。 LIKEの逆を返します オペレーター。 NOTを適用するのと同じです LIKE全体に対する演算子 表現。

    パターンには、通常の文字と%を含めることができます および_ ワイルドカード文字。

    これらのワイルドカード文字については、次の表で説明しています。

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

    構文

    構文は次のようになります:

    expr NOT LIKE pat [ESCAPE 'escape_char']

    次の表があるとします。

    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       |
    +-------+-----------+---------+---------+------------+

    NOT LIKEの使用例を次に示します。 そのテーブルに対して:

    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で始まります 。

    これは、LIKEを使用した場合とは逆の結果セットです。 。その場合、ペットの名前が文字Fで始まる場合にのみ結果が得られます。 。

    大文字と小文字の区別

    NOT LIKE 式とパターンの照合で大文字と小文字が区別されない場合、大文字と小文字を区別しない部分文字列の一致を実行します。

    したがって、前の例を変更して、小文字のfを使用できます。 、それでも同じ結果が得られます:

    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       |
    +-------+-----------+---------+---------+------------+

    ただし、COLLATEを使用すると、大文字と小文字を区別して一致させることができます。 バイナリ照合を伴う句。または、CAST()を使用することもできます バイナリ文字列に強制変換します。

    例:

    SELECT *
    FROM Pets
    WHERE PetName NOT LIKE 'f%' COLLATE utf8_bin;

    結果:

    +-------+-----------+---------+---------+------------+
    | 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       |
    +-------+-----------+---------+---------+------------+

    今回は、テーブル全体が返されました。これは、小文字のfに一致するものがないためです。 。

    ただし、大文字のFに変更すると :

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

    結果:

    +-------+-----------+---------+---------+------------+
    | 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       |
    +-------+-----------+---------+---------+------------+

    予想通り、5試合があります。ペット名がFで始まる行 除外されます。

    数値引数

    数値引数は強制的にバイナリ文字列になります。

    SELECT * 
    FROM Pets 
    WHERE PetId NOT LIKE 1;

    結果:

    +-------+-----------+---------+---------+------------+
    | 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 |
    |     6 |         3 |       4 | Fluffy  | 2020-09-17 |
    |     7 |         3 |       2 | Bark    | NULL       |
    |     8 |         2 |       4 | Meow    | NULL       |
    +-------+-----------+---------+---------+------------+

    日付

    日付の例は次のとおりです:

    SELECT * 
    FROM Pets 
    WHERE DOB NOT LIKE '2020%';

    結果:

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

    NOT LIKEを使用することもできます DAYNAME()などの日付関数の結果に対する演算子 、MONTHNAME() 、など。

    SELECT * 
    FROM Pets 
    WHERE MONTHNAME(DOB) NOT LIKE 'Nov%';

    結果:

    +-------+-----------+---------+---------+------------+
    | 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 |
    +-------+-----------+---------+---------+------------+

    _ ワイルドカード演算子

    アンダースコア(_ )ワイルドカード演算子は任意の1文字に一致します。

    例:

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

    結果:

    +-------+-----------+---------+---------+------------+
    | PetId | PetTypeId | OwnerId | PetName | DOB        |
    +-------+-----------+---------+---------+------------+
    |     1 |         2 |       3 | Fluffy  | 2020-11-20 |
    |     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       |
    +-------+-----------+---------+---------+------------+

    この場合、2番目の文字がではないペットの名前を返しました。 e

    エスケープ文字

    アンダースコアまたはパーセント記号を検索する必要がある状況に陥ることがあります。このような場合は、円記号(\)を使用できます。 )これらの文字をエスケープします。これにより、ワイルドカード文字として解釈されるのを防ぐことができます。

    次の表があるとします。

    SELECT * FROM Owners;

    結果:

    +---------+-----------+----------+----------------+--------------------+
    | OwnerId | FirstName | LastName | Phone          | Email              |
    +---------+-----------+----------+----------------+--------------------+
    |       1 | Homer     | Connery  | (308) 555-0100 | [email protected]  |
    |       2 | Bart      | Pitt     | (231) 465-3497 | [email protected] |
    |       3 | Nancy     | Simpson  | (489) 591-0408 | NULL               |
    |       4 | Boris     | Trump    | (349) 611-8908 | NULL               |
    |       5 | Woody     | Eastwood | (308) 555-0112 | [email protected]  |
    |       6 | Burt      | Tyson    | (309) 565-0112 | [email protected]   |
    +---------+-----------+----------+----------------+--------------------+

    所有者2(Bart)のメールアドレスにアンダースコアが含まれていることに注意してください。

    しないときに何が起こるかの例を次に示します。 アンダースコアをエスケープする:

    SELECT * FROM Owners
    WHERE Email NOT LIKE 'b_%';

    結果:

    +---------+-----------+----------+----------------+-------------------+
    | OwnerId | FirstName | LastName | Phone          | Email             |
    +---------+-----------+----------+----------------+-------------------+
    |       1 | Homer     | Connery  | (308) 555-0100 | [email protected] |
    |       5 | Woody     | Eastwood | (308) 555-0112 | [email protected] |
    +---------+-----------+----------+----------------+-------------------+

    この場合、2行だけが返されました。メールアドレスがbで始まる2行を除外しました 、およびその後に他の1文字が続き、その後に任意の数の文字が続きます。また、nullの行も除外しました メールアドレス。

    ただし、アンダースコアをエスケープしなかったため、2番目の文字が何であるかは問題ではありませんでした。任意のと一致しました。 キャラクター。最初の行に2番目の文字の下線が含まれているという事実は、単なる偶然です。それが何か他のものであったとしても、それは一致したでしょう。

    しかし、2番目の文字として実際のアンダースコアを持つ電子メールアドレスのみを一致させたい場合はどうでしょうか?

    そこで、エスケープ文字が登場します。

    SELECT * FROM Owners
    WHERE Email NOT LIKE 'b\_%';

    結果:

    +---------+-----------+----------+----------------+-------------------+
    | OwnerId | FirstName | LastName | Phone          | Email             |
    +---------+-----------+----------+----------------+-------------------+
    |       1 | Homer     | Connery  | (308) 555-0100 | [email protected] |
    |       5 | Woody     | Eastwood | (308) 555-0112 | [email protected] |
    |       6 | Burt      | Tyson    | (309) 565-0112 | [email protected]  |
    +---------+-----------+----------+----------------+-------------------+

    結果にバートが追加されていることがわかります。

    エスケープ文字の変更

    エスケープ文字を変更することができます。これは、ESCAPEを使用して行うことができます 引数。

    例:

    SELECT * FROM Owners
    WHERE Email NOT LIKE 'b*_%' ESCAPE '*';

    結果:

    +---------+-----------+----------+----------------+-------------------+
    | OwnerId | FirstName | LastName | Phone          | Email             |
    +---------+-----------+----------+----------------+-------------------+
    |       1 | Homer     | Connery  | (308) 555-0100 | [email protected] |
    |       5 | Woody     | Eastwood | (308) 555-0112 | [email protected] |
    |       6 | Burt      | Tyson    | (309) 565-0112 | [email protected]  |
    +---------+-----------+----------+----------------+-------------------+

    この場合、アスタリスク(*)を割り当てました )エスケープ文字として。

    これは、特殊文字のエンコードなど、他の目的で円記号を使用する必要がある場合に便利です。このような場合、これらの文字を「ダブルエスケープ」する必要があり、混乱を招く可能性があります。したがって、エスケープ文字を変更すると、そのような状況で役立ちます。


    1. 1つのSQLクエリでOracle11gがより多くのCPUを消費するように強制できないのはなぜですか

    2. MYSQLからMYSQLIへの更新

    3. MicrosoftPowerBI内でデータを読み込んで管理する方法

    4. Oracleですべてのテーブルを一覧表示する方法