登録不要、インストール不要、フリーなブラウザ上でSQLの練習問題を解ける「SQL Bolt」を試してみよう

SQL初心者向けです。わかりそうでわからなかったSQL文を実戦形式で勉強できる素材を探していました。Paizaの記事（下記参照）で紹介されていたSQL Boltを試してみました。

**初心者向け・SQLの練習問題をたくさん解ける学習サイトと本7選**
http://paiza.hatenablog.com/entry/2018/01/22/%E5%88%9D%E5%BF%83%E8%80%85%E5%90%91%E3%81%91%E3%83%BBSQL%E3%81%AE%E7%B7%B4%E7%BF%92%E5%95%8F%E9%A1%8C%E3%82%92%E3%81%9F%E3%81%8F%E3%81%95%E3%82%93%E8%A7%A3%E3%81%91%E3%82%8B%E5%AD%A6%E7%BF%92%E3%82%B5#-SQLBolt

##SQL Boltとは
https://sqlbolt.com/
英語サイトですが、SQLを練習問題形式で解きながら学べる教材です。登録不要、インストール不要で、打ち込んだSQL文がリアルタイムでブラウザ上に出力されます。もちろん無料です（PayPalで寄付受け付けているそうです）。いちいちボタンを押す必要がなく、リアルタイムに結果が表示されるのがとてもわかりやすいです。答え合わせもしてくれます。問題に関係なくても「ここをこう変えたらどうなるんだろう？」ということが簡単にできます。
![sqlbolt.png](https://qiita-image-store.s3.amazonaws.com/0/232088/0358dd0b-0acc-ec0d-3f0b-fb702125452e.png)

クエリ構文の解説がありますが、英語読むの大変なのでコード部分の流し読みで十分です。わからないことがあったら該当のクエリ文でググれば（例えばINNER JOINがわからなかったら、「SQL INNER JOIN」でググる）いくらでも日本語解説記事出ますので。英語記事だからと恐れる必要はないです。

##目次
練習問題を勝手に和訳してみました。原文のほうが読みやすくて必要ないかもしれませんが、参考になれば。ヒントはこちらが勝手につけたものです。

Lesson1～12がSELECT編、Lesson13～がINSERT編になります。

###Lesson1 : SELECTクエリ101
登場するクエリ：**SELECT**

1. 各映画の「タイトル（Title）」を検索しよう
2. 各映画の「監督（Director）」を検索しよう
3. 各映画の「タイトルと監督」を検索しよう
4. 各映画の「タイトルと年（Year）」を検索しよう
5. 各映画の「全ての情報」を検索しよう

ヒント：5はアスタリスク（*）を使います

###Lesson2 : 制約つきクエリ（パート1）
登場するクエリ：**WHERE**、比較演算子、BETWEEN…AND…、NOT BETWEEN…AND…、IN(…)、NOT IN(…)

1. Idが6の映画を検索しよう
2. 公開年（Year）が2000年～2010年の映画を検索しよう
3. 公開年が2000年～2010年**ではない**映画を検索しよう
4. ピクサーの映画のうち、公開年が最初の5つのものを検索しよう

ヒント：4は既にテーブルが公開年でソートされているので、ソート操作は不要です。データは全てピクサーの映画です。

###Lesson3 : 制約つきクエリ（パート2）
登場するクエリ：**LIKE**、NOT LIKE、=、!=、%、_

1. トイ・ストーリー（Toy Story）の映画を全て見つけよう
2. 監督がJohn Lasseterの映画を全て見つけよう
3. 監督がJohn Lasseter **ではない**映画（と監督）を全て検索しよう
4. タイトルが「WALL～」で始まる映画を全て見つけよう

ヒント：SELECTで選ぶカラムは特に気にしなくても正解扱いになるようです

###Lesson4 : クエリの結果をフィルター・ソートする
登場するクエリ：**DISTINCT、ORDER BY、LIMIT OFFSET**

1. ピクサーの映画の監督（Director）を、重複を省いてアルファベット順に列挙しよう
2. ピクサーの映画のうち、直近に公開された4本を列挙しよう（新しい順に並べる）
3. ピクサーの映画をアルファベット順に並べ、**最初の5本**を列挙しよう
4. ピクサーの映画をアルファベット順に並べ、**次の5本**を列挙しよう

ヒント：4は6番目～10番目を表示せよ、ということです

###Lesson5 : SQLの復習　単純なSELECTクエリ
内容：Lesson1～4の復習

1. カナダ（Canada）の都市（City）と人口（Population）を列挙しよう
2. アメリカ（United States）の都市を緯度（Latitude）で北から南に列挙しよう
3. シカゴ（Chicago）から西の全都市を、西から東に列挙しよう
4. メキシコ（Mexico）の最も大きな2都市を列挙しよう（人口で比較）
5. アメリカの3番目と4番目に大きな都市（人口で比較）を列挙しよう

ヒント：応用ですが3はサブクエリを使っても正解になります。緯度は北のほうが数字が大きく、南のほうが数字が小さいです。例えば、札幌（駅）の緯度は43.068661ですが、東京（駅）の緯度は35.681167です。
経度は東のほうが数字が大きく、西のほうが数字が小さいです。例えば、東京の経度は139.767052ですが、大阪（駅）の経度は135.495951です。西経の場合は数字がマイナスになりますが、東西の順序関係は変わりません。

###Lesson6 : 複数のテーブルと結合
登場するクエリ：**INNER JOIN**

1. 各映画の国内売上（Domestic_sales）と海外売上（International_sales）を列挙しよう
2. 各映画の売上について、国内より海外の方が多かったものを表示しよう
3. 全ての映画をレーティング（Rating）で降順ソートしよう

###Lesson7 : 外部結合
登場するクエリ：**LEFT/RIGHT/FULL JOIN**

1. 従業員（Employees）のいる建物（Buliding）を全て検索しよう
2. 全ての建物とキャパシティ（Capacity）を検索しよう
3. 全ての建物と、建物あたりの重複を除いた従業員の役職（Role）を列挙しよう（ただし誰もいない建物も含む）

ヒント：1、2は外部結合を使いません

###Lesson8 : NULLについてのメモ
登場するクエリ：**IS/IS NOT NULL**

1. 建物（Building）に配属されていない従業員（Employees）を見つけよう
2. 誰もいない建物の名前を見つけよう

ヒント：2は外部結合を使います

###Lesson9 : 数式つきクエリ
登場するクエリ：**AS**、算術関数

1. 全ての映画と、国内と海外の合計売上を**100万ドル単位**で表記した値を列挙しよう
2. 全ての映画と、レーティング（Rating）をパーセント表記した値を列挙しよう
3. 偶数年に公開された全ての映画を列挙しよう

ヒント：2のパーセントとは、例えばRatingが10なら100になります。1,2は内部結合を使います。

###Lesson10 : クエリの集計
登場するクエリ：**GROUP BY**、集計関数とWHERE

1. スタジオへの勤続年数（Years_employed）が最も長い従業員（Employee）を見つけよう
2. 全ての役職（Role）について、役職ごとの平均勤続年数を計算しよう
3. 建物（Building）ごとの、合計勤続年数を計算しよう

###Lession11 : クエリの集計（パート2）
登場するクエリ：**HAVING**

1. スタジオにいるアーティスト（Artist）の人数を求めよう（**HAVINGを使わないこと**）
2. 役職（Role）ごとの従業員の人数を求めよう
3. エンジニア（Engineer）の合計勤続年数を求めよう

ヒント：解説にも書かれていますが、HAVINGはGROUPに対するWHEREと考えるとわかりやすいですね。

###Lesson12 : クエリの実行順序
内容：Lesson1～11で登場したクエリの実行順序

1. 監督（Director）別の担当した映画数を求めよう
2. 監督別の、国内（Domestic）と海外（International）の売上（sales）の合計を求めよう

ヒント：2がちょっと難しい
ここまでが「SELECT編」です。

Lesson13以降が「Insert編」になります。SELECT編と比べてINSERT編はリアルタイム反映が悪さして少し使いづらかったりするので、わかる方はここまででもいいと思います。

###Lesson13 : 行のINSERT
登場するクエリ：**INSERT**

1. 映画のリストにスタジオの新作「**Toy Story 4**」を追加しよう（監督は誰でもよい）
2. トイ・ストーリー4は批評家から絶賛されています！**レーティング（Rating）は8.7で、国内（Domestic）は3.4億ドル、海外（International）は2.7億ドル**の興行収入を達成しました。このレコードをBoxOfficeに追加しましょう。

ヒント：INSERTの場合は正しい文法になると値が異なっていても勝手にINSERTされて、GUIが暴れることがあります。後々使うわけでもないのであんまり気にしなくてもいいです。

###Lesson14 : 行のUPDATE
登場するクエリ：**UPDATE**

1. バグズ・ライフ（A Bug's Life）の監督が間違っており、正しくは**John Lasseter**です。更新しましょう。
2. トイ・ストーリー2（Toy Story 2）の公開年が間違っており、正しくは**1999**です。更新しましょう。
3. Toy Story 8のタイトルと監督が間違っています。タイトルはトイ・ストーリー3（Toy Story 3）になるべきであり、監督は**Lee Unkrich**です。更新しましょう。

ヒント：UPDATE…SET…Title = ""と打ってると、突然タイトルのデータが全部消えます（びっくりしました）。あらかじめテキストエディタに入力しておいたほうがいいかもしれません。ブラウザの更新で直ります。

###Lesson15 : 行のDELETE
登場するクエリ：**DELETE**

1. データベースが大きくなりすぎています。公開年が2005年より前の映画を全て削除しましょう。
2. Andrew Stantonは既にスタジオを離れています。彼の映画を全て削除してあげてください。

###Lesson16 : テーブルの作成
登場するクエリ：**CREATE TABLE**

1.次のような列を持つテーブル「Database」を作成しましょう
－**Name** データベースの名前であるstring(text)
－**Version** データベースの最新のバージョンをである小数（Floating Point）
－**Download_count** データベースがダウンロードされた回数を示す整数（Integer）
このテーブルの制約はなし

ヒント：正解を入力してみるとわかりますが、SQLite、MySQL、Postgresが行の要素として入ったテーブルが出来上がります。データベースという言葉が二重の意味ででてきて混乱するかもしれません。

###Lesson17 : テーブルの変更
登場するクエリ：**ALTER TABLE, ADD…DEFAULT…, DROP**

1. 各映画の公開されたときのアスペクト比を記録するために、**FLOAT**型のカラム・**Aspect_ratio**を追加しましょう
2. 各映画が公開されたときの言語を記録するために、別の**TEXT**型のカラム・**Language**を追加しましょう。ただし、デフォルトの値が**English**になるように保証します。

###Lesson18 : テーブルの削除
登場するクエリ：**DROP TABLE**

1. 悲しいことに、これがレッスンの最後になりました。Moviesのテーブルを削除し掃除しましょう。
2. 同様にBoxOfficeのテーブルも削除しましょう。


以上です。初心者向けのチュートリアルなので、物足りないかもしれませんね。ただ結合のわかりづらい部分のポイントは抑えてるなと思いました。