本記事は、「基本情報技術者試験の過去問解説」をしながら「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文のイメージを少しでも掴んでもらえたなら嬉しい限りです。
お読みいただきありがとうございました!
コメント