1.怎样从文本文件执行SQL语句


mysql客户程序一般交互使用:


shell> mysql db_name


还可以将SQL语句放到一个文件中然后告诉mysql从该文件读取输入。要想实现,创建一个文本文件text_file,并包含你想要执行的语句。然后按如下所示调用mysql


shell> mysql db_name < text_file


还可以用一个USE db_name语句启动文本文件。在这种情况下,不需要在命令行中指定数据库名:


shell> mysql < text_file


如果正运行mysql,可以使用source或\.命令执行SQL脚本文件:


mysql> source filename


mysql> \. filename




最快的方法:


mysqldump xx | mysql




2.mysql 重命名数据库


发现这不是一个省力的活。如果你的MySQL版本是5.1.7之后,并且是5.1.23之前,有一种简单的方法可以用:
RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

但这种方法并不可靠,可能会造成数据的丢失,不建议使用。对此官方文档的说明(http://dev.mysql.com/doc/refman/5.1/en/rename-database.html):
However, use of this statement could result in loss of database contents, which is why it was removed. Do not use RENAME DATABASE in earlier versions in which it is present.

意思是,这招数不安全,5.1.23以后的版本就不能用这语句了。


除此之外,还有一些折衷的办法,大致上都是先用mysqldump导出数据,创建新的数据库然后导入数据,然后drop掉旧的库。

mysqladmin create spm
mysqldump SPM | mysql spm


如果你有phpmyadmin,可以点到“操作”的tab,有一项是“将数据库改名为”,此处略去1000字。


ps: MySQL官方文档有提到 ALTER DATABASE db_name UPGRADE DATA DIRECTORY NAME ,这个是用来解决5.0和5.1版本升级后数据库名称显示的问题,跟重命名不是一回事。


3.mysql执行顺序
今天看见了一个关于子查询的执行顺序的问题,论坛讨论非常积极,从中学到不少,具体执行顺序如下:
1.FROM:对FROM子句中前两个表执行笛卡尔积 生成虚拟表VT1
2.ON:对VT1表应用ON筛选器 只有满足 <join_condition>为真的行才被插入VT2
3.OUTER(JOIN):如果指定了OUTER JOIN 保留表(preserved table)中未找到的行将行作为外部行添加到VT2 生成T3
如果FROM包含两个以上表 则对上一个联结生成的结果表和下一个表重复执行步骤1和步骤3 直接结束
4.WHERE:对VT3应用WHERE筛选器 只有使 <where_condition>为TRUE的行才被插入VT4
5.GROUP BY:按GROUP BY子句中的列列表 对VT4中的行分组 生成VT5
6.CUBE|ROLLUP:把超组(Supergroups)插入VT6 生成VT6
7.HAVING:对VT6应用HAVING筛选器 只有使 <having_condition>为TRUE的组才插入VT7
8.SELECT:处理SELECT列表 产生VT8
9.DISTINCT:将重复的行从VT8中去除 产生VT9
10.ORDER BY:将VT9的行按ORDER BY子句中的列列表排序 生成一个游标 VC10
11.TOP:从VC10的开始处选择指定数量或比例的行 生成VT11 并返回调用者