首先,Linux 命令行工具,最基本的原则是随时可查手册,man mysql
。
当用 mysql
命令从 shell 进入交互环境时,也可用 help
查询基本命令:
mysql> help
大多以 \
前缀的转义命令,即可以单独使用,也可以附加在普通查询命令末尾。
有些大写转义命令打开某功能选项,而小写关闭对应的功能。
记录使用日志
将查询输出额外保存到外部文件,当作使用日志,这或有妙用。用 \T
命令可达成此效
果,类似于 tee
命令。使用 \t
关闭输出日志。
mysql> \T tee.log
也可以在 shell 启动 mysql 时添加 --tee
选项指定输出日志文件:
$ mysql --tee=file.log
如果日常工作频繁依赖使用 mysql ,还可以写个 shell 包装脚本,按当天日期为名记录
不同的输出日志文件。例如,将以下脚本保存为 ~/bin/tsql.sh
:
#! /bin/bash
LOGDIR=$HOME/mysql
cd $LOGDIR
today=$(date +%Y%m%d)
LOGFILE=tee.log.$today
exec mysql -u $USER -p$PASS -h $HOST --tee=$LOGFILE "$@"
当然,你可以自己选择是否为了方便将用户名、密码及服务器地址等信息一并写到该启动 脚本,抑或是为了安全还是从命令行提示符中输入。
控制查看结果
在交互命令中使用的查询,输出结果将以整洁的表格线给出,相信使用过 mysql 的用户
都习以为常了。这在查询的列数较少,可以在终端屏幕宽度内打印时很方便。但在列数很
多或有些文本字段内容过长时,就很难看了。这时可以用 \G
命令将结果以纵向的方式
输出,例如:
mysql> SELECT * FROM table_name WHERE ... LIMIT 1 \G
语句末尾使用 \G
后,不需要额外加分号 ;
直接回车即可,且只影响当前查询语句
。此后用分号结尾的语句,仍然按表格线的方式列出。
由于每个字段打印为一行,结果会比较长,故适合查询多列而不太适合查询多条记录。
除了有 WHERE
子句限定选择结果外,还可用 LIMIT
语法限定选出数量。
这个 LIMIT 1
还可作为查看表结构示例的语法,与 desc
或 show create table
各有特色。而且,后者的输出内容较长,最好也用 \G
方式:
mysql> SHOW CREATE TABLE table_name \G
当真的需要以表格化查看太多查询记录时,还可以选择使用其他 pager 工具查看,典型
的如 less
便于上下翻页:
mysql> SELECT * FROM table_name WHERE ... \P less
此时将启用 less
全屏查看结果,浏览完毕后按 q
命令退出 less
重回到 mysql
交互界面。\P
命令选择外部 pager 是长效的,此后的查询结果也会启用外部 pager
,因此不需要这样时用 \n
禁用,或用在 \P
命令后留空不加 pager 参数,二次回
车确认后,将 pager 设为无,也就用 stdout
。
一个更复杂也更人性化的 pager 命令是:
mysql> pager less -n -i -S -F -X
这就涉及 man less
学习 less 的高级用法了。这些选项控制的效果有:-S
使长表
格线不折行,可用左右方向键浏览;-FX
则是智能判断输出记录结果,如果不超过一屏
,就直接显示,不按正常启动 less 。
mysql 也有单行命令模式,即在启动时用 -e
选项指定要执行的 sql 语句,则 mysql
在启动后只执行该语句后立即退出,不进行交互模式。这既可以直接在 shell 命令行中
执行少量 sql 语句,也可以嵌入在 shell 脚本中批量执行特定几个 sql 语句。可以在
一个 -e
选项参数中以 ;
分隔多条 sql 语句,也可以用多个 -e
选项。最好将整
个 sql 语句用单引号括起作为 -e
的参数传给 mysql 。这是另一个话题了。
如果直接在 shell 命令行使用单行命令,结果输出到终端的标准输出,默认方式也是表 格化的。如:
$ mysql -e 'SELECT * FROM ... WHERE ...'
但是如果将 mysql -e
的结果重定向至文件或管道至其他程序时,默认的表格列输出是
没有表格线的,而只有 \t
制表符,这是便于程序处理而不是让人眼查看的考虑。不过
可以再加 -t
选项仍然输出表格线,如:
$ mysql -te 'SELECT * FROM ... WHERE ...' | less
当然了,可以在单引号内的 sql 语句末尾加 \G
改用纵向输出,不管是直接输出至终
端还是管道重定向。
命令行编辑
在 mysql 交互界面中编辑命令行与 shell 类似,都是基于 emacs 的快捷键。
清除命令 \c
有个用处是,仍将当前编辑的(不完整或有错误的)语句保存在历史,此
后仍可用 Ctrl-p
调入该命令,在此基础上修改。而如果用 Ctrl-U
真实地清空当前
命令行,则不会记入历史命令。你也不该企图用 Ctrl-C
取消当前 sql 语句命令,因
为那其实是退出 mysql 程序本身的。
如果在输入 sql 语句时,输到一半发现该语句太复杂,则用附加 \e
命令回车调用外
部编辑器(环境变量 $EDITOR ,一般是 vi)来编辑这条语句,编辑完后比如用 :wq
退出编辑器回到 mysql 执行。如果直接在行首使用 \e
或 edit
命令,将编辑上一
条历史命令。
对于真正复杂且常用的 sql 语句,还可保存在外部文件,然后从 mysql 命令行中使用
source
或 \.
命令来加载执行外部 sql 文件。注意记得从 shell 启动 mysql 的当
前路径。
在非交互模式下,也可以用定向输入 sql 文件,这也相当于将不适合 -e
直接输入的
语句先存于外部文件。
$ mysql ... < input.sql
小结
虽然 mysql 有很多功能强大的 GUI 工具,但似乎不能完全替代命令行客户端工具。笔者 虽然也装了 GUI 客户端,但只偶尔打开,最常用的还是命令行。所以本文归纳了若干使 用 mysql 命令行客户端程序的小技巧。