ある日の出来事
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 構文を使ってみた。
これといった使い道は思いつかなかったが新発見だった。