【デスペ5問】SQLの結果(データベーススペシャリスト)
このNoteでは、デスペAMIIから「SQL文の実行結果」を問う問題を特集しました。
FEではSELECT文。せいぜいORDER, GROUP, 2表結合ぐらいでしたが、APではレベル上がりましたね。外部結合やCURSORも出始めました。
DBではさらに、副問合せ・相関副問合せ・複雑な外部結合が絡んできます。私は午後問題はデータベース設計に絞りますが、AMIIレベルの正解力は持つように対策しました。
大学受験で「(高校の理科が選択制なので)生物学科の入試で生物を解かずに合格できるってどうなの」と取り沙汰された時期がありました(高校理系が、化学+物理or生物or地学、な弊害です)。
私は「SQLはPCでやれるんだから紙面で解きたくない」って思想が強いのですが、出る可能性がある以上は仕方ありません。SQL完全回避はできないので、AMII程度は解けるぐらいにはなっておきましょう。
ちょっとネガティブな感じになりました。すみません。
このNoteは「SQLシリーズ」になると思います。問題を分類して、段階的に学んでいけるようにしますね。
それでは始めましょう!
\私の4ヶ月勉強法/
副問合せと相関副問合せ
SQLの内側、特にWHERE句にSELECT文が含まれることがあります。
副問合せ・相関副問合せという少しややこしい処理になります。
副問合せが簡単なので、そちらだけでもできるようになっておきましょう。
簡易的な見分け方として、INの前には比較する項目があり(WHERE 項目 IN ~)、EXISTSの前にはない(WHERE EXITS ~)。
副問い合わせ1 | IN
IN句は簡単なので正解できるようになりましょう。
正答は、ア。
まずINの中身から。社員表の部門が2000以下の社員番号を抽出するので、11111, 22222。
次はSELECT句。プロジェクト表の社員番号と一致するものを抽出するので、(P001, 11111), (P001, 22222)。
INは考えやすいですね。
相関副問合せ | EXISTS
正答は、ウ。
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を使わない
正答は、ウ。
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文ではレア問題ですが、出たら確実に取りたいです。簡単なので。
正答は、エ。
A EXCEPT Bは、AからBを引きます。「商品表から抽出するよ、でも当月商品仕入合計表に載ってるのは除外してね」というイメージ。
商品表の仕入先コードから、当月商品仕入合計表の仕入れコードを引きます。つまりK01, K02, K03, K04から、K01, K03, K05を引いて、K02, K04が残ります。
ビューと左外部結合
ビューは実表から作られた仮想的な表です。
表は第三正規形で保管されていますが、よくする処理で結合する必要がある場合、予め結合しておいた表を用意しておくと処理が速いですよね。
また、ビューを作っておくと、実表にアクセスさせないので、セキュリティ的(漏えい、改変)にもメリットがあります。
正答はイ。
まずデータ元になる表を作ります。左外部結合ですね。
左表「商品」表は全て出力され、右表「商品別売上実績」表に該当があれば結合されます。なければ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の行は無視します。
正答はア。
まずはビューを作ります。
作るビューの項目名は(商品コード, 出荷実績数, 月末在庫数)
ビューの項目内容は、月末商品在庫表の商品コード, 出荷数の合計, 在庫数
ビューを作るための表は、月末商品在庫表と当月商品出荷実績表を左外部結合
まずは左外部結合をやります。
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が有益だったり、私の志に共感されたりしましたら、サポート頂けますと励みになります▼ もちろんコメントでも結構です(・ω・▼)ノシ