工作中的一个SQL查询总结

前一段时间的工作中有一项是计算实时统计结果并生成相应的数据表(主要是算产品PV,UV的环比什么的)。
所谓实时统计,就是终端请求Server接口时把相应数据写进日志,然后使用Python分析日志程序,将各统计项整理成各自的文件。再将这些整理好的文件定时发送到解析文件接口中解析并入库。最后写SQL计算统计结果。
顺便提一句,我们用的是MySQL,单库千万量级以下的数据都没问题。例如每天往表里写2w数据,则10000000/20000 = 500天内不需要优化。
回到正题,下面是这个SQL中使用到的一些技巧(SQL实在太长就不贴了):
1.select子句中的条件查询:
(CASE
WHEN sd.type=1 THEN (select a.title from db1.apk a where a.id=sd.materialId)
WHEN sd.type=2 THEN (select d.title from db1.ad d where d.id=sd.materialId)
WHEN sd.type=3 THEN (select w.title from db1.wallpaper w where w.id=sd.materialId)
END) as title,
原来也知道在SQL中可以写条件查询,但是没用过,这次用了一下,就是CASE...WHEN...THEN...[ELSE] ...END...
2.多库join查询:
说实话,这个原来确实没听说过(不知道其它数据库如Oracle什么的是不是也有这个功能).上网查了一下才发现的,自己试一试果然没问题。所谓多库join就是不同数据库中的表进行关联查询。
解决方法:在MySQL中其实很简单,就是查询时在表名前加上数据库名就行啦:)
例如上面的sql语句,db1是一个库中的表,将其查询结果作为db2表中的查询列(当然做join等操作也是没问题的)。
3.相关子查询:
SELECT
sd.statTime,sd.type,sd.materialId,sd.pv,sd.token, 
(select SUM(totalpvtab.pv) from statdetail totalpvtab where totalpvtab.statTime=sd.statTime and totalpvtab.materialId=sd.materialId and totalpvtab.type=sd.type) totalpv,
FROM ....
就是将外层查询的列作为子查询的查询条件了。
4.SQL函数:
还用到一些SQL函数如:
DATEDIFF(sd.statTime,a.createdTime)  --  计算两个日期天数差,
ABS(X) -- 取X绝对值,
等等。
先写到这里吧,明天继续。

猜你喜欢

转载自shensy.iteye.com/blog/1596868