• ベストアンサー

SQL副問合せを使う理由

SQLを勉強中の者ですが、副問合せの部分を勉強中に 「副問合せを使う理由」がわからないので教えて欲しいと思い投稿しました。 副問合せ自体は理解したのですが、参考書やネットで副問合せについての説明や例題などをみると、 副問合せを使わなくても同等の結果を得られるような例題が多く、 なぜ副問合せを使うのか、その理由がよくわかりません。 場面場面で「使う理由」は違ってくるんだとは思いますが。。。。 処理効率の問題とかあるんでしょうか? 自分自身もSQL初心者な上に、会社の新人にSQLの基礎を教えてくれと 頼まれて引き受けた以上、わかりやすく教えてあげたい(自分も勉強したい)と思っています。 すみませんが、どなたか宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

大きくは3つあるとおもいます。 (1)副問い合わせでしかできない処理をおこなうため (2)副問い合わせの方で行う方が効率的な処理をおこなうため=高速化 (3)副問い合わせを行った方がフローがわかりやすい処理をおこなうため=汎用化 上記でない場合、SQL使用者のスキルがひくく、非効率な副問い合わせを している可能性は否定できません。

sigesl
質問者

お礼

yambejpさん、早速のご回答ありがとうございます。 (1)、(2)は、それこそSQL使用者のスキルがもの言う判断だと思います。 初心者からすると、副問合せはチョッとカッコいいSQL文になるかな? とも考えがちで、そちらで組んでしまおうと思ったりもすると思うのですが(私だけですかね(^^;; yambejpさんのご回答を読んで、不用意に副問合せを使わないという意識を持っておいたほうが良いのかなと 思いました。 ちなみに、参考書の例題を元にして以下の二つのSQLを実行して、 Object Browserの実行計画を見てみました。 結果、「recursive calls」の項や、「consistent gets」の項で大きな違いが現れていました。 (下記SQL2の方が効率的?でした) これは、副問合せを使ってはいけない典型的な例となるんでしょうね。 (SQL1) SELECT SUM(siire_suryo) FROM siire_tbl WHERE shohin_cd IN(SELECT shohin_cd FROM shohin_mst WHERE shohin_tnka = 100) (SQL2) SELECT SUM(TBL.siire_suryo) siire_suryo FROM siire_tbl TBL ,shohin_mst MST WHERE TBL.shohin_cd = MST.shohin_cd AND MST.shohin_tnka = 100 ご回答頂いて、とても助かりました。 またひとつ勉強になりましたし、新人君にも説明できる自信が持てました。 本当にありがとうございました。

その他の回答 (1)

  • Kazma_hk
  • ベストアンサー率26% (115/428)
回答No.2

ちょっと勘違いをしているようなので 下の例にあったSQLでSQL1が非効率なのは 副問合せを行っているからではなく、INを使用しているから だと思います。 INDEX情報が分からないのですが、INを使用するとINDEXを無視します そのため、実行公立は悪くなることが多々あります。

sigesl
質問者

お礼

なるほど、そうでしたか。 IN句を使わずに「=」で試してみたところ、おっしゃるとおりINDEXを使うようになり 「Consistent gets」も、今度はSQL1の方が効率的になっています。 何のプログラムでもそうだとは思いますが、覚えるのに苦労し、覚えたら覚えたで 今度はパフォーマンスを意識しなければと、特にSQLはこの「パフォーマンス」が 命取りになりそうな気がしています。 しっかり勉強したいと思います。 Kazma_hkさん、 ありがとうございました。

関連するQ&A

  • sqlの副問合せについて

    初級シスアドの勉強をしている者ですが、SQLの副問合せがさっぱり理解できません。副問合せとは、どのように抽出する文なのでしょうか?解る方、お手数かけますが教えていただければ幸いです。

  • 初心者からはじめるSQL

    初めまして。 全くSQLを知らない者です。 社内で移動があり、何故か私がSEになってしまいました。 会社ではOracleとSQLのスキルが必要になり、これから勉強しなければなりません。 会社では全くトレーニングをしてくれないので自分で勉強するしかなく、初心者から学ぼうと思っています。 そもそもSQLが何なのか、簡単にしか理解できていません。 しかも、調べてみたらものすごい種類のSQLがありますが、一体何があって何を勉強すれば良いのかも分りません。 会社からは、「SQL書き方ドリル」という本を渡されただけで全く意味が分りません。 どなたか教えて下さい。 宜しくお願い致します。

  • java,JSP,SQLが全て記載されている本を教えて下さい!

    java,JSP,SQLが全て記載されている本を教えて下さい! お世話になっております。 当方、今年SEとしてシステム開発会社に就職した者です。 現在、SQL → JSP → Javaの順で勉強をし、いよいよ本格的に業務に取り組み始めました。しかし、やはり実際の業務は難しく毎日苦戦をしております。お恥ずかしい話ですが、未だに論理的思考・ロジック回路(?)が頭の中で出来ておらず、アルゴリズムが自分で組めない状態にあります。そんな超超初心者な私ですが、それでも仕事として与えられた部分を期限までに作らなければなりません! 業務は、実際のところ難しくて私自身も詳しくは説明できないのですが、大枠として、『複雑なSQL文を含むjavaで処理をさせつつ、JSPに飛ばして表示させる』と言う処理をさせている様です。 この点を踏まえた上で、この3点(java,JSP,SQL)が全て記載されている、サンプルや例題が多い書籍をご存知でしたら、是非教えて下さい! 1冊ずつ個別にならいくらでもあるのですが、結局つまずいている処理が出来そうなコードを見つけても、どこにどうそれを入れたらよいのか、個別に見てもまだ理解が出来ません。上記で挙げた(業務のこと)様な、もしくはそれに近い事を挙げている本が欲しく、あれば、かつ、ご存知の方がいたら教えて頂ければと思い質問させて頂いた次第です。 本は参考書、逆引き辞典、教本など種類は問いません。また、値段や分厚さ等も一切問いません! ご回答頂ける方がいましたら、よろしくお願い致します。

    • ベストアンサー
    • Java
  • SQLスキル、とはどこまでを?

    (専門的なご意見がほしいので、このカテゴリを選択) データを扱う事務系の仕事で、SQLの知識やスキルを要求されることが多いです。 今までエンジニアやプログラミング系の職種以外は、SQLまで聞かれることはなかったのですが ここ最近で大変増えてきました為、仕事が決まりません。 あくまでも事務職なのですが、この場合のSQLとはどこまでを求めているのでしょう。 また、これから勉強するなら、何から手を付ける(あるいは、何を学ぶべき)のでしょうか。 自分が分かるのは、AccessとExcelのマクロ(自動処理の記録)、ExcelのVBA基礎です。 仕事例としては、顧客データベース管理やセールスのフォーキャスト分析レポート業務など。 決してIT系の職種とはなっておりません。 どのキャリアコンサルタントや派遣の担当者に聞いても、 「できるだけ理解しているに越したことはないようで・・・ プログラミングやITエンジニアの仕事ではありませんので・・・付随的な知識で欲しいみたいで・・・」 と、相手の要求をイマイチ理解していないようです。 彼ら自信がSQLについて知らないため、こちらにアドバイスしきれないのです。 どうかご教授ください。

  • 効率のいい集計SQL文

    プログラム勉強中の者です・・・ 効率のいいSQL文が書けずに困ってます・・。 みなさまどうかお助け下さい。m(_ _)m 以下のテーブルにおいて、 TABLE:SAMPLE ※主キー:CODE+PM | CODE| PM |PROFIT| ――――――――――― |  101 |  + |  200 | |  102 |  + |  300 | |  103 |  + |  400 | |  101 |  - |  100 | |  102 |  - |  200 | |  103 |  - |  300 | 「PROFIT」を「CODE」で集計する。 但し、「PM」が「+」の場合は加算「-」の場合は減算する。 で以下の様な結果を得たい、という要件です。 | CODE | PROFIT | ――――――――― |  101 |   100 | |  102 |   100 | |  103 |   100 | 私が考えた方法は SELECT CODE,SUM(PROFIT) FROM SAMPLE GROUP BY CODE として抽出したレコードをループさせて SELECT PROFIT FROM SAMPLE WHERE CODE = (ループ処理中のCODE) AND   PM = "-" の結果の2倍の値を減算していく、というモノなんですが、 これがとっても効率が悪く、データ量が増えると加速度的に 遅くなるのです。 1回のSQLで処理する方法、または もっと効率の良いロジックは無いでしょうか・・・ ちなみに環境はoracle9i+VB6です。 たぶん初歩的な事だと思うんですが、学習書やWebで調べる限りは うまい解決方が見つかりませんでした・・・。

  • SQLを勉強できるオススメの本教えてください!!(経験1年です。)

    こんばんわ。 プログラマー2年目のものです。 近頃、仕事をする中で自分のスキルの不十分さをひしひしと感じております。 学生時代は文系でしたので、このような勉強を始めて実質1年です。 SQLの知識は本当に基本中の基本がわかっているという程度です。 本日本屋でパラパラと本を見てきて 「独習SQL 第2版 黒石 博明 長谷川 裕行 」 を購入したのですが、ちょっと物足りない感じがあります。 今、仕事でチューニングに関する勉強をしているのですが、 全くついていけず、独自に勉強しようと思った次第です。 ○SQLの基本事項はわかっているが、実践面では経験がほとんどないため、実践的な勉強ができる ○長く複雑なSQL文にも対応できるようになりたい ○チューニングに関する勉強がしたい(全く知識がないため基礎から勉強したい) こんな私に当てはまる本がありましたら教えていただきたいです。 わかりづらくてすみません。 以上、お願いいたします。

  • 効率的なSQL習得方法を知りたい

    春のデータベース試験を受験しようと勉強を開始しましたが、過去問題の問題集などで、SQLの部分がなかなか理解できません。 回答例を読んでも、「あっ、そうか!」というひらめきは無く、「そういわれればそんな気がするなぁ」というような不十分な納得で終わっています。 「慣れるしかないよ」とアドバイスをくれる人も居ますが、実際にSQLを使える環境も無いので、ひたすらテキストとにらめっこしている状態です。 何か良い学習法をご存知の方は、お知らせください。 ・わかりやすい参考書 ・徐々に力が付くような参考書 ・効率的な学習方法 ・便利なホームページURL などが、特に知りたいです。 自分が何も知らないにもかかわらず、勉強会のリーダーを担当しているので、困っています。どうかお助けください。

  • 【初歩的な質問ですが・・・】 SQL文書き方がわかりません

    SQLの知識に乏しい者です。 よろしくお願い致します。 ●テーブルA ・会計コード ・年度 ・部署番号 ・社員番号 ・その他幾つかのデータ ※Where句で「年度>2002年」以降を抽出 のテーブルがあります。 この時、Bテーブルで ●テーブルB ・会計コード(主キー) ・年度 ・部署番号(主キー) ・社員番号(主キー) ・その他幾つかのデータ ※Aテーブルで抽出されたデータの中から絞り込む というテーブルを抽出するSQL文を組みたいのですが、効率の良いやり方がわかりません。 副問合せで  Select [B表で抽出した列名…]  From B表  Where 会計コード = (Select 会計コード               From A表               Where 年度 > '2002')  AND 部署番号 = (Select 部署番号             From A表               Where 年度 > '2002') ・・・・以下省略 の様に書くと効率が悪い気がしました。 (実際には、副問合せが6個書くことになるため) 良い書き方を知っている方がいらっしゃいましたら、よろしくお願い致します。

  • Web上でSQLの練習ができる?

    はじめまして、初めて投稿させて頂きます。 IT関連企業に勤めているものです。 現在オラクルの資格取得に向けて勉強中なのですが 実際にオラクルの環境でSQLを入力した事が無く 実際に資格を取得された方に、どのような勉強方法をされたか 知りたくて投稿させて頂きました。 オラクルのホームページから30日無料の試用版をダウンロードできるようですが、自分のパソコンがXPのホーム・エディションなのでいまだオラクルの画面を見た事もありません。 聞いた所によるとWEB上でデータベースを使用できるところもあるそうですが、それがどこなのかもよくわからない状態です。 何か知っている事がありましたら、ぜひ教えて下さい。 よろしくお願いします。

  • 同業他社への転職理由と会社間の問合せ

    http://okwave.jp/qa2538526.htmlで求職活動を改めて振り返り色々掘り下げています。関連して助言頂ければ助かります。 同業他社(病院の経理)の求人への応募を検討中です。珍しく35歳以上対象ですが管理職を見据えた求人ではないようです。 退職理由と応募理由、裏で問合せをされるか否かについて生の声をお願いします。 1 柱としては、 「病院という限定的ではなく企業などどこでも通用するような経理経験を積みたかった、 退職後家族の入退院が重なった事で長期契約で責任持てるか不安定な状況だった事、求職活動は絶えず続けていて臨時職員などで稼動中などタイミング的にも短期が長くなった、 結果、正社員への強い気持ちや非営利精神である病院での勤務が自分に合っていると再認識した」 を退職理由→長期にわたる短期歴→今回の志望理由へつなげようと思いますが、 率直にどう思われますか。 同業他社への転職理由は私自身は人間関係か倒産以外想像つかず、独身では特に他の方が何故退職するのかわからないのですが、成功した方はどこにポイントをおきましたか。 2 応募者の裏調査は横行しているようですが、病院という狭い業界での同業他社への応募で気をつけるべき点はありますか。 退職した病院に未だ求職活動中という事を知られたくないのですが、問合せされる事は覚悟すべきでしょうか。 3 送付状は横書便箋で手書きか、ワードでB5で社外文書的に作成するかどちらが一般的ですか。 具体的文例がわかれば助かります。リクナビ等でも文例がありますが、マニュアル的というか出来すぎな気がします。 意欲は万全、視野も広まった、人間としてもひと回り大きくなったと自信を持って言えるのですが、 書類選考や短い時間で端的に効率よく自分を表現できません。 派遣会社の方を含め採用側の印象や克服した方のアドバイスをお伺いできればと思います。

専門家に質問してみよう