使用要求:可以包含任意数目的列,可以进行分组嵌套;
GROUP BY列出的每一列都必须是检索列或是有效的表达式(不能是聚集函数);
如果SELECt 列使用了表达式,则分组时GROUP BY也必须使用表达式,不能使用别名,例如一些时间的提取时使用YEAR(字段) 别名,则分组应该使用YEAR(字段),而不是别名;
GROUP BY 字段一般不允许包含长度可变的数据类型,例如一些备注字段;
GROUP BY 通常是和聚集函数(AVG,SUM,COUNT,MAX,MIN)一起使用的,GROUP BY 列需要包含SELECT部分除了聚合函数外的全部字段;
如果GROUP BY列中有NULL值存在,则NUL值会分为一组;
GROUP BY 使用位置必须在WHERe之后,ORDER BY之前。
#1、计算各学系有多少人次,其中男女各有多少人次 SELECT t.dept , t.ssex, COUNT(t.sno)num FROM student t where 1=1 group by t.dept, t.ssex; #2、计算各学系有多少人次,其中男女各有多少人次,并排序,默认升序,降序DESC SELECt t.dept , t.ssex, COUNT(t.sno)num FROM student t where 1=1 group by t.dept, t.ssex ORDER BY num;2、HAVINg子句
类似WHERe子句,不同之处在于WHERe子句过滤行,HAVINg子句过滤分组数据。当使用了分组后,想要再过滤数据,就用到HAVINg子句了。HAVINg子句位置在GROUP BY 之后,ORDER BY 之前。
#3、计算各学系有多少人次,统计人数大于等于3的, SELECt t.dept , count(t.sno)num FROM student t where 1=1 group by t.dept having count(t.sno)>=3; #4、统计各学系人次,统计人数大于等于3的,并按人数降序排列 SELECt t.dept , count(t.sno)num FROM student t where 1=1 group by t.dept having count(t.sno)>=3 order by count(t.sno) desc;3、ORDER BY :排序函数
ORDER BY 一般使用都在SQL查询的最后一行,不过在MYSQL中,它还要在LIMIT之前;
可以单字段排序,也可以多字段排序;
排序字段可以使用表达式,也可以使用别名,还可以使用栏位的下标。
#5、计算各学系有多少人次,其中男女各有多少人次 SELECt t.dept ,t.ssex, count(t.sno)num FROM student t where 1=1 group by t.dept, t.ssex ORDER BY num; SELECt t.dept ,t.ssex, count(t.sno)num FROM student t where 1=1 group by t.dept, t.ssex ORDER BY count(t.sno); SELECt t.dept ,t.ssex, count(t.sno)num FROM student t where 1=1 group by t.dept, t.ssex ORDER BY 3; -- 多字段排序,可以给每个字段指定排序方式 SELECt t.dept ,t.ssex, count(t.sno)num FROM student t where 1=1 group by t.dept, t.ssex ORDER BY t.dept ASC ,t.ssex DESC,num; SELECt t.dept ,t.ssex, count(t.sno)num FROM student t where 1=1 group by t.dept, t.ssex ORDER BY 1 ASC,2 DESC,3 DESC;
4、以上演示数据表语句,演示环境MYSQL8.0。
SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for student -- ---------------------------- DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `sno` varchar(7) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '学号', `sname` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '姓名', `ssex` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '性别', `sage` int(0) NULL DEFAULT NULL COMMENT '年龄', `dept` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '所在系', PRIMARY KEY (`sno`) USING BTREE, INDEX `SNO`(`sno`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of student -- ---------------------------- INSERT INTO `student` VALUES ('0811101', '李勇', '男', 21, '计算机系'); INSERT INTO `student` VALUES ('0811102', '刘晨', '男', 20, '计算机系'); INSERT INTO `student` VALUES ('0811103', '王敏', '女', 20, '计算机系'); INSERT INTO `student` VALUES ('0811104', '张小红', '女', 19, '计算机系'); INSERT INTO `student` VALUES ('0821101', '张立', '男', 20, '信息管理系'); INSERT INTO `student` VALUES ('0821102', '吴宾', '女', 19, '信息管理系'); INSERT INTO `student` VALUES ('0821103', '张海', '男', 20, '信息管理系'); INSERT INTO `student` VALUES ('0831101', '钱小平', '女', 21, '通信工程系'); INSERT INTO `student` VALUES ('0831102', '王大力', '男', 20, '通信工程系'); INSERT INTO `student` VALUES ('0831103', '张珊珊', '女', 19, '通信工程系'); SET FOREIGN_KEY_CHECKS = 1;