mysql的group by、order by和having、where比较

首先来探讨group byorder by

SELECT m.thing_id, m.moment_id FROM moment m where m.delete_flag = 0 and m.thing_id = -1

先不做任何处理,查询出两列数据

然后加上group by再看结果

SELECT m.thing_id, m.moment_id FROM moment m where m.delete_flag = 0 and m.thing_id = -1  group by thing_id

由结果可以看出加上group bything_id相同的列全部合并了,然后取了moment_id的第一个值。可见group by 就是分组的意思,把group by元素相同的列合并为一列。没有group by的元素我们就可以用count计数或者sum求和avg求平均数等操作,下面我把另一列计数统计

SELECT m.thing_id, count(m.moment_id) as mcount FROM moment m where m.delete_flag = 0 and m.thing_id = -1  group by thing_id


order by id asc或者 order by is desc 只是排序,不会有分组的作用

另外sql提供了直接加减乘除的算法,我也是偶然实验才知道的,把thing_idmoment_id加起来作为第三列,再排序

SELECT m.thing_id, m.moment_id,(m.thing_id+m.moment_id)as msum FROM moment m where m.delete_flag = 0 and m.thing_id = -1  order by msum ASC



到这里order bygroup by就已经很清晰了

然后我想筛选出msummsum<20的,我想到了where中加入msum<20



SELECT m.thing_id, m.moment_id,(m.thing_id+m.moment_id)as msum FROM moment m where m.delete_flag = 0 and m.thing_id = -1 AND msun<20 order by msum

但是这样是错误的,因为msum还没有被查询出来就把他加入条件判断,这样显然错了

所以我马上想到这样做,红色部分是从上面复制下来的。

select * from (<span style="color:#ff0000;">SELECT</span> <span style="color:#ff0000;">m.thing_id, m.moment_id,(m.thing_id+m.moment_id)as msum FROM moment m where m.delete_flag = 0 and m.thing_id = -1 ORDER BY msum</span>)a where a.msum<20

先把结果筛选(红色部分代码)出来再判断msum<20,这样当然可以,但是有更简单和效率的用法,就是having的用法了,用having就这样写。Order by一定写最后才行

SELECT m.thing_id, m.moment_id,(m.thing_id+m.moment_id)as msum FROM moment m where m.delete_flag = 0 and m.thing_id = -1 having msum<20 ORDER BY msum

到这里wherehaving的区别已经很明显了,having可以用该语句刚查询出来的元素作为筛选条件,而where的筛选条件必须是现存的,其中的奥妙需要自己体会了












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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值