Closed9

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

bohnenbohnen

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
bohnenbohnen

共通のエラー: コメントの形式

ミックさんの別の書籍でもあったと思うが、添付sqlのコメント形式がおかしくなっていてそのまま通らないことがある。具体的には -- 形式のコメントの場合は -- のあとに空白を入れないとエラーになる。

下記みたいなのはコメントとみなされない

--MySQL これはだめ
-- MySQL これはOK

これ書籍の方ではちゃんと空白が入っているので、ダウンロードしたSQLだけの問題。

bohnenbohnen

6-3 CASE 式

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

bohnenbohnen

7-1 集合演算

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

https://qiita.com/Nyokki/items/ab2388789d0a4f440e8c

bohnenbohnen

8-1 ウィンドウ関数

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

https://dev.mysql.com/doc/refman/8.0/ja/functions.html

bohnenbohnen

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は動作しなかった。

https://zenn.dev/gdtypk/articles/2021-09-22-074320

bohnenbohnen

まとめ

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

このスクラップは2025/01/19にクローズされました