MySQLでLEFT JOINを使ってMINUSクエリをシミュレートする方法
MySQLには、Oracleなどのデータベースで利用できるMINUS演算子(差集合を求める演算)が存在しません。しかし、LEFT JOINとIS NULLを組み合わせることで、MINUSクエリと同じ結果を簡単に再現できます。この記事では、実際のサンプルデータを使ってその方法をわかりやすく解説します。
前提:サンプルテーブルの準備
ここでは、次の2つのテーブル「Student_detail」と「Student_info」を使用します。それぞれの中身は以下の通りです。
mysql> Select * from Student_detail; +-----------+---------+------------+------------+ | studentid | Name | Address | Subject | +-----------+---------+------------+------------+ | 101 | YashPal | Amritsar | History | | 105 | Gaurav | Chandigarh | Literature | | 130 | Ram | Jhansi | Computers | | 132 | Shyam | Chandigarh | Economics | | 133 | Mohan | Delhi | Computers | | 150 | Rajesh | Jaipur | Yoga | | 160 | Pradeep | Kochi | Hindi | +-----------+---------+------------+------------+ 7 rows in set (0.00 sec) mysql> Select * from Student_info; +-----------+-----------+------------+-------------+ | studentid | Name | Address | Subject | +-----------+-----------+------------+-------------+ | 101 | YashPal | Amritsar | History | | 105 | Gaurav | Chandigarh | Literature | | 130 | Ram | Jhansi | Computers | | 132 | Shyam | Chandigarh | Economics | | 133 | Mohan | Delhi | Computers | | 165 | Abhimanyu | Calcutta | Electronics | +-----------+-----------+------------+-------------+ 6 rows in set (0.00 sec)
LEFT JOINでMINUSをシミュレートする
次のクエリでは、LEFT JOINを使って「Student_info」テーブルには存在するものの、「Student_detail」テーブルには存在しない「studentid」の値を抽出しています。これはまさにMINUS演算と同じ動作です。
mysql> SELECT studentid from student_info LEFT JOIN Student_detail USING(studentid) WHERE student_detail.studentid IS NULL; +-----------+ | studentid | +-----------+ | 165 | +-----------+ 1 row in set (0.07 sec)
結果として、Student_infoにのみ存在する学生ID「165」が返されました。
逆方向の差集合を取得する
今度は逆に、「Student_detail」テーブルには存在するが「Student_info」テーブルには存在しない「studentid」の値を取得してみましょう。JOINするテーブルの順序を入れ替えるだけで、反対方向の差集合が求められます。
mysql> SELECT studentid from student_detail LEFT JOIN Student_info USING(studentid) WHERE student_info.studentid IS NULL; +-----------+ | studentid | +-----------+ | 150 | | 160 | +-----------+ 2 rows in set (0.00 sec)
この場合、Student_detailにのみ存在する学生ID「150」と「160」が返されました。
仕組みのポイント
このテクニックが機能する理由は、LEFT JOINの特性にあります。LEFT JOINでは、左側のテーブルの全行を保持しつつ、右側のテーブルにマッチする行が存在しない場合はNULLが返されます。そこでWHERE 右側テーブル.カラム IS NULLという条件を加えることで、「相手側に対応する行が存在しないレコード」だけを抽出できます。これこそがMINUS(差集合)の動作と完全に一致するのです。なお、同様の目的にはNOT INやNOT EXISTSを使う方法もありますが、LEFT JOIN + IS NULLはインデックスが適切に設定されていれば高いパフォーマンスを発揮する、実務で広く使われる定番手法です。
-
MySQLクライアントの接続方法(TCP/IP・ソケットなど)を確認する方法
MySQLの接続にどの接続方式が使われているかを調べたい場合、以下のコマンドを実行することで確認できます。netstat -ln | grep mysqlなお、Unix系OSでは、MySQLプログラムはホスト名「localhost」を特別な方法で扱います。そのため、一般的に期待される動作とは異なる挙動を示す点に注意が必要です。接続タイプの確認方法mysqlコマンドラインクライアント(CLI)内から現在の接続タイプを知りたい場合は、次のコマンドを使用します。mysql> \s実行結果の出力例は以下のとおりです。Connection: 127.0.0.1 via TCP/IP または Con
-
MySQLでSELECTクエリの結果を並べ替える方法|ORDER BY句の基本と実践例
データベース操作では、テーブルから特定のデータや行を抽出することが日常的によくあります。通常、SELECT文で取得した行はテーブル内に格納されている順序で返されますが、場合によっては、特定の列を基準にして昇順または降順で並べ替えた結果を取得したいこともあるでしょう。そんなときに活躍するのが「ORDER BY」句です。以下で具体的な使い方を見ていきましょう。例えば、「name」フィールドを含む複数のカラムを持つテーブルがあるとします。テーブルからすべての行を取得したいけれど、名前のアルファベット順に並べ替えた状態で結果を受け取りたい——こうしたケースでは、ORDER BY句を使って「name」フ