見出し画像

【デスペ5問】SQLの結果(データベーススペシャリスト)

このNoteでは、デスペAMIIから「SQL文の実行結果」を問う問題を特集しました。

FEではSELECT文。せいぜいORDER, GROUP, 2表結合ぐらいでしたが、APではレベル上がりましたね。外部結合やCURSORも出始めました。

DBではさらに、副問合せ・相関副問合せ・複雑な外部結合が絡んできます。私は午後問題はデータベース設計に絞りますが、AMIIレベルの正解力は持つように対策しました。

大学受験で「(高校の理科が選択制なので)生物学科の入試で生物を解かずに合格できるってどうなの」と取り沙汰された時期がありました(高校理系が、化学+物理or生物or地学、な弊害です)。

DBでも「データベースの最高資格なのに、SQLなしで合格するってどうなん?」という思想からか、データベース設計に寄せてもSQLが入ってくる傾向も若干見られます。

私は「SQLはPCでやれるんだから紙面で解きたくない」って思想が強いのですが、出る可能性がある以上は仕方ありません。SQL完全回避はできないので、AMII程度は解けるぐらいにはなっておきましょう。

ちょっとネガティブな感じになりました。すみません。

このNoteは「SQLシリーズ」になると思います。問題を分類して、段階的に学んでいけるようにしますね。

それでは始めましょう!


\私の4ヶ月勉強法/



副問合せと相関副問合せ


SQLの内側、特にWHERE句にSELECT文が含まれることがあります。

副問合せ・相関副問合せという少しややこしい処理になります。


副問合せ:SQL文(主問合せ)の中で、別のSELECT文(副問合せ)を含んでいるときに発生。IN句を使うのが代表的。

相関副問合せ:副問合せで主問合せの表を使う時に発生。主問合せの表を1行取り出し、副問合せを実行する。EXISTS句を使うのが代表的。


副問合せが簡単なので、そちらだけでもできるようになっておきましょう。

簡易的な見分け方として、INの前には比較する項目があり(WHERE 項目 IN ~)、EXISTSの前にはない(WHERE EXITS ~)。




副問い合わせ1 | IN


IN句は簡単なので正解できるようになりましょう。

データベーススペシャリスト 平成24年午前2問11より

正答は、ア。

まずINの中身から。社員表の部門が2000以下の社員番号を抽出するので、11111, 22222。

次はSELECT句。プロジェクト表の社員番号と一致するものを抽出するので、(P001, 11111), (P001, 22222)。


INは考えやすいですね。





相関副問合せ | EXISTS


データベーススペシャリスト 平成30年午前2問05より
データベーススペシャリスト 令和02年午前2問08より
データベーススペシャリスト 令和04年午前2問08より

正答は、ウ。


EXISTS内のSELECTを処理していきます。

社員コードS001を取り出して、上司コードを順番に比較します。上司コードS001と一致します、しかも2回。ここで、NOT EXISTSが条件なので、判定は偽。主問合せでの出力結果はありません。

次、社員コードS002を取り出して比較すると、上司コードに一致するものはありません。NOT EXISTSの判定は真。よって主問合せとしてS002が出力されます。

次、社員コードS003を取り出して比較すると、上司コードに一致する行があったので、NOT EXISTSの判定は偽。

以上ようにやります。まとめると。

  • S001:一致あり:NOT EXISTS判定は、偽

  • S002:一致なし:NOT EXISTS判定は、真

  • S003:一致あり:NOT EXISTS判定は、偽

  • S004:一致なし:NOT EXISTS判定は、真

  • S005:一致あり:NOT EXISTS判定は、偽

  • S006:一致あり:NOT EXISTS判定は、偽

  • S007:一致なし:NOT EXISTS判定は、真

よって、判定が真となった「S002, S004, S007」が出力されます。




相関副問合せ2 | EXISTSを使わない


EXISTSを使わない相関副問合せもあります。「WHERE句内の副問合せで、主問合せで使う表を使っている」場合に生じます。

データベーススペシャリスト 平成26年午前2問16より

正答は、ウ。

