Open3

MySQL徹底入門読書履歴

nawadanawada

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 数値型

固定小数点型の DECIMALNUMBER は何が違うんだ?
=> 同じらしい
ref. https://dev.mysql.com/doc/refman/8.0/ja/fixed-point-types.html

3.3.3 文字列型

CHARVARCHAR と異なり右のスペースはtrimされるらしい。CHAR型をあまり使ったこと無いから知らんかった。
VARCHAR は右スペースは保存されるけど、他のRDBMSの場合trimされることもあるとのこと。あかんやろ。

3.3.4 日付時刻型

DATETIME1000-01-01 00:00:009999-12-31 23:59:59 まで、
TIMESTAMP1970-01-01 00:00:012038-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 に設定する
nawadanawada

4章

4.2 空間情報(GIS)

座標系を保存できるとのこと。あまり使わないので割愛。

4.3.2

JSONデータ型の話。

mysql> SELECT JSON_UNQUOTE( JSON_EXTRACT(j, '$.name') );

とするとSELECT句で表示される内容が文字列として表示される。
省略記法として

mysql> SELECT j->>'$.name';

と書ける。

もちろんWHERE句にも書ける