【SQL入門・基本情報対策】表の結合|データベースの過去問をSQL文を実行しながら解説②

【基本情報技術者試験】データベースの問題 SQLを実行しながら解説

本記事は、「基本情報技術者試験の過去問解説」をしながら「SQLの練習」を同時にやってみよう!という趣旨の内容です。

こむぎ

一緒にSQLを実行してみたい人は、コードの右上のコピーボタンから簡単にSQL文をコピペできます。ぜひご利用ください。

目次

今回の問題:平成28年秋期 午前試験問29

“社員”表と”部門”表に対し,次のSQL文を実行したときの結果はどれか。

 SELECT COUNT(*) FROM 社員, 部門

  WHERE 社員.所属 = 部門.部門名 AND 部門.フロア = 2

選択肢

ア:1
イ:2
ウ:3
エ:4

基本情報技術者試験ドットコム(https://www.fe-siken.com/fekakomon.php)

“社員”表と”部門”表はこのあと作っていきます。

テーブル作成・データ挿入

まず、問題通りに”社員”表と”部門”表を作ります。

今回は過去問の解説をわかりやすくするため、列名を「問題文で出てきた表の列名をローマ字にしたもの」にします。

(例) “社員番号”を”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(*)

ここまでに選んだ行の数を表示してね


実行結果はこちら

問題のSQL実行結果

「条件に当てはまる行の数は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列を表示してね


実行結果はこちら

同じ内容の2列を1列にまとめて結合

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

こむぎ

重複のない、スッキリした表になりました

おわりに

今回は、FE平成28年秋期 午前問題の問29を題材に、SQL文の練習をしました。

問題のSQLを実際に実行することに加えて、少し応用編の内部結合も紹介しました。

内部結合とは別に「外部結合」というものもありますが、それはまた別の機会に。

データベース・SQL文のイメージを少しでも掴んでもらえたなら嬉しい限りです。

こむぎ

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

【基本情報技術者試験】データベースの問題 SQLを実行しながら解説

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次