今日はなにの日。

気になったこと勉強になったことのメモ。

今日は、SELECT COUNT(*);のついでにの日。

ある日の出来事

Twitterでとあるツイートを見つけた。

SELECT COUNT(*) ;の結果が1になるというもの。

mysql> select count(*);
+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)

なんでなのか調べてみた

調べるとすぐに答えは見つかった。

dual 表は仮想的に1行だけ持ってるテーブルなので、1が返ってくるらしい。1

寄り道

調べてく過程2でSHOW WARNINGS構文3に出会った。

SHOW WARNINGS は、現在のセッションでのステートメントの実行の結果として得られた条件 (エラー、警告、および注意) に関する情報を表示する診断ステートメントです。警告は、INSERT、UPDATE、LOAD DATA INFILE などの DML ステートメントのほか、CREATE TABLE や ALTER TABLE などの DDL ステートメントに対して生成されます。

これの面白いところが、実行計画に関する情報の取得するのに使用される、 EXPLAINのあとにも実行されるみたい。

EXTENDED キーワードが使用されている EXPLAIN によって生成された追加の情報を表示するために、EXPLAIN EXTENDED のあとにも使用されます。

実行してみた

まずSELECT COUNT(*);から。

mysql> explain select count(*);
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra          |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
|  1 | SIMPLE      | NULL  | NULL       | NULL | NULL          | NULL | NULL    | NULL | NULL |     NULL | No tables used |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
1 row in set, 1 warning (0.00 sec)

mysql> show warnings;
+-------+------+----------------------------------------------+
| Level | Code | Message                                      |
+-------+------+----------------------------------------------+
| Note  | 1003 | /* select#1 */ select count(0) AS `count(*)` |
+-------+------+----------------------------------------------+
1 row in set (0.00 sec)

内部だと、count(0)して実行されてるみたい。

次はエラーを起こしてみた。 とは言っても、簡単なエラー。 接続先のデータベース名を間違えただけ。

mysql> use tttest;
ERROR 1049 (42000): Unknown database 'tttest'
mysql> show warnings;
+-------+------+---------------------------+
| Level | Code | Message                   |
+-------+------+---------------------------+
| Error | 1049 | Unknown database 'tttest' |
+-------+------+---------------------------+
1 row in set (0.00 sec)

まとめ

発生したエラーを確認することができるSHOW WARNINGS 構文を使ってみた。

これといった使い道は思いつかなかったが新発見だった。