ITサポート

セミナー

会員特典

その他

過去のコラム等

Twitter

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■第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  を使った式でも書けます。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━