GROUP BY和HAVING入门

GROUP BY :分组查询,语句用于结合聚合函数,根据一个或多个列对结果集进行分组,最终得到一个分组汇总表。

一个学生信息表结构如下:
id    name             age        teacher  class   ranking      school
1     sunyan           22         a             1         3                 x
2     liukan             21         a             3         2                 x
3     zhangkai        19         b             1         1                 x
4     liuyongting     20        b             1         4                 y
5     zhanbin          24         b             3         5                 y
6     wangxiao        22        a              3         6                 y


sql语句(拿去直接用)
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `id` int(64) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int(64) DEFAULT NULL,
  `teacher` varchar(255) DEFAULT NULL,
  `class` varchar(255) DEFAULT NULL,
  `ranking` varchar(255) DEFAULT NULL,
  `school` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('1', 'sunyan', '22', 'a', '1', '3', 'x');
INSERT INTO `student` VALUES ('2', 'liukan', '21', 'a', '3', '2', 'x');
INSERT INTO `student` VALUES ('3', 'zhangkai', '19', 'b', '1', '1', 'x');
INSERT INTO `student` VALUES ('4', 'liuyongting', '20', 'b', '1', '4', 'y');
INSERT INTO `student` VALUES ('5', 'zhanbin', '24', 'b', '3', '5', 'y');
INSERT INTO `student` VALUES ('6', 'wangxiao', '22', 'a', '3', '6', 'y');

应用

查询每个班年龄最大的学生的姓名,班级,和年龄

SELECT name ,class ,MAX(age) AS MAXAGE FROM student 
GROUP BY class;

查询结果

name       class    MAXAGE

sunyan 1     22

liukan 3     24

结果解释:

select 查询这个结果,MAX(age)年龄最大值,AS重命名为 MAXAGE ,GROUP BY按班级分组。 

将where 子句与 GROUP BY一起使用

分组查询可以在形成组和计算列函数之前具有消除非限定行的标准where子句,必须在group by子句之前指定where子句!
查询x学校的每个班年龄最大的学生的姓名,班级,和年龄
SELECT name ,class ,MAX(age) AS MAXAGE FROM student 
WHERE school='x' 
GROUP BY class;

查询结果

name       class    MAXAGE

sunyan 1     22

liukan 3     21

GROUP BY子句之后使用Having子句
可应用限定条件进行分组,以便系统返回仅满足条件的组返回结果。因此GROUP BY子句后面包含一个HAVING。HAVING类似于WHERE (唯一的差别是WHERE过滤行,HAVING过滤组)HAVING支持所有WHERE操作符。
SELECT name ,class ,MIN(ranking) AS MINRANKING FROM student 
GROUP BY class 
HAVING AVG(age)>20;

查询结果

name       class    MINRANKING

sunyan 1     1
liukan 3     2


*AVG(age):取年龄的平均值。

name       class    MAXAGE

sunyan 1     22

liukan 3     21

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值