skillup

技術ブログ

Database

集合としてのSQL

投稿日:2016年11月22日 更新日:

今まで何度かSQLが集合ということを扱ってきました。

今回はそれがよくわかる例を。

実務ではあまりないと思うのですが、集合をイメージしやすい例題として、2つのテーブルが全く同じケースを考えます。

下記のような2つのテーブルがあるとします。(tbl_a,tbl_b)

keycol | col_1 | col_2 | col_3
——–+——-+——-+——-
A | 2 | 3 | 4
B | 0 | 7 | 9
C | 5 | 1 | 6

keycol | col_1 | col_2 | col_3
——–+——-+——-+——-
A | 2 | 3 | 4
B | 0 | 7 | 9
C | 5 | 1 | 6

この2つが全く同じかどうかはどう求めればよいのでしょうか。

実はUNIONを使えばOKのようです。

上記のSQLで行数がtbl_a(or tbl_b)とまったく同じになっていればOKです。

UNIONは全く同一の行を削除するからです。

UNIONは集合でいうと和集合を表し、上記の例だと2つの集合が完全に一致します。もし1レコードでも違うものがあれば数は4になります。

ちなみにSQLでは差集合も存在しまして、例えば下記のSQLだとなんのレコードもでてきませんが、もし違いがあればそのレコードが出てきます。

これを使って2つのテーブルが等しいか等しくないかを下記のSQLで判断できます。

ちなみにUNION(和集合)、INTERSECT(共通集合)、EXCEPT(差集合)は下記リンクのページのベン図で見るのが一番わかりやすいかと思います。

8. クエリの結合

集合論を使って問題を解いてみましょう。

例えば下記のようなskillsテーブルがあるとします。

skill
——–
Oracle
UNIX
Java

そして、下記テーブル(empskills)をみて、skillをすべて所有しているメンバーを抽出するにはどうしたらいいか考えてみましょう。

emp | skill
——–+——–
相田 | Oracle
相田 | UNIX
相田 | Java
相田 | C#
神崎 | Oracle
神崎 | UNIX
神崎 | Java
平井 | UNIX
平井 | Oracle
平井 | PHP
平井 | Perl
平井 | C++
若田部 | Perl
渡来 | Oracle

この問題はこのページに「すべての商品を持っている店舗はどれか」という問題と近いですね。というか趣旨自体は全く同じですね。

例えばある個人を特定し、下記のようなSQLを投げた場合、その人物が持っているskillが帰ってきます。これとskillsテーブルを比べて差分がなければすべてのスキルをマスターしているということになります。

例えば相田さんのスキルをskillsテーブルとの差分を取ってみましょう。

この場合結果が返ってきません。つまりレコードが存在していないわけなんですね。この状態が正しい状態です。あとはempを変数化し、NOT EXISTSを使えばいいのです。

答えのSQLは下記のようになります。

イメージ的には以前のリンクの問題よりはわかりやすいかなあと思います。

-Database
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

MySQLのLIMIT,OFFSETに関して&explainの見方など

自作のWEBアプリを作っていたところSELECT句が異常に遅いケースがありました。 発見までにかなり時間がかかったんですが、不可思議な現象としてはOFFSETが小さいときと大きいときで検索スピードが全 …

no image

SQL 更新系に関して

SQL実践入門、残り2章になりましたが、いやーむずいっす。 今回は9章を進めていますがSQLはもともと検索を主な用途として発展したため、SELECT文の使用がメインになります。 ですが、UPDATE文 …

no image

MySQL safe mode

MySQLに関してしっかりパスワードをチェックしていれば問題ありませんが、中にはrootパスワードをわすれた!なんてこともあるでしょう。 そんなときはsafe modeで実行することでrootのパスワ …

no image

MySQLのパフォーマンスチェックなどについて

常日頃MySQLをつかっているのですがパフォーマンスのチェックなどをあまりしていなかったため、これをチョクチョクしていこうかなあと思っております。 簡単に使えるツール(ただし5.1.4から)としては標 …

no image

MySQL小ネタ テーブル単位のリストア・SQLの小ネタ(バックスラッシュの検索)

MySQLのちょい小ネタ。 Contents1 テーブル単位でバックアップ&リストア2 バックスラッシュの入ったSQLについて テーブル単位でバックアップ&リストア 1 通常のdump(データベース単 …

アーカイブ