MySQL徹底入門読書履歴
下記の本の読書記録
1章
1.2.5
2024年1月現在MySQL 8.2まで出てる。
本書で解説されているMySQL 8.0 はEOLが2025年4月まで伸びてるみたい。
8.1はサポート切れ、8.2はいつまでのサポートか未定っぽい?
3章
3.1.3
;
ではなく \G
でSQL文を終わらせると出力が縦になる。カラム数が多いテーブルなどで有用。
mysql> SELECT * FROM pref LIMIT 1;
+----+---------+--------------+
| id | name | kana |
+----+---------+--------------+
| 1 | 北海道 | ほっかいどう |
+----+---------+--------------+
1 row in set (0.01 sec)
mysql> SELECT * FROM pref LIMIT 1\G
*************************** 1. row ***************************
id: 1
name: 北海道
kana: ほっかいどう
1 row in set (0.00 sec)
3.2.4
WINDOW 関数
これは書籍よりMySQL公式ドキュメントのほうがわかりやすそう。
ref. https://dev.mysql.com/doc/refman/8.0/ja/window-functions-usage.html
mysql> SELECT
year, country, product, profit,
SUM(profit) OVER() AS total_profit,
SUM(profit) OVER(PARTITION BY country) AS country_profit
FROM sales
ORDER BY country, year, product, profit;
+------+---------+------------+--------+--------------+----------------+
| year | country | product | profit | total_profit | country_profit |
+------+---------+------------+--------+--------------+----------------+
| 2000 | Finland | Computer | 1500 | 7535 | 1610 |
| 2000 | Finland | Phone | 100 | 7535 | 1610 |
| 2001 | Finland | Phone | 10 | 7535 | 1610 |
| 2000 | India | Calculator | 75 | 7535 | 1350 |
| 2000 | India | Calculator | 75 | 7535 | 1350 |
| 2000 | India | Computer | 1200 | 7535 | 1350 |
| 2000 | USA | Calculator | 75 | 7535 | 4575 |
| 2000 | USA | Computer | 1500 | 7535 | 4575 |
| 2001 | USA | Calculator | 50 | 7535 | 4575 |
| 2001 | USA | Computer | 1200 | 7535 | 4575 |
| 2001 | USA | Computer | 1500 | 7535 | 4575 |
| 2001 | USA | TV | 100 | 7535 | 4575 |
| 2001 | USA | TV | 150 | 7535 | 4575 |
+------+---------+------------+--------+--------------+----------------+
共通表形式(CTE)
これはなんだ…?サブクエリとは違う?
=> 違うみたい。
ref. https://ittrip.xyz/sql/sql-subquery-vs-cte
可読性・パフォーマンス・再利用性が副問合せより良いと。なるほど、たしかに。
3.3.2 数値型
固定小数点型の DECIMAL
と NUMBER
は何が違うんだ?
=> 同じらしい
ref. https://dev.mysql.com/doc/refman/8.0/ja/fixed-point-types.html
3.3.3 文字列型
CHAR
は VARCHAR
と異なり右のスペースはtrimされるらしい。CHAR型をあまり使ったこと無いから知らんかった。
VARCHAR
は右スペースは保存されるけど、他のRDBMSの場合trimされることもあるとのこと。あかんやろ。
3.3.4 日付時刻型
DATETIME
は 1000-01-01 00:00:00
~ 9999-12-31 23:59:59
まで、
TIMESTAMP
は 1970-01-01 00:00:01
~ 2038-01-19 03:14:07
まで。
2038年問題があるからTIMESTAMPは使わないこと。というかTIMESTAMPの開始時刻0秒からじゃなくて1秒からなのか。
TIMESTAMP は、'1970-01-01 00:00:00' という値を表すことはできません。これは、エポックからの秒数が 0 であることと同等で、0 という値は '0000-00-00 00:00:00'、つまり「ゼロ」の TIMESTAMP 値を表すために予約されているからです。
とのこと。
ref. https://dev.mysql.com/doc/refman/8.0/ja/date-and-time-type-syntax.html
また、公式リファレンスを見るとどちらとも小数第6位まで指定可能とのこと。
3.3.5 その他の型
MySQL独自型として
- BLOB
- TEXT
- ENUM
- SET
がある。TEXT以外多分使わないので割愛。
3.5.2 文字列のクォート
MySQLでは "
も '
もどちらも文字列と認識される。'
だけだと思ってた…。
3.5.4 CREATE DATABASE
CREATE DATABASE
/ DROP DATABASE
はMySQL独自命令。そうだったのか。
コラム
CLIで実行中に less
などをページャーとして使用できる。SELECT結果などが複数画面に渡る場合、指定したコマンドを介して表示されるため、一気に流れることがなくなる。
mysql> pager less -- less コマンドをページャーとして使用する
mysql> nopager -- ページャーを stdout に設定する
4章
4.2 空間情報(GIS)
座標系を保存できるとのこと。あまり使わないので割愛。
4.3.2
JSONデータ型の話。
mysql> SELECT JSON_UNQUOTE( JSON_EXTRACT(j, '$.name') );
とするとSELECT句で表示される内容が文字列として表示される。
省略記法として
mysql> SELECT j->>'$.name';
と書ける。
もちろんWHERE句にも書ける