Archive for the ‘MySQL’ Category

MySQL:日期函数、时间函数总结(MySQL 5.X)

Sunday, April 5th, 2009




一、MySQL 获得当前日期时间 函数 1.1 获得当前日期+时间(date + time)函数:now() mysql> select now(); +---------------------+ | now() | +---------------------+ | 2008-08-08 22:20:46 | +---------------------+ 除了 now() 函数能获得当前的日期时间外,MySQL 中还有下面的函数: current_timestamp() ,current_timestamp ,localtime() ,localtime ,localtimestamp -- (v4.0.6) ,localtimestamp() -- (v4.0.6) 这些日期时间函数,都等同于 now()。鉴于 now() 函数简短易记,建议总是使用 now() 来替代上面列出的函数。 1.2 获得当前日期+时间(date + time)函数:sysdate() sysdate() 日期时间函数跟 now() 类似,不同之处在于:now() ...

MySQL序列(sequence)解决方案

Monday, March 30th, 2009




MySQL自增长与Oracle序列的区别: 自增长只能用于表中的其中一个字段 自增长只能被分配给固定表的固定的某一字段,不能被多个表共用. 自增长会把一个未指定或NULL值的字段自动填上. 在mysql中添加序列,请看下面的实例: 在MYSQL里有这样一张表: Java代码 CREATE TABLE Movie( id           INT NOT NULL AUTO_INCREMENT, name     VARCHAR(60) NOT NULL, released YEAR NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB; CREATE TABLE Movie( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(60) NOT NULL, released YEAR NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB; Java代码 INSERT INTO Movie (name,released) VALUES ('Gladiator',2000); INSERT INTO Movie (id,name,released) VALUES (NULL,'The Bourne Identity',1998); INSERT INTO Movie (name,released) VALUES ('Gladiator',2000); INSERT INTO Movie (id,name,released) VALUES (NULL,'The ...

myql备份所有数据库。

Tuesday, March 17th, 2009




>mysqldump.exe -uroot -p --complete-insert --extended-insert --create-options --quick --set-charset -R --hex-blob --single-transaction --no-data -A> F:/mysql5bak/schema.sql >mysqldump.exe -uroot -p --complete-insert --extended-insert --create-options --quick --set-charset -R --hex-blob --single-transaction --no-create-info -A> F:/mysql5bak/data.sql 分别备份所有数据库数据及结构。

sql行列转换查询语句

Tuesday, February 17th, 2009


-- -- 表的结构 `mark` -- CREATE TABLE IF NOT EXISTS `mark` ( `ID` int(11) unsigned NOT NULL auto_increment, `Name` varchar(50) default NULL, `Subject` varchar(50) default NULL, `Result` int(11) default NULL, PRIMARY KEY  (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ; -- -- 导出表中的数据 `mark` -- INSERT INTO `mark` (`ID`, `Name`, `Subject`, `Result`) VALUES (1, '张三', '语文', 80), (2, '张三', '数学', 90), (3, '张三', '物理', 85), (4, '李四', '语文', ...

MySQL: 诡异的MySQL server has gone away及其解决

Thursday, May 8th, 2008


在Mysql执行show status,通常更关注缓存效果、进程数等,往往忽略了两个值: Variable_name Value Aborted_clients 3792 Aborted_connects 376 通常只占query的0.0x%,所以并不为人所重视。而且在传统Web应用上,query错误对用户而言影响并不大,只是重新刷新一下页面就OK了。最近的基础改造中,把很多应用作为service运行,无法提示用户重新刷新,这种情况下,可能就会影响到服务的品质。 通过程序脚本的日志跟踪,主要报错信息为“MySQL server has gone away”。官方的解释是: The most common reason for the MySQL server has gone away error is that the server timed out and closed the connection. Some other common reasons ...

Mysql允许表名大写的设置。

Monday, May 5th, 2008


可以强制以 -O lower_case_table_names=1 参数启动 mysqld(如果使用 --defaults-file=...\\my.cnf 参数来读取指定的配置文件启动 mysqld 的话,你需要在配置文件的 [mysqld] 区段下增加一行 lower_case_table_names=2)。 这样MySQL 将在创建与查找时将所有的表名自动转换为小写字符(这个选项缺省地在 Windows 中为 1 ,在 Unix 中为 0。从 MySQL 4.0.2 开始,这个选项同样适用于数据库名)。 如果区分了mysql大小写的名字,在windows下面其实是会出问题的,因为虽然mysql区分了大小写,但是Windows本身并不支持文件名的大 小写。即在windows下,如果你建立了一个大写字母的表名,再建立一个小写字母的表名,mysql并不会提示表已经存在,而是直接报错!

MySQL的嵌套查询

Thursday, April 10th, 2008


MySQl从4.11版后已经完全支持嵌套查询了,那么下面举些简单的嵌套查询的例子吧(源程序来自MySQL User Manual): 1. SELECT语句的子查询 语法:     SELECT ... FROM (subquery) AS name ... 先创建一个表: CREATE TABLE t1 (s1 INT, s2 CHAR(5), s3 FLOAT); INSERT INTO t1 VALUES (1,'1',1.0); INSERT INTO t1 VALUES (2,'2',2.0); 我们就可以进行以下的嵌套查询了: SELECT sb1,sb2,sb3 FROM (SELECT s1 AS sb1, s2 AS sb2, s3*2 AS sb3 FROM t1) AS sb WHERE sb1 > 1; 结果是:2, '2', 4.0. 我们知道下面语句是不会得到正确结果的,因为对经过Group by排序的集合进行求均值是不能得到正确答案的: SELECT AVG(SUM(column1)) FROM t1 ...

MySQL查询优化器(3)

Thursday, April 10th, 2008


类型列中的ALL表明要进行检查所有数据行的全表扫描。可能键列中的NULL表明没有找到用于提高查询速度的备选索引(键、键长度和参考列都是NULL也是因为缺少合适的索引)。Using where表明使用WHERE子句中的信息来识别合格的数据行。 这段信息告诉我们,优化器没有为提高执行查询的效率找到任何有用的信息: · 它将对t1表进行全表扫描。 · 对于t1中的每一行,它将执行t2的全表扫描,使用WHERE子句中的信息识别出合格的行。 行 数值显示了优化器估计的每个阶段查询需要检查的行数。T1的估计值是1000,因为1000可以完成全表扫描。相似地,t2的估计值也是1000,但是这 个值是对于t1的每一行的。换句话说,优化器所估计的处理该查询所需要检查的数据行组合的数量是1000×1000,也就是一百万。这会造成很大的浪费, 因为实际上只有1000个组合符合WHERE子句的条件。 为了使这个查询的效率更高,给其中一个联结列添加索引并重新执行EXPLAIN语句: mysql> ALTER TABLE t2 ADD INDEX (i2); mysql> EXPLAIN ...

MySQL查询优化器(2)

Thursday, April 10th, 2008


使用EXPLAIN来检查优化器的操作 EXPLAIN对于了解优化器生成的、用于处理语句的执行计划的内部信息是很有帮助的。在这一部分中,我们将解释EXPLAIN的两种用途: · 查看采用不同的方式编写的查询是否影响了索引的使用。 · 查看向数据表添加索引对优化器生成高效率执行计划的能力的影响。 这一部分只讨论与示例相关的EXPLAIN输入字段。 前面,在"优化器是如何工作的"部分中我们得出的观点是,你编写表达式的方式将决定优化器是否能使用可用的索引。特别是上面的讨论使用了下面三个逻辑相等的WHERE子句的例子,只有第三个允许使用索引: WHERE TO_DAYS(date_col) - TO_DAYS(CURDATE()) < cutoff WHERE TO_DAYS(date_col) < cutoff + TO_DAYS(CURDATE()) ...

MySQL查询优化器(1)

Thursday, April 10th, 2008


当你提交一个查询的时候,MySQL会分析它,看是否可以做一些优化使处理该查询的速度更快。这一部分将介绍查询优化器是如何工作的。如果你想知道MySQL采用的优化手段,可以查看MySQL参考手册。 当然,MySQL查询优化器也利用了索引,但是它也使用了其它一些信息。例如,如果你提交如下所示的查询,那么无论数据表有多大,MySQL执行它的速度都会非常快: SELECT * FROM tbl_name WHERE 0; 在这个例子 中,MySQL查看WHERE子句,认识到没有符合查询条件的数据行,因此根本就不考虑搜索数据表。你可以通过提供一个EXPLAIN语句看到这种情况, 这个语句让MySQL显示自己执行的但实际上没有真正地执行的SELECT查询的一些信息。如果要使用EXPLAIN,只需要在EXPLAIN单词放在 SELECT语句的前面: ...