2009/03/16
【誰にでもできる!システム開発】SQLの小技
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
『誰にでもできる!システム開発』 2009/03/16 号
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ご愛読、ありがとうございます。
このメールマガジンは、システム開発を始めたばかりの方、これから始める
方向けに、筆者が日頃から心がけていることをお話しています。
扱う内容については、テクニックと考え方を半分ずつで構成しています。
著者プロフィール
http://www.shiga-it-office.com/mailmagazine/writer.html
事務所概要
http://www.shiga-it-office.com/profile.html
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■第34回 SQLの小技
────────────────────────────────────
前々回、前回とサブクエリを説明しました。
今回は、その応用を紹介したいと思います。
実例を通して紹介しますので、以下のサンプルテーブルをご覧ください。
・取引明細2月
---------------------------------------------
| 取引番号 | 顧客コード | 商品コード | 数量 |
-----------+------------+------------+-------
| 09020001 | 0001 | A001 | 10 |
-----------+------------+------------+-------
| 09020002 | 0001 | B001 | 5 |
-----------+------------+------------+-------
| 09020003 | 0002 | A002 | 8 |
-----------+------------+------------+-------
| 09020004 | 0003 | A001 | 25 |
-----------+------------+------------+-------
| 09020005 | 0001 | B002 | 15 |
---------------------------------------------
・取引明細3月
---------------------------------------------
| 取引番号 | 顧客コード | 商品コード | 数量 |
-----------+------------+------------+-------
| 09030001 | 0001 | A001 | 15 |
-----------+------------+------------+-------
| 09030002 | 0005 | C001 | 10 |
-----------+------------+------------+-------
| 09030003 | 0006 | B002 | 20 |
-----------+------------+------------+-------
| 09030004 | 0007 | A001 | 5 |
-----------+------------+------------+-------
| 09030005 | 0008 | A002 | 3 |
---------------------------------------------
・商品
----------------------------------
| 商品コード | 商品名 | 単価 |
-------------+------------+-------
| A001 | 抹茶ケーキ | 200 |
-------------+------------+-------
| A002 | モンブラン | 250 |
-------------+------------+-------
| B001 | クッキー | 80 |
-------------+------------+-------
| B002 | ビスケット | 70 |
-------------+------------+-------
| C001 | マシュマロ | 100 |
----------------------------------
●片方にあって、もう片方に無いデータ
2月は売れていたけど3月になったら売れなくなった商品を知りたい場合、
取引明細2月にあるが、取引明細3月に存在しない商品コードを選択すれば
よいことになります。
取引明細2月をベースにして、取引明細3月に存在する商品すべてを否定し
た以下のようなサブクエリで実現できますね。
SELECT
商品コード
FROM
取引明細2月
WHERE
商品コード NOT IN (
SELECT
商品コード
FROM
取引明細3月
)
--------------
| 商品コード |
--------------
| B001 |
--------------
また、このケースでは以下のように記述しても全く同じ結果が得られます。
SELECT
商品コード
FROM
取引明細2月
WHERE
NOT EXISTS (
SELECT *
FROM
取引明細3月
WHERE
取引明細2月.商品コード = 取引明細3月.商品コード
)
2つのSQLの違いは何でしょうか?
実は大きな違いがあるのです。
最初のSQLでは、サブクエリ結果をNOT INとしています。
INは、指定したもの全てに対し、対象であるかをチェックします。
一方、2番目のSQLでは、NOT EXISTSを使用しています。
EXISTSは存在確認の構文であり、一つでも存在するかを返すため、対象全て
をチェックはしません。
取引明細2月、取引明細3月ともに、商品コードにA001が複数存在します。
NOT EXISTSを使用すると、A001が最初に一致した段階で存在確認が終わるた
め、それ以降の組み合わせについてチェックをせず、その分早くなります。
そして、本来の目的も「2月に存在して、3月に存在しない商品を求める」
ということですので、存在確認であるEXISTS構文を使用する方が、目的と手
段が一致しているとも言えますね。
●複数のクエリ結果を結合する
取引量の多い商品を知るため、2月分・3月分の取引数量が10以上の明細を
まとめてみましょう。
例えば2月分であれば、
SELECT
*
FROM
取引明細2月
WHERE
数量 >= 10
となります。
3月分も、テーブル名が変わるだけですね。
そして、クエリ結果を結合するには、UNIONを使用します。
SELECT
*
FROM
取引明細2月
WHERE
数量 >= 10
UNION ALL
SELECT
*
FROM
取引明細3月
WHERE
数量 >= 10
---------------------------------------------
| 取引番号 | 顧客コード | 商品コード | 数量 |
-----------+------------+------------+-------
| 09020001 | 0001 | A001 | 10 |
-----------+------------+------------+-------
| 09020004 | 0003 | A001 | 25 |
-----------+------------+------------+-------
| 09020005 | 0001 | B002 | 15 |
-----------+------------+------------+-------
| 09030001 | 0001 | A001 | 15 |
-----------+------------+------------+-------
| 09030002 | 0005 | C001 | 10 |
-----------+------------+------------+-------
| 09030003 | 0006 | B002 | 20 |
---------------------------------------------
------------------------------------------------------------------------
■編集後記
最後までお読みいただき、ありがとうございました。
前回宣言したとおり、今回で最終回となります。
創刊が昨年の5月19日ですので、約10ヶ月間に渡って配信してきたことにな
ります。
その間、日本経済は大きく減退しておりまして、その影響はソフトウェア業
界にも及んでおります。
かつてソフトウェア業界は成長を続けていて、慢性的な人不足だと言われて
おりました。
営業同士が顔を合わせれば、「誰でもいいから人いない?」が合言葉みたい
なもので、そんな時代だったからなのか、全くの素人が人材派遣に参入して
それなりに成功することも珍しくありませんでした。
案件リストが営業の間で回ってくるので、エンジニアをどんどん送り込んで
いきます。請負の請負で案件が回ってきますので、エンドユーザーからみて
何次請けなのか分からないことも多いです。
それでも人を回し続ければお金が入ってきますので、誰でもいいから人をか
き集めて送り込み続けるというビジネスが出来上がります。
派遣バブルですね。
しかし、状況は変わっています。
「何でもいいから仕事無い?」が合言葉になりつつあります。
力の無い会社、エンジニアには生きにくい時代になってきたのです。
価値を作り出せない人・会社は市場から追い出されます。
これは当然のことなのですが、市場が成長しているときには見落とされがち
になります。
このメールマガジンを創刊したのは、そんな状況を予想してのことでした。
下手な文章ではありましたが、皆さんに支えられて、ここまで発行すること
ができました。
本当にありがとうございました。
なお、「誰にでもできる!インターネット活用術」は今後も変わらず配信を
続けていきますので、まだご購読されていない方は是非ご登録ください。
http://www.mag2.com/m/0000263426.html
ご感想・ご意見・ご要望などありましたら、気軽にご連絡ください♪
ご購読ありがとうございました!
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
『誰にでもできる!システム開発』 2009/03/16 号
本日のメールマガジンを読んだ感想をお聞かせください。
お寄せいただいた感想は、メールマガジン上で紹介させていただくことが
ありますので、ご了承ください。
配信中止はこちらから↓
http://www.mag2.com/m/0000263428.html
メールアドレスの変更はこちらから↓
http://www.mag2.com/m/0000263428.html
ご意見&ご感想はこちらから↓
http://www.shiga-it-office.com/mailmagazine/ImpressionFrom.html
コンサルティングのご相談はこちらから↓
http://www.shiga-it-office.com/inquiry.html
発行元 志賀IT事務所
http://www.shiga-it-office.com/
関連メールマガジン 「誰にでもできる!インターネット活用術」
http://www.mag2.com/m/0000263426.html
関連ブログ
☆コンサル日和
http://d.hatena.ne.jp/kei_onpu/
☆爆裂!C#野郎
http://csharp.yaminabe.info/
☆10年戦える開発技術
http://10year.yaminabe.info/
☆情報処理技術者試験午前対策
http://am.yaminabe.info/
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


