最近工作中碰到不少关于mysql的问题,以前天真的认为掌握增删改查就没什么问题了,结果是屡次碰壁。事实上mysql还有很多很多需要研究的东西。。
整理了一下自己最近遇到的一些问题,还有一些理论性的东西,正所谓知识在于分享,所以就贴出来作为笔记,也希望能帮到一些朋友。
1、首先是where和having的区别:
作用的对象不同。WHERE 子句作用于表和视图,HAVING 子句作用于组。众所周知,我们用where的时候都是作为一些限制条件,而这些条件绝大部分都是属于扫描全表性质的。
WHERE 在分组和聚集计算之前选取输入行(因此,它控制哪些行进入聚集计算), 而 HAVING 在分组和聚集之后选取分组的行。
因此,WHERE 子句不能包含聚集函数; 因为试图用聚集函数判断那些行输入给聚集运算是没有意义的。 相反,HAVING 子句总是包含聚集函数。
我们一般用where都是where id=1之类的,而从来没有用过where count(id)=1,这种用法是会报错的。
例如:有个订单表,字段分别是,customer,price,我们需要查找订单总额大于2000的用户:
select customer,SUM(price) from order group by customer HAVING SUM(price)>2000;
在限制条件需要使用聚合函数时,就不能再用单纯的where来限制了。
需要注意的是,having一般跟在group by之后,执行记录组选择的一部分来工作的。
2、简述group by
group by:where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。。
注意:在SELECT语句中指定的每个列名也在GROUP BY子句中提到。未在这两个地方提到的列名将产生错误。
group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面(重要)
例如:select A,B from table group by A
(错误的,因为B没有用聚合函数,且没有出现在group by之后)
select A,count(B) as 数量 from table group by A
(正确的语法,使用聚合函数的字段不需要出现在group by 之后)
3、mysql中的count和sum的区别:
这两个字段是我们经常需要用到的,很基础的聚合函数,但基础的也许是关注最少的,所以在此也简单的说一下。 count 是‘累计’; sum是‘累加’;
count:例如:查询每个年级中分数大于60的有多少人以及他们的平均分,总分是多少:
语句:select grade ,count(*) ,avg(score) from a_info where score>60 group by grade ;
sum:例如:查询每个年级总分数大于200的用哪些;
语句:select grade ,sum(score) from a_info a group by grade having sum(score) >200;
本文多数为在下工作中碰到然后百度下来的,零零散散的记录,如果有侵权,请通知一下,不胜感激。