having⼦句详解执⾏顺序
1. Having ⼦句⽤于对查询表结构进⾏处理,可⽤于分组之后,多和group by⼀起使⽤,放在group by之后,可包含聚合函数。
2. Having⼦句可⽤于group by之后,语法类似于where⼦句,where⼦句⽤于group by 之前。
4. having⼦句中可以使⽤聚合函数,where语句中不可以使⽤聚合函数
5. Having⼦句执⾏顺序:where语句>group by>聚合函数>Having
6. Mysql中group by之后会⾃动对分组的数据进⾏聚合处理,选取每组的第⼀个。(Mysql语法不严谨,Hive中未被分组的字段就必须采⽤聚合处理。)
SQL中各字句执⾏顺序:
select col_name from table
where col_name > xxx
group by col_name
having ...
order by ... desc
如下将通过实例对Having⼦句进⾏理解
1.建⽴数据表
/*
Navicat MySQL Data Transfer
Source Server        : arvin
Source Server Version : 50624
Source Host          : localhost:3306
Source Database      : blog
Target Server Type    : MYSQL
Target Server Version : 50624
File Encoding        : 65001
Date: 2017-11-07 10:02:24批处理调用批处理
*/
SET FOREIGN_KEY_CHECKS=0;
c4droid官方下载-- ----------------------------
-- Table structure for test
-- ----------------------------
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`score` varchar(255) DEFAULT NULL,
c webservice`num` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of test
-- ----------------------------
INSERT INTO `test` VALUES ('1', 'zhangsan', '80', 'Math');
INSERT INTO `test` VALUES ('2', 'zhangsan', '80', 'English');
INSERT INTO `test` VALUES ('3', 'zhangsan', '90', 'Code');
INSERT INTO `test` VALUES ('4', 'lisi', '70', 'Math');
INSERT INTO `test` VALUES ('5', 'lisi', '80', 'English');
INSERT INTO `test` VALUES ('6', 'lisi', '100', 'Code');
INSERT INTO `test` VALUES ('7', 'wangwu', '80', 'Math');
INSERT INTO `test` VALUES ('8', 'wangwu', '80', 'English');
INSERT INTO `test` VALUES ('9', 'wangwu', '90', 'Code');
#在不使⽤group by的情况下,使⽤having⼦句
SELECT t.*
from test t
HAVING t.score>75
;
结果:
结论:在不搭配group by 的情况下,使⽤having⼦句仅仅对结果进⾏限制,等价于where条件。#having⼦句理解
题⽬1:出每⼀门科⽬(num)均⼤于75分的学⽣(score)。
因为having可以对group by的结果进⾏处理,有如下语句:
SELECT t.*
from test t
GROUP BY t.`name`
HAVING t.score>75
;
结果:
看似并没有问题,那么我们把数据改⼀下,把图中两个数据改⼀下:
再次运⾏,发现结果不对了,
正确结果应该仍然是zhangsan、lisi,这是为什么呢?
原因很简单:参考第六点关于Mysql中group by函数的不严谨性。
having⼦句是对之前的结果表进⾏处理,⽽我们只运⾏having之前的结果,即group by的结果,就会发现如下:
⽽having⼦句对这个结果进⾏判断,在他看来只有三条记录,⽽每个记录都是⼤于75的,因⽽会出现刚才错误的结果。所以正确的算法就是取得最⼩的成绩⼤于75即可。
SELECT `name`,MIN(score) as score
from test t
GROUP BY t.`name`
HAVING score>75
;
或者可以使⽤如下语句直接选出⼈员
awarded
SELECT `name`
from test t
GROUP BY t.`name`
HAVING MIN(score)>75
如下图:
mysql语句的执行顺序
matlab自身编程语言#having⼦句与聚合函数使⽤
题⽬2:算出平均分>80的学⽣。
SELECT `name`, score
from test t
GROUP BY t.`name`
HAVING AVG(score)>80
;
这⾥我们可以发现:
聚合函数AVG的执⾏顺序实在Having之前。题⽬3:计算平均分>80且总分⼤于250的。
SELECT `name`, score
from test t
GROUP BY t.`name`
HAVING AVG(score)>80
AND SUM(score)>250
;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。