MySQL小技巧
我觉得,最高效的项目是后台代码基本没有循环、遍历,和较少的判断,剩下的交给sql语句来搞定。所以高效简单的sql就成了重中之重,下面是开发时用到的sql小技巧。
1、ignore 和 replace
1.1 ignore
使用条件:用主键primary或者唯一索引unique区分了记录的唯一性
目 的:避免重复插入记录
示 例:
INSERT IGNORE INTO `table_name` (`email`, `phone`, `user_id`) VALUES ('test9@163.com', '99999', '9999');
结 果:这样当有重复记录就会忽略,执行后返回数字0
补 充:
INSERT IGNORE INTO `table_1` (`name`) SELECT `name` FROM `table_2`;
这个用法是复制表,避免重复记录,不需要加 VALUES
1.2 replace
REPLACE INTO `table_name`(`col_name`, ...) VALUES (...); REPLACE INTO `table_name` (`col_name`, ...) SELECT ...;
算法说明:REPLACE的运行与INSERT很相像,但是如果旧记录与新记录有相同的值,则在新记录被插入之前,旧记录被删除
即:
尝试把新行插入到表中 ,当因为对于主键或唯一关键字出现重复关键字错误而造成插入失败时:
从表中删除含有重复关键字值的冲突行 ,再次尝试把新行插入到表中
旧记录与新记录有相同的值的判断标准就是:
表有一个PRIMARY KEY或UNIQUE索引,否则,使用一个REPLACE语句没有意义。该语句会与INSERT相同,因为没有索引被用于确定是否新行复制了其它的行。
返回值:
REPLACE语句会返回一个数,来指示受影响的行的数目。该数是被删除和被插入的行数的和。
受影响的行数可以容易地确定是否REPLACE只添加了一行,或者是否REPLACE也替换了其它行,检查该数是否为1(添加)或更大(替换)。
REPLACE 还有将查询出的结果替换成别的值的功能
UPDATE `sourceurlrank` SET wx_id = REPLACE ( wx_id, 'https', 'http' );
2、ifnull 和avg
ifnull 用来给查询出为null的字段赋值,下面的语句意思是如果查询出的值为null时,给这个字段赋值为0
SELECT IFNULL(ranking,0) FROM `sourceurlrank`;
avg 用来将查询出的列求出平均值,和sum用法一样
SELECT AVG(ranking) FROM `sourceurlrank`;
3、VARCHAR转int
查询数据常常会用到 ORDER BY 来排序,但是如果字段类型是VARCHAR,而存储的值是int,那么排序就会出现问题,所以就有了转型
select * from gyzd order by cast(money as SIGNED INTEGER)
4、having用法
我们查询语句一般用where做判断条件,但当用到 group by 而且要对分组后的记录进行筛选的话,而where作用在 group by 之前, having子句是在分组后对组记录进行筛选
SELECT *,COUNT(*) FROM `sourceurlrank` GROUP BY wx_id HAVING COUNT(*)>1;
5、日期格式化 DATE_FORMAT(f.`DATE`, '%Y-%m-%d' )
当查询出的日期有 年月日时分秒 ,而只想要 年月日 时,就可以将日期格式化
SELECT DATE_FORMAT(`DATE`, '%Y-%m-%d' ) FROM `sourceurlrank`;
6、联合查询 union
UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行。
UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型。
同时,每条 SELECT 语句中的列的顺序必须相同.
SELECT column_name FROM table1 UNION SELECT column_name FROM table2
注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行
SQL UNION ALL 语法
SELECT column_name FROM table1 UNION ALL SELECT column_name FROM table2
7、日期和时间戳互相转换
日期转时间戳
SELECT UNIX_TIMESTAMP('2017-09-20')
时间戳转日期
select FROM_UNIXTIME(invest_time,'%Y年%m月%d') from crm_invest_apply