mysql概要(三)having
2016-01-14 15:39
671 查看
1.运算符
![](http://images2015.cnblogs.com/blog/874126/201601/874126-20160113170328616-776533608.png)
2.模糊查询
![](http://images2015.cnblogs.com/blog/874126/201601/874126-20160113170920303-187956169.png)
3.where 后的判断基于表(表的直接内容),而不是基于结果(运算之后的别名)如:
![](http://images2015.cnblogs.com/blog/874126/201601/874126-20160113173727553-638805242.png)
可改成在where后再次重新计算判断:
![](http://images2015.cnblogs.com/blog/874126/201601/874126-20160113173905819-1309545934.png)
或者使用having对结果判断:
![](http://images2015.cnblogs.com/blog/874126/201601/874126-20160113174017319-1907961520.png)
having多用于group by 配合使用
4。一个实例
![](http://images2015.cnblogs.com/blog/874126/201601/874126-20160113182354850-1856581053.png)
插入多条记录insert into stu values('张三','数学',90),('张三','语文',50),('张三','地理',40),('张四','数学',90),('张四','数学',30),('张四','数学',20),('张无','数学',30);
name course score
a:第一个想法是分组之后求出所有平均成绩却求不出未及格科目数量。所以就先取出所有两门以上未及格的学生再求平均
select avg(score),name from stu where name in(select name from stu where score<60 group by name having count(score) >=2) group by name;
b:一种更好的方案是:先求出平均分,再mysql没有布尔型可以通过逻辑判断是否及格得到1或0;通过求和得到未及格的数量,再进行判断
select name,avg(score),sum(score<60) as lowscore from stu group by name having lowscore>=2;
关于执行顺序说明:
group by 字句也和where条件语句结合在一起使用。当结合在一起时,where在前,group by 在后。即先对select xx from xx的记录集合用where进行筛选,然后再使用group by 对筛选后的结果进行分组 使用having字句对分组后的结果进行筛选
需要注意having和where的用法区别:
1.having只能用在group by之后,对分组后的结果进行筛选(即使用having的前提条件是分组)。
2.where肯定在group by 之前
3.where后的条件表达式里不允许使用聚合函数,而having可以。
当一个查询语句同时出现了where,group by,having,order by的时候,执行顺序和编写顺序是:
1.执行where xx对全表数据做筛选,返回第1个结果集。
2.针对第1个结果集使用group by分组,返回第2个结果集。
3.针对第2个结果集中的每1组数据执行select xx,有几组就执行几次,返回第3个结果集。
4.针对第3个结集执行having xx进行筛选,返回第4个结果集。
5.针对第4个结果集排序。
![](http://images2015.cnblogs.com/blog/874126/201601/874126-20160113170328616-776533608.png)
2.模糊查询
![](http://images2015.cnblogs.com/blog/874126/201601/874126-20160113170920303-187956169.png)
3.where 后的判断基于表(表的直接内容),而不是基于结果(运算之后的别名)如:
![](http://images2015.cnblogs.com/blog/874126/201601/874126-20160113173727553-638805242.png)
可改成在where后再次重新计算判断:
![](http://images2015.cnblogs.com/blog/874126/201601/874126-20160113173905819-1309545934.png)
或者使用having对结果判断:
![](http://images2015.cnblogs.com/blog/874126/201601/874126-20160113174017319-1907961520.png)
having多用于group by 配合使用
4。一个实例
![](http://images2015.cnblogs.com/blog/874126/201601/874126-20160113182354850-1856581053.png)
插入多条记录insert into stu values('张三','数学',90),('张三','语文',50),('张三','地理',40),('张四','数学',90),('张四','数学',30),('张四','数学',20),('张无','数学',30);
name course score
a:第一个想法是分组之后求出所有平均成绩却求不出未及格科目数量。所以就先取出所有两门以上未及格的学生再求平均
select avg(score),name from stu where name in(select name from stu where score<60 group by name having count(score) >=2) group by name;
b:一种更好的方案是:先求出平均分,再mysql没有布尔型可以通过逻辑判断是否及格得到1或0;通过求和得到未及格的数量,再进行判断
select name,avg(score),sum(score<60) as lowscore from stu group by name having lowscore>=2;
关于执行顺序说明:
group by 字句也和where条件语句结合在一起使用。当结合在一起时,where在前,group by 在后。即先对select xx from xx的记录集合用where进行筛选,然后再使用group by 对筛选后的结果进行分组 使用having字句对分组后的结果进行筛选
需要注意having和where的用法区别:
1.having只能用在group by之后,对分组后的结果进行筛选(即使用having的前提条件是分组)。
2.where肯定在group by 之前
3.where后的条件表达式里不允许使用聚合函数,而having可以。
当一个查询语句同时出现了where,group by,having,order by的时候,执行顺序和编写顺序是:
1.执行where xx对全表数据做筛选,返回第1个结果集。
2.针对第1个结果集使用group by分组,返回第2个结果集。
3.针对第2个结果集中的每1组数据执行select xx,有几组就执行几次,返回第3个结果集。
4.针对第3个结集执行having xx进行筛选,返回第4个结果集。
5.针对第4个结果集排序。
相关文章推荐
- MySQL报错汇总
- mySQL表和列的注释相关操作
- MySQL innodb表空间
- mysql 存储过程,搞死人的语法
- Can't connect to local MySQL server through socke
- mysql-bin占用空间太大的问题
- 设置mysql允许外网访问
- mysql 自定义自增序列
- MySQL基础知识
- 设置Mysql的连接超时参数
- 【总结】MySQL性能优化
- 【总结】MySQL数据库
- keepalived+mysql双主
- wamp环境中mysql更改root密码
- MySQL数据库的热备份和冷备份优缺点
- mysql启动提示mysql.host 不存在,启动失败的解决方法
- 磁盘已满造成的mysql启动失败问题分享
- MySQL下常见的启动失败与备份失败问题的解决教程
- mysql 使用inet_aton和inet_ntoa处理ip地址数据
- MySQL的类似if else 的判断