常用函数以及SQL

一、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'));

常用函数以及SQL_第1张图片

你可能感兴趣的:(常用函数以及SQL)