「SQL Fiddle」を使ったブラウザ上でのSQLの学習

# はじめに

これまでにブラウザ上でSQLを学習するサービスとして、Oracle社の[Oracle Live SQL](https://livesql.oracle.com/)を利用したことがありますが、当然ながらこのサービスで使えるRDBMSはOracle Databaseに限られます。

そこでブラウザ上でMySQLやPostgreSQLなどを学習できるサイトがないかと探してみたところ、[SQL Fiddle](https://sqlfiddle.com/)というサービスがあることが分かったので、今回は試しに使ってみた際の記録を記事としてまとめてみました。

# SQL Fiddleの概要

* 使えるRDBMSは、2024年1月現在で以下の6種類でした。
  * SQL Server
  * SQLite
  * PostgreSQL
  * MySQL
  * MariaDB
  * Oracle（＋Oracle PLSQL）
* ログインは不要。
  * GoogleアカウントやGitHubアカウントでログインすることも可能ですが、ログインの有無でどのような点が異なるのかは分かりませんでした。

# SQL Fiddleを試してみる

* 今回は[MySQL](https://sqlfiddle.com/mysql/online-compiler)の機能を利用しました。
 * `Untitled`の下の入力欄にSQLを入力して、[Execute]ボタンを押すとSQLが実行されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/1af11ca4-27ed-cfde-7c5e-1ea3f500ff31.png)


* 以下のSQLを使って、テーブルの構築→データの投入→データの検索を実行してみました。
  * [【MySQL】SQLで基本統計量を求める](https://qiita.com/nkojima/items/2c483d4ddbdb29439c87)で利用した、八ヶ岳の山々のデータを少し改変して利用しています。

```sql:テーブルの構築→データの投入→データの検索を行うSQL
-- 山情報テーブルの作成。
CREATE TABLE mountain (
  `id` INT AUTO_INCREMENT comment '山ID',
  `name` VARCHAR(50) NOT NULL comment '山名', 
  `altitude` double NOT NULL comment '標高',
  `visited` boolean NOT NULL comment '登頂済み',
  `note` VARCHAR(200) comment '備考',
  PRIMARY KEY (id),
  INDEX name_idx(name)
)
ENGINE = InnoDB,
default charset=utf8mb4
comment='山情報';

INSERT INTO mountain
  (name, altitude, visited, note)
VALUES
  ('編笠山',2524,0,'南八ヶ岳'),
  ('西岳',2398,0,'南八ヶ岳'),
  ('三ッ頭',2580,0,'南八ヶ岳'),
  ('権現岳',2715,0,'南八ヶ岳'),
  ('赤岳',2899,1,'南八ヶ岳'),
  ('中岳',2700,0,'南八ヶ岳'),
  ('阿弥陀岳',2805,0,'南八ヶ岳'),
  ('横岳',2829,0,'南八ヶ岳'),
  ('硫黄岳',2760,1,'南八ヶ岳'),
  ('赤岩の頭',2656,0,'南八ヶ岳'),
  ('峰の松目',2567,0,'南八ヶ岳'),
  ('箕冠山',2590,1,'北八ヶ岳'),
  ('根石岳',2603,1,'北八ヶ岳'),
  ('天狗岳',2646,1,'北八ヶ岳'),
  ('中山',2496,1,'北八ヶ岳'),
  ('丸山',2330,1,'北八ヶ岳'),
  ('茶臼山',2384,1,'北八ヶ岳'),
  ('縞枯山',2403,1,'北八ヶ岳'),
  ('北横岳',2480,1,'北八ヶ岳'),
  ('大岳',2381,0,'北八ヶ岳'),
  ('双子山',2224,1,'北八ヶ岳'),
  ('蓼科山',2530,1,'北八ヶ岳'),
  ('八子ヶ峰',1833,1,'北八ヶ岳');

-- 登頂済みの山を標高の降順で表示。
SELECT
  *
FROM
  mountain
WHERE
  visited=true
ORDER BY
  altitude DESC;
```

* 実行結果は以下の通りです。
* SQL Fiddleにログインすると作成したテーブルやデータを保存できるのかもしれませんが、CREATE文を用意しておけばさして不自由は感じませんでした。

```sql:実行結果
+----+--------------+----------+---------+--------------+
| id | name | altitude | visited | note |
+----+--------------+----------+---------+--------------+
| 5 | 赤岳 | 2899 | 1 | 南八ヶ岳 |
| 9 | 硫黄岳 | 2760 | 1 | 南八ヶ岳 |
| 14 | 天狗岳 | 2646 | 1 | 北八ヶ岳 |
| 13 | 根石岳 | 2603 | 1 | 北八ヶ岳 |
| 12 | 箕冠山 | 2590 | 1 | 北八ヶ岳 |
| 22 | 蓼科山 | 2530 | 1 | 北八ヶ岳 |
| 15 | 中山 | 2496 | 1 | 北八ヶ岳 |
| 19 | 北横岳 | 2480 | 1 | 北八ヶ岳 |
| 18 | 縞枯山 | 2403 | 1 | 北八ヶ岳 |
| 17 | 茶臼山 | 2384 | 1 | 北八ヶ岳 |
| 16 | 丸山 | 2330 | 1 | 北八ヶ岳 |
| 21 | 双子山 | 2224 | 1 | 北八ヶ岳 |
| 23 | 八子ヶ峰 | 1833 | 1 | 北八ヶ岳 |
+----+--------------+----------+---------+--------------+
```

# 使ってみた感想

* RDBMSをインストールせずに、ブラウザでSQLを学習できるのがとにかく便利です。
  * ちょっとした学習用であれば、十分すぎるほどの機能だと思います。
* 6種類のRDBMSを使えるので、様々なRDBMSを使っている人ほど恩恵を受けられます。
  * SQLiteを試せる環境は珍しいと思うので、SQLiteユーザーには特に良い環境だと思います。
* 作ったSQLのインポート/エクスポート機能は存在しないようです。
  * ローカルのエディタでSQLを作って、それをコピペして実行するのが良さそうです。

# 参考URL

* [Oracle Live SQL](https://livesql.oracle.com/)
* [SQL Fiddle](https://sqlfiddle.com/)
* [【MySQL】SQLで基本統計量を求める](https://qiita.com/nkojima/items/2c483d4ddbdb29439c87)