2009/02/16
【誰にでもできる!システム開発】サブクエリ(前編)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
『誰にでもできる!システム開発』 2009/02/16 号
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ご愛読、ありがとうございます。
このメールマガジンは、システム開発を始めたばかりの方、これから始める
方向けに、筆者が日頃から心がけていることをお話しています。
扱う内容については、テクニックと考え方を半分ずつで構成しています。
思っていた内容と違う、つまらない、読む気力が無くなったという方、
購読解除はこちらからできます。
http://www.mag2.com/m/0000263428.html
著者プロフィール
http://www.shiga-it-office.com/mailmagazine/writer.html
事務所概要
http://www.shiga-it-office.com/profile.html
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■第32回 サブクエリ(前編)
────────────────────────────────────
時々、パフォーマンスが異常に遅いシステムを見かけることがあります。
ソースコードを見てみると、クエリの結果を一行ずつ取り出しながら、さら
にクエリを発行していることが多いです。
データベースへのアクセスは時間の掛かる処理ですので、できるだけ発行回
数を減らした方が、パフォーマンスは良くなります。
作成者に聞いてみると、クエリ結果として返ってきた値でクエリしたいから
などと言われるのですが、こんな方法を使わなくても、一回のクエリでまと
めて結果を取得することが可能です。
それが、サブクエリです。
サブクエリを使うことで、クエリの結果をクエリの一部として使うことがで
きるようになりますので、SQLの発行回数を減らすことができるようになり
ます。
実例を通して紹介しますので、以下のサンプルテーブルをご覧ください。
・取引明細
---------------------------------------------
| 取引番号 | 顧客コード | 商品コード | 数量 |
-----------+------------+------------+-------
| 00000001 | 0001 | A001 | 10 |
-----------+------------+------------+-------
| 00000002 | 0001 | B001 | 5 |
-----------+------------+------------+-------
| 00000003 | 0002 | A002 | 8 |
-----------+------------+------------+-------
| 00000004 | 0003 | A001 | 25 |
-----------+------------+------------+-------
| 00000005 | 0001 | B002 | 15 |
---------------------------------------------
・商品
----------------------------------
| 商品コード | 商品名 | 単価 |
-------------+------------+-------
| A001 | 抹茶ケーキ | 200 |
-------------+------------+-------
| A002 | モンブラン | 250 |
-------------+------------+-------
| B001 | クッキー | 80 |
-------------+------------+-------
| B002 | ビスケット | 70 |
-------------+------------+-------
| C001 | マシュマロ | 100 |
----------------------------------
●WHERE句のサブクエリ
WHERE句でサブクエリを使用すると、サブクエリの結果を条件式として利用
することができます。
以下の例では、商品名が抹茶ケーキとなっている商品コードをサブクエリで
返し、その商品コードに該当する取引明細を選択します。
SELECT
*
FROM
取引明細
WHERE
商品コード =
(SELECT 商品コード FROM 商品 WHERE 商品名 = '抹茶ケーキ')
ORDER BY
取引番号
---------------------------------------------
| 取引番号 | 顧客コード | 商品コード | 数量 |
-----------+------------+------------+-------
| 00000001 | 0001 | A001 | 10 |
-----------+------------+------------+-------
| 00000004 | 0003 | A001 | 25 |
---------------------------------------------
上記の例では、サブクエリの結果が1行ですので、「商品コード = 」と書
きましたが、複数行が返されるときは、IN句を使用します。
例として、単価が100円未満の商品を販売した取引明細を選択すると、以下
のようなサブクエリになります。
SELECT
*
FROM
取引明細
WHERE
商品コード IN (SELECT 商品コード FROM 商品 WHERE 単価 < 100)
ORDER BY
取引番号
---------------------------------------------
| 取引番号 | 顧客コード | 商品コード | 数量 |
-----------+------------+------------+-------
| 00000002 | 0001 | B001 | 5 |
-----------+------------+------------+-------
| 00000005 | 0001 | B002 | 15 |
---------------------------------------------
というように書くことができますが、このケースでしたら前回解説したJOIN
を使った式でも書けます。
------------------------------------------------------------------------
■編集後記
最後までお読みいただき、ありがとうございました。
Developers Summit 2009というカンファレンスに行ってきました。
2003年から毎年行われているのですが、技術の進歩に伴ってセッション内容
も変化しているのを感じます。
特に今年はクラウドに関する話題が豊富になった印象があります。
もちろん毎年前から話題にはなっていましたが、今年は具体的な技術が紹介
されており、注目度が伺えます。
実際、「Amazon EC2」、「Google App Engine」が公開され、マイクロソフ
トも「Windows Azure」を発表しています。
「ちょっとしたシステムをちょっとだけ使う」
クラウドは、そんな使い方で少しずつ普及しつつあるようです。
ご感想・ご意見・ご要望などありましたら、気軽にご連絡ください♪
では、また次回お会いしましょう!
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
『誰にでもできる!システム開発』 2009/02/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/
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━



