一、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';
可以查出凈值表中,最大凈值日期在某個日期區(qū)間的總數
二、任何你查詢出來的數據,都可以當成一個表,然后再從這個“表”里面篩選數據(多表關聯(lián)的時候很實用)
三、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好像會默認成字符串相減,而且存在隱式轉換問題
六、統(tǒng)計報表的時候,請記得先group by字段,知道這個字段都有哪些值,再做統(tǒng)計
七、統(tǒng)計近n個月度的數據:DATE_FORMAT(date_sub(curdate(), interval 3 month),'%Y-%m')
統(tǒng)計近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替換函數,將某些值替換成空(比如去掉某某關鍵字后,做一些數據分析或者統(tǒng)計)
函數的寫法:(將字段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和字符串的一些轉換。。。。。。太長了。。。??樟嗽賹?/p>
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'));
