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

MySQLにおけるEXCEPTの代替方法:NOT IN演算子を使った差集合の取得手順を解説

MySQLにはEXCEPT句が存在しない?

SQL標準には、2つの結果セットの差を求めるためのEXCEPT演算子があります。しかし、従来のMySQLではEXCEPTを利用できないため、代わりにNOT IN演算子を使用するのが一般的な方法です。

この記事では、実際にテーブルを作成しながら、NOT IN演算子を使ってEXCEPTと同じ結果(差集合)を取得する手順を詳しく解説します。

サンプルテーブルの作成

まず、比較元となる1つ目のテーブルを作成します。

mysql> create table DemoTable
    (
    Number1 int
    );
Query OK, 0 rows affected (0.71 sec)

INSERT文を使って、いくつかのレコードを挿入します。

mysql> insert into DemoTable values(100);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values(200);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values(300);
Query OK, 1 row affected (0.13 sec)

DemoTableの中身を確認する

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

mysql> select * from DemoTable;

実行すると、次のような出力が得られます。

+---------+
| Number1 |
+---------+
| 100     |
| 200     |
| 300     |
+---------+
3 rows in set (0.00 sec)

2つ目の比較用テーブルを作成する

続いて、比較先となる2つ目のテーブルを作成します。

mysql> create table DemoTable2
    (
    Number1 int
    );
Query OK, 0 rows affected (0.52 sec)

こちらにもレコードを挿入しておきます。

mysql> insert into DemoTable2 values(100);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable2 values(400);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable2 values(300);
Query OK, 1 row affected (0.11 sec)

DemoTable2の中身を確認する

mysql> select * from DemoTable2;

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

+---------+
| Number1 |
+---------+
| 100     |
| 400     |
| 300     |
+---------+
3 rows in set (0.00 sec)

NOT IN演算子でEXCEPTと同じ結果を取得する

準備が整ったら、いよいよ本題です。NOT IN演算子とサブクエリを組み合わせることで、「DemoTableには存在するが、DemoTable2には存在しない値」を抽出できます。

mysql> select Number1 from DemoTable
where Number1 not in (SELECT Number1 FROM DemoTable2);

実行すると、以下のように「200」だけが返されます。これは、DemoTable(100・200・300)からDemoTable2に含まれる100と300を除外した結果であり、まさにEXCEPTと同等の動作です。

+---------+
| Number1 |
+---------+
| 200     |
+---------+
1 row in set (0.04 sec)

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

NOT INは便利な一方、サブクエリ側にNULLが含まれる場合、意図せず空の結果になるという落とし穴があります。NULLが混在する可能性がある場合は、LEFT JOIN ... IS NULLNOT EXISTSを使う方法も検討するとよいでしょう。

また、MySQL 8.0.31以降では標準のEXCEPT演算子がサポートされるようになりました。バージョンアップが可能な環境であれば、EXCEPTを直接利用することも選択肢に入ります。

まとめ

  • 従来のMySQLではEXCEPTが使えないため、NOT IN演算子で差集合を求めるのが定番。
  • 書き方は WHERE カラム名 NOT IN (SELECT ...) の形式。
  • NULLの扱いに注意し、必要に応じてNOT EXISTSやLEFT JOINも検討する。
  • MySQL 8.0.31以降ならEXCEPTを直接利用可能。
  1. MySQLのUNHEX()に相当するPHP関数とは?hex2bin()の使い方を解説

    PHPにおけるMySQLのUNHEX()相当の関数MySQLのUNHEX()関数と同じ処理をPHPで行いたい場合は、hex2bin()関数を使用します。この関数は、16進数形式の文字列をバイナリデータ(元の文字列)に変換するもので、まさにMySQLのUNHEX()に相当する機能を持っています。hex2bin()の基本構文構文は以下の通りです。$anyVariableName = hex2bin(yourHexadecimalValue);引数には16進数の文字列を指定し、戻り値として変換後のバイナリデータが返されます。PHPでの実装例実際にhex2bin()を使用したサンプルコードを見てみまし

  2. MySQLのSMALLINTに相当するJavaの型は?short型との対応関係を解説

    MySQLのSMALLINTに相当するJavaのデータ型は、short型です。Javaのshort型は2バイト(16ビット)の符号付き整数で、-32768から32767までの範囲の値を扱うことができます。MySQLのSMALLINTも同様に2バイトで、同じ範囲の値を格納可能です。MySQLのSMALLINTとJavaのshort型の比較項目MySQL(SMALLINT)Java(short)サイズ2バイト(16ビット)2バイト(16ビット)値の範囲-32768 ~ 32767-32768 ~ 32767備考UNSIGNEDを指定すると0 ~ 65535になる符号付きのみなお、MySQLでUNS