http://mysql-casual.org/2011/11/mysql-casual-advent-calendar-2011.html の6日目の記事として書かせていただきます、sugyanです。
勢いで参加表明してしまい、今日慌てて久しぶりにMySQLを触りました。
MySQLでFizzBuzz
ストアドプロシージャって使ったこと無かったので初めて触ってみました。
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 :: 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
おしまい。