MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLでWHERE id != 5 AND id != 10のような複数の除外条件をまとめて書く方法はある?NOT IN演算子の使い方を解説

結論:NOT IN演算子を使えば複数の除外条件を1つにまとめられる

はい、MySQLにはNOT INという演算子が標準で用意されており、id != 5 AND id != 10 AND id != 15のような複数の否定条件を、はるかにシンプルな形で記述できます。

条件が増えるたびにANDでつなぐ従来の書き方は冗長になりやすいため、除外したい値が複数ある場合はNOT INを使うのが一般的です。

NOT INの基本構文

SELECT * FROM yourTableName WHERE yourColumnName NOT IN(1, 2, 7);

この構文では、指定したカラムの値が括弧内のリスト(例:1, 2, 7)のいずれにも一致しない行だけを取得できます。リストに含める値の数に制限はなく、3つでも10個でも同じ書き方で対応可能です。

実際の使用例:サンプルテーブルを作成する

構文の動作を確認するため、まずテーブルを作成します。

mysql> create table User_informations
    -> (
    -> UserId int,
    -> UserName varchar(20)
    -> );
Query OK, 0 rows affected (0.47 sec)

次に、INSERT文でレコードを追加します。

mysql> insert into User_informations values(12,'Maxwell');
Query OK, 1 row affected (0.17 sec)
mysql> insert into User_informations values(7,'David');
Query OK, 1 row affected (0.10 sec)
mysql> insert into User_informations values(1,'Ramit');
Query OK, 1 row affected (0.36 sec)
mysql> insert into User_informations values(10,'Bob');
Query OK, 1 row affected (0.19 sec)
mysql> insert into User_informations values(2,'Carol');
Query OK, 1 row affected (0.14 sec)
mysql> insert into User_informations values(14,'Sam');
Query OK, 1 row affected (0.23 sec)
mysql> insert into User_informations values(6,'Mike');
Query OK, 1 row affected (0.12 sec)
mysql> insert into User_informations values(4,'Robert');
Query OK, 1 row affected (0.13 sec)

テーブルの中身を確認する

SELECT文ですべてのレコードを表示してみましょう。

mysql> select *from User_informations;

実行結果は以下のとおりです。

+--------+----------+
| UserId | UserName |
+--------+----------+
|     12 | Maxwell  |
|      7 | David    |
|      1 | Ramit    |
|     10 | Bob      |
|      2 | Carol    |
|     14 | Sam      |
|      6 | Mike     |
|      4 | Robert   |
+--------+----------+
8 rows in set (0.00 sec)

合計8件のレコードが登録されていることがわかります。

NOT INを使って特定のIDを除外して取得する

それでは、本題である「UserIdが1、2、7以外のレコードを取得する」クエリをNOT INで実装します。これはWHERE UserId != 1 AND UserId != 2 AND UserId != 7と書くのと完全に同じ意味になります。

mysql> select *from User_informations where UserId NOT IN(1,2,7);

実行結果は以下のとおりです。

+--------+----------+
| UserId | UserName |
+--------+----------+
|     12 | Maxwell  |
|     10 | Bob      |
|     14 | Sam      |
|      6 | Mike     |
|      4 | Robert   |
+--------+----------+
5 rows in set (0.00 sec)

結果を見ると、UserIdが1(Ramit)、2(Carol)、7(David)の3件が除外され、残りの5件だけが返されています。

補足:NOT IN使用時の注意点

NOT INは非常に便利ですが、対象カラムにNULLが含まれる可能性がある場合は注意が必要です。NULLとの比較は常にUNKNOWNと評価されるため、リストにNULLが混ざると意図せず全行が除外されることがあります。そのようなケースではNOT EXISTSLEFT JOIN ... IS NULLの利用も検討するとよいでしょう。


  1. MySQLのLIKE演算子とCONCAT関数を使って複数のカラムを横断して同じ値を検索する方法

    MySQLでは、LIKE演算子とCONCAT()関数を組み合わせることで、複数のカラムを連結した文字列に対して部分一致検索を行うことができます。これにより、例えば「名前」と「科目」といった別々のフィールドにまたがる値を、1つの条件でまとめて検索できるようになります。ここでは、実際にテーブルを作成し、複数のカラムにわたる検索を行う手順を具体的なサンプルコードとともに解説します。サンプルテーブルの作成まず、学生名と科目を格納するテーブルを作成します。mysql> create table DemoTable-> (-> StudentName varchar(20),->

  2. MySQLの単一クエリでSELECT LIKEとCHAR_LENGTH()を組み合わせて使う方法

    はじめにMySQLでは、LIKE句による部分一致検索と、CHAR_LENGTH()関数による文字数の条件指定を、1つのクエリ内で同時に組み合わせることができます。これにより、「特定の文字列を含み、かつ文字数が一定以下であるレコードだけを抽出する」といった柔軟なデータの絞り込みが可能になります。本記事では、実際にテーブルを作成し、データを挿入しながら、その具体的な手順を解説します。サンプルテーブルの作成まず、テーブルを作成します。mysql> create table DemoTable -> ( -> Name varchar(20) -> );Que