天天看点

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

首先来探讨group by和order by

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

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

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

然后加上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
           
mysql的group by、order by和having、where比较

由结果可以看出加上group by把thing_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
           
mysql的group by、order by和having、where比较

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

另外sql提供了直接加减乘除的算法,我也是偶然实验才知道的,把thing_id和moment_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
           
mysql的group by、order by和having、where比较

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

然后我想筛选出msum中msum<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
           
mysql的group by、order by和having、where比较

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