![見出し画像](https://assets.st-note.com/production/uploads/images/153593218/rectangle_large_type_2_66517c1b4679718ef755fb49f9058c33.png?width=1200)
【FE8問】SELECT文以外のSQL問題(基本情報技術者試験)
令和06年06月から平成21年までの全ての試験問題を分析して、SQL問題は22問ありました。
>前回は基本となる14問<を扱ったので、今回は残り8問。
SELECT文以外のSQL文が出てきます。
知ってて損ない知識ですが、旧FEの午後問題にはDBがありましたが、現FEの科目Bにはありません。今回分は切っても大丈夫です。
とはいえ、今回の問題はAPやDBでも流用されています。一度正解できるようになってしまえば、息長く得点源になってくれます。
それでは始めましょう!
このNoteは、私がIP~高度(DB)まで独学合格した経験と、IT専門学校でした授業ノウハウに基づいて作っています。
選択と射影は「選行」主婦と覚える
![](https://assets.st-note.com/img/1725773597-sZGgWAyEkat23i1dM6B5jU9q.png?width=1200)
正答はウ。
A1, A2, A3は「列」を選んで出力しているので「射影」。WHERE句でA4列が"a"である「行」を選んで出力しているので「選択」。(選行主婦と覚える)
![](https://assets.st-note.com/img/1725773582-jIB5e6JWuyiFnGrdOZbmP7SQ.png?width=1200)
正答はウ。
ア:結合:複数の表を連結させる操作
イ:差:ある表から、別の表の行と一致するものを抜く操作
ウ:射影:表から列を取り出す操作。「選択」は行を取り出す操作(選行主婦と覚える)。
エ:直積:2つの表の全ての行ペアを作る操作。2行と3行の2表なら、6行の表が出力されます(2×3)。
副問合せ・相関副問合せ
![](https://assets.st-note.com/img/1725726619-6qlpivtABK8MhrcdRkF4P37Y.png?width=1200)
正答はエ。
IN句による副問合せ。
最終的には、IN(001, 003, 004)のように在庫表にある商品番号が羅列されます。
今回は、NOT IN(001, 003, 004)のように「NOT」があるので、在庫表にないものが商品表から出力されます。たぶん002ですね。
EXISTS句は相関副問合せ。
主問合せしている表(商品表)から1行取り出して、EXISTSを処理していきます。
ウを例に解釈してみます。
SELECT 商品番号 FROM 商品
WHERE EXISTS (SELECT 商品番号 FROM 在庫 WHERE 商品.商品番号 = 在庫.商品番号);
商品表から1行読み込む
EXISTS内:
商品表の商品番号 = 在庫表の商品番号となる行があるか探す
あったらEXISTS句が真を返し、WHEREが成立し、主問合せの通り商品番号が表示
なかったらEXISTS句が偽を返し、WHEREが成立せず、主問合せの出力なし
1に戻り商品表から次の1行を読み込む
以上のようになるので、商品表にも在庫表にもあった商品番号が出力されます。
正答のエでは、NOT EXISTSになっているので、商品表にあって在庫表にはない商品番号が出力されます。
>データベーススペシャリストの解説Note(副問合せ・相関副問合せ)
DELETE文 | デッドロックした場合
![](https://assets.st-note.com/img/1725726632-vYMZxF70kwKzSgqQtmuXTAaj.png?width=1200)
正答はイ。
DELETE文は、データを削除します。
問題文のSQL文では、商品コードB020の行を削除しようとしています。
しかし、デッドロックによって処理が進みません。
デッドロックとは他のSQLと表の取り合いになって、お互いが動けない状態。
![](https://assets.st-note.com/img/1725781663-K3zBCvV8kZ5sEUfaG2Oqn1r9.png?width=1200)
例えば、ドライバーとネジが必要な作業で、Aさんがドライバーだけ確保、Bさんがネジだけ確保した場合、お互いにネジ待ち・ドライバー待ちの互い違いになって作業を進められません。これがデッドロックです。
デッドロックが起こって、一定時間したら「タイムアウト」と云って「なかったこと」にします。データを処理途中にせず、作業前の状態に「ロールバック」します。
よって、問題文の商品表は何も作業されていない元の状態。つまりイが正答です。
UPDATE文 | 制約に違反しないように
![](https://assets.st-note.com/img/1725726680-E76Fezia04sgtCIbNYTcrx8U.png?width=1200)
正答はエ。
CREATE TABLE文は、表を作るSQL文。項目名とデータ型(数値なのか文字なのかなど)、そして項目にかける制約(一意制約など)を設定して、表を作ります。
UPDATE文は、表のデータを更新します。追加ではなく、既に存在している行について操作します。なお、データの追加はINSERT文。
データを追加・変更する時は、表の定義に従っていないと処理が進みません。例えば、単価列はINT(整数値)なので、文字列は入れられません。
末尾のPRIMARI KEY(商品番号)は「商品番号に主キー制約をかける」というもの。主キー制約は、一意制約(重複NG)と非NULL制約(空欄NG)です。
では各UPDATE文を考えていきます。
ア:商品番号S001の行の商品番号をS002にすると、商品番号S001が2行存在するようになります。商品番号は主キー制約がかかっているので違反。
イ:商品名がCの行は2行あります。S004とS005がS006に変更sれるとS006が2行あり、主キー制約に違反。
ウ:商品番号をNULLに更新するのは、主キー制約に違反。
エ:商品番号S003の商品名をDに変更するのは問題ありません。商品名のCHAR(20)は20文字まで入れられます。
>ITパスポートのデータベース解説Note3(キーと正規化)
色々な結合 | 直積、和・差・積
![](https://assets.st-note.com/img/1725726658-BH7JzuRS8pkKPtxmeqhrQijU.png?width=1200)
正答はア。
直積とは、ある表の行に別の表の全てを結合する操作です。例えば3行の表と2行の表の直積をとると、3×2 = 6行の表になります。
ア:正しい。なお、関係ある行だけ結合したい時は、「WHERE 表1.項目 = 表2.項目」と紐づける条件を加えます。
イ:EXCEPTは差をとる操作です。表Rから表Sにある行を抜いて出力します。つまり表Rにだけある行だけが出力されます。
ウ:UNIONは和を取る操作です。表Rと表Sをそのまま繋げます。表Rに2行、表Sに3行あれば、2+3=5行の表ができます。
エ:INTERSECTは積を取る操作です。表Rにも表Sにもある行だけが出力されます。
過去問道場さんでは具体的なデータで説明をしてくれてます。
EXCEPTは出たことはありますが、他も含めて「学習カロリーが高いなぁ」と思ったら覚えなくて良いです。基本問題が解けるだけで充分なので。>データベーススペシャリストの解説Note(EXCEPTが1問だけ出た)
ビュー | 2つのご利益
データベースは第三正規形を満たすように、たくさんの表(実表)で構成されています。
よくある処理にて、毎回結合すると負荷がかかってしまうので、予め結合した仮の表(ビュー)を用意しておくと負荷を軽減できます。
またセキュリティ的なメリットもあります。処理に必要な必要最低限の情報だけをビューに載せます。実表にアクセスさせないので、不必要なデータは見られませんし、不正に更新・削除もされません。
ビューには、負荷面とセキュリティ面のご利益があるんです。
![](https://assets.st-note.com/img/1725726694-WN7RkSYPHKxhTLI1VCjiEuv3.png?width=1200)
正答はエ。
GRANT:ユーザーのデータベース(表)へのアクセス権限の設定。SELECT(抽出), INSERT(追加), UPDATE(更新), DELETE(削除)
INSERT:表にデータを追加。
SCHEMA:覚えなくて良いです。DBで一瞬でた程度。データベース内で更に名前によって分ける時に使います。
SELECT:SELECT文で作った表でビューを作っています。売上報告に5項目、AS後に5項目あることから推測できます。
「ビューを作るときは、SELECT以外ありえない」と思っててもOKです。FEではその手段しか出ません。
![](https://assets.st-note.com/img/1725726670-aV2nBcwNXSoD9JdzgU4lfqmy.png?width=1200)
正答はア。
CREATE VIEW文でビューが作成されますが、WHERE句によって「売値 - 仕入値 >= 40000」の商品だけがビューに記載されます。
商品表の売値・仕入値・売値-仕入値の状況は以下。
S001:150,000:100,000:50,000→OK
S003:200,000:170,000:30,000→NG
S005:140,000: 80,000:60,000→OK
S001とS005の2行が、ビューに記載される状態でした。
設問文で問われている、ビューの行数が減少する処理を考えます。
ア:S001:130,000:100,000:30,000→NGになる
イ:S003:200,000:150,000:50,000→OKになる
ウ:S005:130,000: 80,000:50,000→変わらずOK
エ:S005:140,000: 90,000:50,000→変わらずOK
アだとS001がビューに載らないので2行から1行に減ります。
イではS003が載るので2行から3行に増え、ウとエでは2行のままで変わりません。
次にお会いするのは「APで出たSQL問題」かもしれません(未定)。
p.s. 普段は >> 専門学校とIT就職のブログ << をやってます。
でわでわ(・ω・▼)ノシ
いいなと思ったら応援しよう!
![せんない](https://d2l930y2yx77uc.cloudfront.net/assets/default/default_profile_5-043439195e40e86fd7641a3a1daf982637d77ec6f14b67d3fc98ab92374404ac.png?width=600&crop=1:1,smart)