WHERE句内の副問合せで、主問合せで使う表Aを使っているので、相関副問合せになります。

A表から1行取り出して副問合せを処理していくのを繰り返します。

まずA表1行目の150が、B表と比べられます。150<B.総販売数を満たすのは、4個(250, 400, 400, 500)。

次にA表2行目の250が取り出され、250<B.総販売数を満たすのは、3個(400, 400, 500)。

以上のように、A表から1行ずつ取り出しながら考えていきます。

  • P001:150:4個:3>ではない

  • P002:250:3個:3>ではない

  • P003:150:4個:3>ではない

  • P004:400:1個:3>である

  • P005:400:1個:3>である

  • P006:500:0個:3>である

  • P007:  50:6個:3>ではない

以上より、P003, P004, P006が出力されます。




EXCEPT | 簡単だかドレア


EXCEPTは「例外」とか「除く」という意味です。

SQL文ではレア問題ですが、出たら確実に取りたいです。簡単なので。

データベーススペシャリスト 令和03年午前2問06より

正答は、エ。

A EXCEPT Bは、AからBを引きます。「商品表から抽出するよ、でも当月商品仕入合計表に載ってるのは除外してね」というイメージ。

商品表の仕入先コードから、当月商品仕入合計表の仕入れコードを引きます。つまりK01, K02, K03, K04から、K01, K03, K05を引いて、K02, K04が残ります。




ビューと左外部結合


ビューは実表から作られた仮想的な表です。

表は第三正規形で保管されていますが、よくする処理で結合する必要がある場合、予め結合しておいた表を用意しておくと処理が速いですよね。

また、ビューを作っておくと、実表にアクセスさせないので、セキュリティ的(漏えい、改変)にもメリットがあります。



データベーススペシャリスト 令和04年午前2問07より

正答はイ。


まずデータ元になる表を作ります。左外部結合ですね。

左表「商品」表は全て出力され、右表「商品別売上実績」表に該当があれば結合されます。なければNULLとして結合されます。

SELECTの出力が売上合計金額絡みなのに注目してかんがえます 。

  • S001:50

  • S002:NULL

  • S003:250

  • S004:NULL

  • S005:350

  • S006:450

WHERE句で商品ランクAに絞られます。

  • S001:50

  • S002:NULL

  • S003:250

GROUP BYで商品ランクでまとめられ、集計関数AVGで計算され、(50 + 250)/2 = 150。なお、AVGはNULLの行は無視します。



データベーススペシャリスト 平成24年午前2問09より
データベーススペシャリスト 平成29年午前2問10より

正答はア。

まずはビューを作ります。

  • 作るビューの項目名は(商品コード, 出荷実績数, 月末在庫数)

  • ビューの項目内容は、月末商品在庫表の商品コード, 出荷数の合計, 在庫数

  • ビューを作るための表は、月末商品在庫表と当月商品出荷実績表を左外部結合

まずは左外部結合をやります。

LEFT OUT JOINなので、月末商品在庫表の全てが出力され、当月商品出荷実績表にデータがあれば結合されます。

SUM(出荷数)とGROUP BY 商品コードを処理して、

  • S001:150

  • S002:計算できず空欄(NULL)

  • S003:300

  • S004:計算できず空欄(NULL)

  • S005:350


ではビューに対するSQL文を処理します。

出荷実績数が300以下はS001とS003が該当、在庫数は100と300なので合計して400が出力されます。

結合した詳しい表は過去問道場さんが作ってくれています。


今回の外部結合の条件(ON句)は、紐づける項目名だけなので、シンプルな方です。複数の条件になった時の動きはややこしいので、また解説Noteを準備しておきますね。



\私の4ヶ月の勉強記録/

p.s. 普段は >> 専門学校とIT就職のブログ << をやってます。

でわでわ(・ω・▼)ノシ


この記事が参加している募集

学習方法・問題特集のNoteは全て無料提供を続けます▼ もしご覧になったNoteが有益だったり、私の志に共感されたりしましたら、サポート頂けますと励みになります▼ もちろんコメントでも結構です(・ω・▼)ノシ