【SQL】OSS-DB Silver 例題をブラウザで動かす(自分でデータを作る)
記事の概要
OSS-DB Silverのサンプル問題を使って、ブラウザだけで実際に動かしながら勉強できる方法を紹介します。
この記事は続編(3回目) となっております。
まずは前回までの記事を読んで頂くことで、何をやろうとしているのかが分かると思います。
※初回:基本~簡単編はこちら↓
【SQL】OSS-DB Silver サンプル問題を、ブラウザで簡単に動かしてみよう
※2回目:普通編はこちら↓
【SQL】OSS-DB Silver 例題をブラウザで動かす(テーブル作成あり・コピペのみ)
簡単におさらい
用意するものは下記の2つ。
今回の難易度は?
【やや難】 に該当する例題を扱います!
- 【簡単】そのまま実行できるもの(コピー&ペーストですぐ使える)
- 【普通】そのまま実行できるが、ペーストする場所を使い分ける必要があるもの
- 【やや難】掲載のデータをテーブルに入れるため、データフォーマットを考える必要があるもの
- 【難しい】テーブル定義から考える必要があるもの
【やや難】に挑戦!
では、本題に入ります。
上記で私が定義した内容では『掲載のデータをテーブルに入れるため』と書いています。
要するにテーブルを作成するDDL(CREATE TABLE文)は用意されているが、データを登録するDML(INSERT文)が用意されていないものです。
問題文を読んで、その条件に合うデータについて自分でINSERT文を作成します。
例題は・・・これ!
【出典】Silverの例題解説 - S3 開発/SQL (Ver.3.0) [S3.2 組み込み関数(文字列演算子/文字列関数)]
テーブルを作成するDDL(CREATE TABLE文)は用意されているので、そのまま使えます。
CREATE TABLE foo (id INTEGER, val VARCHAR(50));
データを作ろう!
では、テーブル定義および問題文の条件に合ったデータを、DML(INSERT文)にしましょう!
まず、テーブル名と項目名を確認します。
CREATE TABLE foo (id INTEGER, val VARCHAR(50));
- テーブル名:foo
- 項目1:id 数値型
- 項目2:val 文字列型
であれば、外枠はこんな感じです。
INSERT INTO foo VALUES( ,'');
また、今回は特に必要無いですが項目を明示的に指定することも可能です。
INSERT INTO foo(id ,val) VALUES( ,'');
次に肝心の中身を作ります。
まず、どんなデータが必要なのか問題文を確認します。
次のSQL文で表を作成した後、多数の行をINSERTした。
この表で val 列の2文字目と3文字目がいずれも A である行をすべて検索したい。
誤っているものを1つ選びなさい。
この条件に該当するには、下記のデータを用意します。
- 数行程度(多数ではないが、あくまでサンプルなので良し)
- val列に4文字程度の英文字(2~3文字目が'AA'のものとそうでないものを混ぜる)
具体的なデータは下記の通りとしました。
id | val |
---|---|
1 | AAAA |
2 | AAAB |
3 | AABB |
4 | ABBB |
今回のテーブル定義には主キーが無いのですが、業務では主キー無しというのは特殊です。
それを踏まえて、id列はあえて連番を振っています。
DML(INSERT文)を作ろう!
では、具体的に決定したデータをSQL文に落とし込んでいきます。
単純に当てはめると、下記のように1行ずつ実行する形式になります。
INSERT INTO foo VALUES( 1,'AAAA');
INSERT INTO foo VALUES( 2,'AAAB');
INSERT INTO foo VALUES( 3,'AABB');
INSERT INTO foo VALUES( 4,'ABBB');
また、データ行単位でカンマ区切りにすれば、実行は1回で済みます。
今回はこちらを使います。
INSERT INTO foo VALUES( 1,'AAAA')
,( 2,'AAAB')
,( 3,'AABB')
,( 4,'ABBB');
いざ、実行!
では、ここまで作成したSQLを動かしてみましょう。
ブラウザでDB-Fiddleにアクセスして、PostgreSQLを指定するところまでは前回同様です。
まず左側へ
ここでは左側へ貼り、CREATE文とINSERT文を実行します。
正常終了でひと安心ですが、データの内容が正しく反映したか分かりません。
確認するために、全件・全列を検索するSQLを作ります。
SELECT * FROM foo;
これを右側に追加し、再度Runボタンをポチッと!
作成したデータが全て表示されるので、内容を確認します。
ちなみに、ソート順を明示的に指定しない場合は、実行するたびに順番がバラバラになることもあります。
順番を安定させたい場合は、ソート(ORDER BY)を使います。
下記の例はidの昇順になります。
SELECT * FROM foo ORDER BY id;
あとは
ここからは、問題文に対して回答をするために設問のSQL文を実行します。
この表で val 列の2文字目と3文字目がいずれも A である行をすべて検索したい。
誤っているものを1つ選びなさい。
SELECT * FROM foo WHERE val LIKE '_AA%';
SELECT * FROM foo WHERE val ~ '^.AA';
SELECT * FROM foo WHERE substring(val, 2, 2) = 'AA';
SELECT * FROM foo WHERE substring(val from 2 for 2) = 'AA';
SELECT * FROM foo WHERE position('AA' in val) = 2;
ここから先は、DB-Fiddleの右側の窓にコピペしてRunボタンを実行するだけなので割愛します。
エラーが出る場合は、どの選択肢が間違っているのかを見極めてコメントアウトや削除をします。
そうやっているうちに、理解が深まっていきます!
さいごに
今回は、難易度【やや難】レベルのご紹介をさせて頂きました。
主にINSERT文の書き方をご紹介することになりましたね。
次回は最終回【難しい】レベルをご紹介したいと思います。
ここまでお付き合い頂き、ありがとうございましたm(_ _)m
Discussion