MySQLのコマンドたち

http://mysql-casual.org/2011/11/mysql-casual-advent-calendar-2011.html の6日目の記事として書かせていただきます、sugyanです。
勢いで参加表明してしまい、今日慌てて久しぶりにMySQLを触りました。

MySQLFizzBuzz

ストアドプロシージャって使ったこと無かったので初めて触ってみました。

DROP PROCEDURE IF EXISTS FizzBuzz;
delimiter //
CREATE PROCEDURE FizzBuzz(n INT)
BEGIN
    DECLARE i INT DEFAULT 1;
    WHILE i <= n DO
        SELECT CASE 
            WHEN i % 3 = 0 AND i % 5 = 0 THEN 'FizzBuzz' 
            WHEN i % 5 = 0 THEN 'Buzz' 
            WHEN i % 3 = 0 THEN 'Fizz'
            ELSE i
        END;
    SET i = i + 1;
    END WHILE;
END
//
CALL FizzBuzz(100);
DROP PROCEDURE FizzBuzz;
$ mysql -N -u root test < fizzbuzz.sql
1
2
Fizz
4
Buzz
Fizz
7
...

こんなカンジでMySQLでもカジュアルにFizzBuzzが出来るんですね!

本題

…というネタでやり過ごそうかと思っていましたが流石にアレなので、ちょっとリファレンスを読んだり過去のブクマを遡って便利そうなところを探したりしてみました。
で、目についたのがコチラ。
MySQL :: MySQL 5.5 Reference Manual :: 4.5.1.2 mysql Commands
mysqlのプロンプト上で使えるコマンド。って結構色々あるんですね。

List of all MySQL commands:
Note that all text commands must be first on line and end with ';'
?         (\?) Synonym for `help'.
clear     (\c) Clear the current input statement.
connect   (\r) Reconnect to the server. Optional arguments are db and host.
delimiter (\d) Set statement delimiter.
edit      (\e) Edit command with $EDITOR.
ego       (\G) Send command to mysql server, display result vertically.
exit      (\q) Exit mysql. Same as quit.
go        (\g) Send command to mysql server.
help      (\h) Display this help.
nopager   (\n) Disable pager, print to stdout.
notee     (\t) Don't write into outfile.
pager     (\P) Set PAGER [to_pager]. Print the query results via PAGER.
print     (\p) Print current command.
prompt    (\R) Change your mysql prompt.
quit      (\q) Quit mysql.
rehash    (\#) Rebuild completion hash.
source    (\.) Execute an SQL script file. Takes a file name as an argument.
status    (\s) Get status information from the server.
system    (\!) Execute a system shell command.
tee       (\T) Set outfile [to_outfile]. Append everything into given outfile.
use       (\u) Use another database. Takes database name as argument.
charset   (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets.
warnings  (\W) Show warnings after every statement.
nowarning (\w) Don't show warnings after every statement.

For server side help, type 'help contents'

このへんのコマンドたちって皆さんカジュアルに使いこなしているのでしょうか? 自分は結構知らなかったです。
幾つかおさらいしつつ紹介してみましょう。

clear

Clear the current input. Use this if you change your mind about executing the statement that you are entering.

よくクエリを途中まで打って「やっぱやめた」ってときに、ついCtrl-Cを押してしまってmysql自体を終了させてしまってたりしました。
そんなときは途中でも"\c"って打っておけば良かったんですね。

mysql> select hogefugapiyo\c
mysql> 

何事も無かったかのように次のプロンプトに流してくれます。
ていうか

$ mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 104
Server version: 5.5.15 Source distribution

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

ってmysql立ち上げたときに毎回出てきていたのに読んでなかった ><

ego

Send the current statement to the server to be executed and display the result using vertical format.

出力形式を縦に変えてくれるやつですね。これはたまに使ってました。

mysql> select * from fuga;
+----+------+
| id | name |
+----+------+
|  1 | foo  |
|  2 | bar  |
+----+------+
2 rows in set (0.00 sec)

mysql> select * from fuga\G
*************************** 1. row ***************************
  id: 1
name: foo
*************************** 2. row ***************************
  id: 2
name: bar
2 rows in set (0.00 sec)
status

Provide status information about the connection and the server you are using.

だそうで。

mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.5.15, for osx10.6 (i386) using readline 5.1

Connection id:          106
Current database:       hoge
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.5.15 Source distribution
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:            /tmp/mysql.sock
Uptime:                 2 hours 30 min 18 sec

Threads: 1  Questions: 11740  Slow queries: 0  Opens: 70  Flush tables: 3  Open tables: 25  Queries per second avg: 1.301
--------------

サクっと状態を確認できますね。

system

Execute the given command using your default command interpreter.

シェルコマンドをmysqlプロンプトから実行、と。"\!"でも代用可。

mysql> system ls ~/perl5/perlbrew
Config.pm       bin             build           build.log       dists           etc             perls
mysql> \! ls ~/perl5/perlbrew
Config.pm       bin             build           build.log       dists           etc             perls
warnings

Enable display of warnings after each statement (if there are any).

mysql> desc fuga;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | NO   | PRI | NULL    |       |
| name  | varchar(256) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> insert fuga (id) value ("piyo");
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> show warnings;
+---------+------+----------------------------------------------------------+
| Level   | Code | Message                                                  |
+---------+------+----------------------------------------------------------+
| Warning | 1366 | Incorrect integer value: 'piyo' for column 'id' at row 1 |
+---------+------+----------------------------------------------------------+
1 row in set (0.00 sec)

普通こうやって参照しないと出てこないwarningsを、毎回出力してくれるようになる。

mysql> warnings
Show warnings enabled.
mysql> insert fuga (id) value ("piyo");
Query OK, 1 row affected, 1 warning (0.01 sec)

Warning (Code 1366): Incorrect integer value: 'piyo' for column 'id' at row 1
pager

Enable output paging.

結果出力時のpagerを指定できます。mysql起動時のコマンドラインオプション--pager、もしくはPAGER環境変数で指定しておくこともできるようです。
このあたりは下記記事で初めて知りました。
MySQL の pager が便利だった - xykの日記

mysql> pager less -n -i -S -F -X

と設定しておくと、見やすそうです。

※かるくlessオプションのおさらい:

  • "-n": 行表示抑制
  • "-i": 検索時の大文字小文字無視
  • "-S": 折り返し抑制
  • "-F": 一画面内に表示が収まる場合は表示して終了
  • "-X": less終了時に画面クリアさせない
prompt

Reconfigure the mysql prompt to the given string.

デフォルトではmysql> と表示されるプロンプトを変更できます。下記記事が詳しいかと思います。
漢(オトコ)のコンピュータ道: MySQLのプロンプトを変更する。

mysql> prompt \D \U \p [\d] >\_
PROMPT set to '\D \U \p [\d] >\_'
Tue Dec  6 19:53:21 2011 root@localhost mysql.sock [hoge] > 

こんなカンジで設定したりすると、現在時刻とユーザ名、TCP/IPポート or ソケットファイル名、使用中のデータベース、をすべてプロンプトに表示されますね。年、月、時、分、秒、は個別に取れるけど、「日」が取れないっぽい…何故。。ソースまで覗いてみたけどそれ用のspecial sequenceは定義されていないようでした。不思議…。
これも、mysql起動時の--promptオプションや、MYSQL_PS1環境変数、さらに/etc/my.cnfなどの設定ファイルで

[mysql]
prompt=(\\u@\\h) [\\d]>\\_

のように設定しておくこともできるようです。

quit

おしまい。