mysql 查询优化

今日新学的sql,统计总数以及分条展示
最近做数据统计这块儿业务的时候,遇到了sql难点,于是整理了一些。
1. 查询符合条件的每一条数据以及某一列的总值。
*1. 1. 使用联合查询之union*
select 语句1
union (all:保留所有,不管重复),(Distinct:去重,默认的)
select 语句2
要求两条sql查询字段一样多,但与数据类型无关。
select effectDate ,sum(click) from book_stat_day where bookId=1 GROUP BY effectDate union select ‘all’ as effectDate ,sum(click) from book_stat_day where bookId=1;
上例是按照日期查询,每一天的点击数以及总点击数。此处使用了别名,否则最后总计日期为null。
*1. 2. 使用with rollup进行处理*
select effectDate ,sum(click) as sumTotal from book_stat_day where bookId=1 GROUP BY effectDate with ROLLUP;
查询了按照日期统计的每天数值以及总值,但是缺少了总值的名称,可以采用如下ifnull进行处理别名,但是得处理effectDate本身为空的别名情况
select ifnull(effectDate,’total’) ,sum(click) as sumTotal from book_stat_day where bookId=1 GROUP BY effectDate with ROLLUP
*1.3 可以使用将查询结果作为字表进行再次处理以及排序等。*
使用sum(if(条件,求和字段,null)) 函数来进行行列的转置
2. 外链接
左外连接(LEFT OUTER JOIN即left join)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)都返回符合连接条件和查询条件(即:内连接)的数据行。on后面直接连接条件,不加表查询条件
但是左外连接还返回左表中不符合连接条件但符合查询条件的数据行,从表不符合条件的显示null。可以通过where 条件来对匹配阶段产生的数据中检索过滤,进一步选择想要的符合a不符合b的等数据。但从执行效率来看,最好将where条件列在on后面进行过滤。
如select * from A inner join B on B.name = A.name
left join C on C.name = B.name and C.status>1
left join D on D.id = C.id and D.status=1 ,
优于
select * from A inner join B on B.name = A.name
left join C on C.name = B.name
left join D on D.id = C.id
where C.status>1 and D.status=1;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值