本記事は、「基本情報技術者試験の過去問解説」をしながら「SQLの練習」を同時にやってみよう!という趣旨の内容です。
 こむぎ
こむぎ一緒にSQLを実行してみたい人は、コードの右上のコピーボタンから簡単にSQL文をコピペできます。ぜひご利用ください。
今回の問題:平成28年秋期 午前試験問29
“社員”表と”部門”表に対し,次のSQL文を実行したときの結果はどれか。
SELECT COUNT(*) FROM 社員, 部門
WHERE 社員.所属 = 部門.部門名 AND 部門.フロア = 2
選択肢
ア:1
基本情報技術者試験ドットコム(https://www.fe-siken.com/fekakomon.php)
イ:2
ウ:3
エ:4
“社員”表と”部門”表はこのあと作っていきます。
テーブル作成・データ挿入
まず、問題通りに”社員”表と”部門”表を作ります。
今回は過去問の解説をわかりやすくするため、列名を「問題文で出てきた表の列名をローマ字にしたもの」にします。
(例) “社員番号”を”shain_bango”とする
/*社員テーブルを作成*/
 create table shain(
   shain_bango char(6),
   shozoku varchar(20)
 );
/*部門テーブルを作成*/
create table bumon(
   bumon_mei varchar(20),
   floor int
);テーブルが空っぽなので、中身のデータを入力します。
/*社員テーブルに行を挿入*/
insert into shain values
  ('11001','総務'),
  ('11002','経理'),
  ('11003','営業'),
  ('11004','営業'),
  ('11005','情報システム'),
  ('11006','営業'),
  ('11007','企画'),
  ('12001','営業'),
  ('12002','情報システム');
/*部門テーブルに行を挿入*/
insert into bumon values
  ('企画','1'),
  ('総務','1'),
  ('情報システム','2'),
  ('営業','3'),
  ('経理','2'),
  ('法務','2'),
  ('購買','2');テーブルの中身を確認してみましょう。
「SELECT * FROM テーブル名;」で、指定したテーブルからすべての列を取り出すことができます。
select * from shain;
select * from bumon;実行結果は次の画像2つのようになります。




問題のSQL文を実行
/*問題のSQL文*/
select count(*) from shain, bumon
	where shain.shozoku = bumon.bumon_mei and bumon.floor = 2;実行したいSQL文の意味はこんな感じ(意訳)。
- from shain, bumon
- 
“社員”表と”部門”表を使うよ 
- shain.shozoku = bumon.bumon_mei
- 
“社員”表と”部門”表を、”所属”列と”部門名”列でくっつけてね(表の結合) 
- bumon.floor = 2;
- 
「”部門”表の”フロア”」が2になっている行を選んでね 
- select count(*)
- 
ここまでに選んだ行の数を表示してね 
実行結果はこちら


「条件に当てはまる行の数は3行」ということです。
よって、正解の選択肢は「ウ:3」です。
【ちなみに】結合処理を見てみよう
問題のSQL文:2つの表を単純にくっつける
/*"社員"表と”部門”表をくっつけたものを表示*/
select * from shain, bumon
	where shain.shozoku = bumon.bumon_mei;上のSQL文の意味はこんな感じ。
- from shain, bumon
- 
“社員”表と”部門”表を使うよ 
- shain.shozoku = bumon.bumon_mei
- 
“社員”表と”部門”表を、”所属”列と”部門名”列でくっつけてね 
- select *
- 
表のすべての列を表示してね 
実行結果はこちら


“社員”表と”部門”表の2つを、1つの表にして表示することができました。
「”所属”と”部門名”を1つの列にして」結合する
先ほど表示した表ですが、「shozoku」と「bumon_mei」の2列がまったく同じ内容になっていることに気付いたでしょうか?



同じ内容の列は2つもいらないよ
ということで、「shozoku」と「bumon_mei」の2列を、「shozoku」の1列に統一してみましょう。
「内部結合」という処理をします。
/*「”所属”列と”部門名”列」を1列にまとめて、表を結合する*/
select shain_bango, shozoku, floor
	from shain
	inner join bumon
	on shain.shozoku = bumon.bumon_mei;上のSQL文の意味はこんな感じです。
- from shain
 inner join bumon
- 
“社員”表と”部門”表を内部結合するよ 
- on shain.shozoku = bumon.bumon_mei;
- 
“所属”と”部門名”をキー列として結合してね 
- select shain_bango, shozoku, floor
- 
“社員番号”、”所属”、”フロア”の3列を表示してね 
実行結果はこちら


同じ内容になっていた「shozoku」と「bumon_mei」の2列を、「shozoku」の1列にまとめることができましたね。



重複のない、スッキリした表になりました
おわりに
今回は、FE平成28年秋期 午前問題の問29を題材に、SQL文の練習をしました。
問題のSQLを実際に実行することに加えて、少し応用編の内部結合も紹介しました。
内部結合とは別に「外部結合」というものもありますが、それはまた別の機会に。
データベース・SQL文のイメージを少しでも掴んでもらえたなら嬉しい限りです。



お読みいただきありがとうございました!



コメント