今日新学的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;
mysql 查询优化
最新推荐文章于 2024-05-12 20:39:09 发布