[Book] SQL 第2版 ゼロからはじめるデータベース操作のTiDBでの検証

SQLをTiDBで学ぶ際の参考書籍にできるかなと思って、ミックさんの掲題の書籍の付属SQLを実行してみる。書籍サイトからSQLはダウンロードできる。
実行環境はTiDB Playground v8.5.1

UTF8へ変換
ソースコードがSJISなので全部UTF8に変換する。
#!/bin/bash
mkdir -p Sample_utf8
find Sample -type f -name "*.sql" | while read -r file; do
relative=${file#Sample/}
mkdir -p "Sample_utf8/$(dirname "$relative")"
iconv -f SHIFT_JIS -t UTF-8 "$file" > "Sample_utf8/$relative"
done

共通のエラー: コメントの形式
ミックさんの別の書籍でもあったと思うが、添付sqlのコメント形式がおかしくなっていてそのまま通らないことがある。具体的には --
形式のコメントの場合は --
のあとに空白を入れないとエラーになる。
下記みたいなのはコメントとみなされない
--MySQL これはだめ
-- MySQL これはOK
これ書籍の方ではちゃんと空白が入っているので、ダウンロードしたSQLだけの問題。

5-1 ビューの更新
TiDBではビューに対する更新はできないため、list 5-6のようなビューへのINSERTはエラーとなる。

6-3 CASE 式
'A:' || shohin_bunrui
のようになっているものについて、CONCAT('A:', shohin_bunrui)
への変更が必要。
以前の章でMySQLでは ||
で文字列連結できずCONCATを使う説明があるし、コラムでMySQLのIFの例ではCONCATを使っているので、ここは漏れたものと思われる。

7-1 集合演算
MySQLはv8.0.31からINTERSECT/EXCEPTをサポートするようになったので、 List 7-6 はそのまま動く。
TiDBも多分v7.5からは大丈夫。調べてないけどそれ以前からでも大丈夫な気がする。

8-1 ウィンドウ関数
書籍サイトでも追加情報として記載があるように、MySQLでもWindow関数をサポートしているので8章のコードも基本的にはそのまま動作する。ただ、「集約関数をウィンドウ関数として使う」のところのコードは、関数と引数の()の間に空白があるので動作しない。空白を削除する必要がある。
MySQLでは、関数名と()の間に空白を入れてはいけない(意識したことなかった・・・)

8-2 GROUPING演算子
MySQLでもv8.0.1からGROUPING演算子をサポートするようになったので、WITH ROLLUPとする必要があるもののGROUPING演算子は利用できる。
例えば、List 8-16 なら下記のように書く
-- MySQL
SELECT GROUPING(shohin_bunrui) AS shohin_bunrui,
GROUPING(torokubi) AS torokubi, SUM(hanbai_tanka) AS sum_tanka
FROM Shohin
GROUP BY shohin_bunrui, torokubi WITH ROLLUP;
List 8-16 では、これに加えて CAST(torokubi AS VARCHAR(16))
の部分がエラーになる。MySQLのCAST関数の場合は、CAST(torokubi AS CHAR(16))
とする必要がある。
※MySQLの場合は型が異なっても表示されるため、CASTを使わず torokubi
だけでも動作する。
残念ながらCUBEやGROUPING SETSはサポートされていないため、以降のSQLは動作しなかった。

まとめ
書籍中のMySQL用SQLについてTiDBで動作検証を実施したが、動作しなかったのはViewのINSERTくらいで、その他について動作に支障がなかったので、基本的な標準SQLは動作可能と言っていいんじゃないだろうか。