一、where过滤行,having过滤组,having配合group by使用(很重要!)
比如:SELECT t2.fund_id FROM t_fund_net_value t2 GROUP BY t2.fund_id HAVING max(t2.fundnet_date) BETWEEN '20171216' AND '20180116';
可以查出净值表中,最大净值日期在某个日期区间的总数
二、任何你查询出来的数据,都可以当成一个表,然后再从这个“表”里面筛选数据(多表关联的时候很实用)
三、NOT REGEXP或者REGEXP可以用来不匹配或者匹配多个关键词,等价于not like,like
比如:SELECT COUNT(1) FROM t WHERE t1 NOT REGEXP '银行|信托|期货|保险|证券有限|证券股份|证券资产管理'
四、inner join 效率比in要高
比如:
select count(distinct i.company_id) from t_fund_info f inner join t_investment_advisor i on f.fund_id = i.fund_id where if_show=1
而不是:
SELECT count(distinct i.company_id) FROM t_investment_advisor i WHERE i.fund_id in (SELECT f.fund_id FROM t_fund_info f where f.if_show=1)
五、日期相减,用函数DATEDIFF('20180116','20171216'),用date_format()转换成日期格式,还是是错的,MySQL好像会默认成字符串相减,而且存在隐式转换问题
六、统计报表的时候,请记得先group by字段,知道这个字段都有哪些值,再做统计
七、统计近n个月度的数据:DATE_FORMAT(date_sub(curdate(), interval 3 month),'%Y-%m')
统计近n年的数据:DATE_FORMAT(date_sub(curdate(), interval 3 year),'%Y-%m')
比如,最近12个月度,每月至少1条净值
SELECT t2.fund_id,COUNT(1) FROM
(SELECT fund_id,
DATE_FORMAT(t.fundnet_date,'%Y-%m') myMONTH,
COUNT(1) AS avg_sum_monthly
FROM t_fund_net_value t WHERE
DATE_FORMAT(t.fundnet_date,'%Y-%m')> DATE_FORMAT(date_sub(curdate(), interval 12 month),'%Y-%m')
AND t.fund_id in (SELECT t3.fund_id FROM t_fund_info t3 WHERE t3.if_show=1 AND t3.fund_run_state=1)
GROUP BY fund_id,myMONTH) t2
GROUP BY t2.fund_id HAVING COUNT(1)>=3;(注意这里的3,这是计算每个月的,近3个月,所以是3)
八、MySQL中可以利用一些函数,比如replace替换函数,将某些值替换成空(比如去掉某某关键字后,做一些数据分析或者统计)
函数的写法:(将字段fund_name中,一些特殊字符去掉),比如该函数叫做:sf_rep
BEGIN
RETURN replace(replace(replace(fund_name, '•', '') ,'●', ''),';','');
END
则SQL中可以这样使用:
SELECT sf_rep (fund_name) AS fund_simple_name,fund_name FROM t_fund_info
九、IFNULL(REPLACE(record_number,'',NULL),UUID()):将该字段所有空值替换成null值,然后如果为空,在给一个随机数。。。。。。。。。。。。。。。。
十、SQL中int和字符串的一些转换。。。。。。太长了。。。。空了再写
SELECT * FROM t_fund_info WHERE fund_id in ('1','4','9');
SELECT * FROM t_fund_info WHERE fund_id in ('1,4,9');
SELECT CAST(('1,4,9') AS SIGNED);
SELECT * FROM t_fund_info WHERE fund_id in (1);
SELECT * FROM t_fund_info WHERE FIND_IN_SET(fund_id,('1,4,9'));