ガジェット通信 GetNews

見たことのないものを見に行こう

【謎解きプログラム】データベースを扱ってみよう【SQLite】解答と解説

DATE:
  • ガジェット通信 GetNewsを≫

【謎解きプログラム】データベースを扱ってみよう【SQLite】

本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。

それでは以下、各問題とその解答を見ていきましょう。

問題のオープニング

ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。

「24時間以内に謎が解けない場合は、このPCのデータは消失する。

 謎は、あなたが真のプログラマーなら解けるものだ」

これは挑戦状ではなく脅迫状だ!

そこには、見たことのない謎が掲載されていた。

あなたは歴戦のプログラマーとして、データを救うために、この謎に挑むことになった。

前提条件

問題は、タイトルの通り、SQLiteで実行するものとします。

CodeIQのCoding SandboxでSQLを選ぶと、sqlite3で実行されます。問題やサンプルは、このサンドボックスで実行するものとします。

問題1

以下のテーブルがあるとします。

— テーブルの作成と、データの追加
create table person(id integer primary key, name text, point integer, address text);
insert into person values(1, ‘Tanaka’, 90, ‘Tokyo’);
insert into person values(2, ‘Satou’,
80, ‘Tokyo’);
insert into person values(3, ‘Honda’,
77, ‘Chiba’);
insert into person values(4, ‘Goto’,
65, ‘Tokyo’);
insert into person values(5, ‘Suzuki’, 23, ‘Chiba’);
insert into person values(6, ‘O”hara’, 50, ‘Saitama’);

— 表示の設定
.mode column
.headers ON

このテーブルから、pointが60以上の人のデータを抽出して出力するSQL文を選んで下さい。

// 選択肢
select * from where point >= 60;
select * from person where point >= 60;
select * from where upper 60;
select * from person where upper 60;

まずは、どういったテーブルかを確認するために、問題のSQL文を実行したあとに、「select * from person;」でテーブルの中身を出力してみましょう。

select * from person;

id
name
point
address
———- ———- ———- ———-
1
Tanaka
90
Tokyo
2
Satou
80
Tokyo
3
Honda
77
Chiba
4
Goto
65
Tokyo
5
Suzuki
23
Chiba
6
O’hara
50
Saitama

このテーブルの中から、問題の条件に合致するデータを抽出します。それぞれの選択肢を実行してみましょう。

// 選択肢1
select * from where point >= 60;

(出力は空)

// 選択肢2
select * from person where point >= 60;

id
name
point
address
———- ———- ———- ———-
1
Tanaka
90
Tokyo
2
Satou
80
Tokyo
3
Honda
77
Chiba
4
Goto
65
Tokyo

// 選択肢3
select * from where upper 60;

(出力は空)

// 選択肢4
select * from where upper 60;

(出力は空)

「select カラム名 from テーブル名」のように、テーブル名を指定します。また、取得するデータの条件を、WHEREで絞り込む場合は、>=という演算子が利用できます。

というわけで、目的の結果が出力されるのは2番目の選択肢で、「select * from person where point >= 60;」が答えになります。

問題2

以下のテーブルがあるとします。

— テーブルの作成と、データの追加
create table person(id integer primary key, name text, point integer, address text);
insert into person values(1, ‘Tanaka’, 90, ‘Tokyo’);
insert into person values(2, ‘Satou’,
80, ‘Tokyo’);
insert into person values(3, ‘Honda’,
77, ‘Chiba’);
insert into person values(4, ‘Goto’,
65, ‘Tokyo’);
insert into person values(5, ‘Suzuki’, 23, ‘Chiba’);
insert into person values(6, ‘O”hara’, 50, ‘Saitama’);

— 表示の設定
.mode column
.headers ON

このテーブルを、pointの高い順に出力するSQL文を選んで下さい。

// 選択肢
select * from person order by point asc;
select * from person order by point unasc;
select * from person order by point desc;
select * from person order by point not asc;

それぞれの選択肢を実行して、結果を見てみましょう。

// 選択肢1
select * from person order by point asc;

id
name
point
address
———- ———- ———- ———-
5
Suzuki
23
Chiba
6
O’hara
50
Saitama
4
Goto
65
Tokyo
3
Honda
77
Chiba
2
Satou
80
Tokyo
1
Tanaka
90
Tokyo

// 選択肢2
select * from person order by point unasc;

(出力は空)

// 選択肢3
select * from person order by point desc;

id
name
point
address
———- ———- ———- ———-
1
Tanaka
90
Tokyo
2
Satou
80
Tokyo
3
Honda
77
Chiba
4
Goto
65
Tokyo
6
O’hara
50
Saitama
5
Suzuki
23
Chiba

// 選択肢4
select * from person order by point not asc;

(出力は空)

データをソートする「order by」句は、「asc」が昇順、「desc」が降順です。

というわけで、目的の結果が出力されるのは3番目の選択肢で、「select * from person order by point desc;」が答えになります。

問題3

以下のテーブルがあるとします。

— テーブルの作成と、データの追加
create table person(id integer primary key, name text, point integer, address text);
insert into person values(1, ‘Tanaka’, 90, ‘Tokyo’);
insert into person values(2, ‘Satou’,
80, ‘Tokyo’);
insert into person values(3, ‘Honda’,
77, ‘Chiba’);
insert into person values(4, ‘Goto’,
65, ‘Tokyo’);
insert into person values(5, ‘Suzuki’, 23, ‘Chiba’);
insert into person values(6, ‘O”hara’, 50, ‘Saitama’);

— 表示の設定
.mode column
.headers ON

このテーブルの場合において、addressがTokyoのものだけ抽出して出力するSQL文を選んで下さい。

// 選択肢
select * from person where address like ‘T*’;
select * from person where address glob ‘T%’;
select * from person where address like ‘t%’;
select * from person where address glob ‘t*’;

それぞれの選択肢を実行して、結果を見てみましょう。

// 選択肢1
select * from person where address like ‘T*’;

(出力は空)

// 選択肢2
select * from person where address glob ‘T%’;

(出力は空)

// 選択肢3
select * from person where address like ‘t%’;

id
name
point
address
———- ———- ———- ———-
1
Tanaka
90
Tokyo
2
Satou
80
Tokyo
4
Goto
65
Tokyo

// 選択肢4
select * from person where address glob ‘t*’;

(出力は空)

データを文字列のパターンで絞り込む「like」や「glob」についての問題です。

「like」では、「%」は任意の0文字以上の文字列です。SQLiteの「like」では、大文字と小文字を区別しません。

「glob」は、Unixでファイルをワイルドカードで指定する書式です。「like」ではないこの方法でも、データを文字列のパターンで絞り込めます。

「glob」では、「*」は任意の0文字以上の文字列です。「glob」では、大文字と小文字を区別します。

というわけで、目的の結果が出力されるのは3番目の選択肢で、「select * from person where address like ‘t%’;」が答えになります。

CodeIQ運営事務局より

柳井さん、ありがとうございました!
現在、柳井さんの最新問題が出題中です。
ぜひ挑戦してみてくださいね!

カテゴリー : デジタル・IT タグ :
CodeIQ MAGAZINEの記事一覧をみる ▶
  • 誤字を発見した方はこちらからご連絡ください。
  • ガジェット通信編集部への情報提供はこちらから
  • 記事内の筆者見解は明示のない限りガジェット通信を代表するものではありません。