Software Design「データベース速攻入門」に「SQL50本ノック」が掲載されました - LIVESENSE ENGINEER BLOG
最近では、postgres-wasmなど、WebブラウザでDBを動かせるようになってきており、もう少しすれば、WebAssemblyを使って、ブラウザですぐにノックを始められるようになるかもしれません。もしも、また何年か後に記事を更新する機会があれば、試してみたいですね。
Web上からすぐに試せるpostgres-wasmはPagilaのデータを持っていくことが現時点で出来なさそうだったものの、SQLite3 WebAssemblyはSQLiteのデータを持っていけました。SQL50本ノックを気軽に試せそうです。
手順1 sakila-sqlite3をダウンロード
まずgithubからsakila-sqlite3をダウンロードします。
github.com
直リンクはこちらです。 sakila_master.db がダウンロードできればok。
手順2 SQLite3 Fiddleでsakila-sqlite3をロード
SQLite3 Fiddleにアクセスします。画面下の Load DB... で先ほどダウンロードした sakila_master.db を選択して読み込みます。
手順3 細かい設定変更を行う(オプション)
画面下のOptionは以下がオススメです。
Auto-scroll outputは offAuto-clear outputは on
手順4 はじめよう
あとは書籍を見ながらSQL50本ノックにチャレンジ! gihyo.jp
SQLiteでの注意事項
- SQLiteのデフォルト設定ではSELECTした結果にカラム名が表示されません。
.headers onを設定すればカラム名を表示することができます。 - SQLiteではデフォルトだと列揃えがされません。列を揃えたい方は
.mode columnを設定しましょう。 - SQLite3 Fiddleではレコード数が多いと表示にかなり時間がかかります。ノック01でいきなり待たされます。
Auto-scroll outputをoffにするとやや早いです - 書籍ではPostgreSQLのため最後に出力された行数が表示されてますが、SQLiteの場合は行数が表示されません。必要に応じて
SELECT COUNT(*) FROM ...で行数を確認してください - 元データの差異が理由と思いますが、paymentテーブルの
payment_idの値が異なるようですので適宜読み替えてください - 書籍ではNULLのデータが空欄になっていますが、SQLite Fiddleでは
NULLと表示されます - rentalテーブルの
return_dateなどTIMESTAMPの表示形式が書籍と異なるので適宜読み替えてください - SQLiteとPostgreSQLでROUND関数の仕様が異なるため適宜書き換えが必要です。CAST関数も必要になるでしょう
- CONCATの代わりに
||演算子が使えます - information_schemaはないので代わりに
.schemaを駆使しましょう - SQLiteの正規表現はREGEXPが使用できます
- SQLiteで浮動小数点の計算は誤差が発生する可能性があります(ノック28)
- TIMESTAMPから日付を取り出すのはCASTではなくDATE関数が使えます
- 月別はEXTRACTではなくstrftime関数が使えます
- payment_p2022_XXテーブルは存在しないので適宜作成するか読み替えましょう