1. MySQL分组概述
group by 字段分组,以哪个字段分组就是以哪个字段作为唯一值进行分组,多个字段同样道理。
having相当于是分组后的条件语句。
2. MySQL分组语法结构
select 字段 from 表名 where 条件 group by 字段
select 字段 from 表名 group by 字段 having 过滤条件
注意:对于过滤条件,可以先用where,再用group by或者是先用group by,再用having
3. 测试验证
CREATE TABLE ` tab_employee` (
` id` BIGINT ( 20 ) NOT NULL AUTO_INCREMENT ,
` num` VARCHAR ( 2 ) DEFAULT NULL COMMENT '统计' ,
` name` VARCHAR ( 255 ) DEFAULT NULL COMMENT '姓名' ,
` grade` VARCHAR ( 30 ) DEFAULT NULL COMMENT '级别' ,
` salary` VARCHAR ( 30 ) DEFAULT NULL COMMENT '薪资' ,
PRIMARY KEY ( ` id` )
) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT '员工信息表' ;
SELECT * FROM tab_employee;
DROP TABLE tab_employee;
DELETE FROM tab_employee;
INSERT INTO tab_employee( num, NAME, grade, salary) VALUES ( '1' , '张三' , 'A' , 1500 ) ;
INSERT INTO tab_employee( num, NAME, grade, salary) VALUES ( '1' , '张三' , 'A' , 2000 ) ;
INSERT INTO tab_employee( num, NAME, grade, salary) VALUES ( '1' , '张三' , 'B' , 1500 ) ;
INSERT INTO tab_employee( num, NAME, grade, salary) VALUES ( '1' , '李四' , 'A' , 1500 ) ;
INSERT INTO tab_employee( num, NAME, grade, salary) VALUES ( '1' , '李四' , 'B' , 2000 ) ;
INSERT INTO tab_employee( num, NAME, grade, salary) VALUES ( '1' , '王五' , 'A' , 1500 ) ;
INSERT INTO tab_employee( num, NAME, grade, salary) VALUES ( '1' , '赵六' , 'C' , 1500 ) ;
INSERT INTO tab_employee( num, NAME, grade, salary) VALUES ( '1' , '田七' , 'D' , 1500 ) ;
SELECT * FROM tab_employee;
SELECT grade FROM tab_employee;
SELECT COUNT ( num) , NAME FROM tab_employee GROUP BY NAME;
SELECT COUNT ( num) , grade FROM tab_employee GROUP BY grade;
SELECT COUNT ( num) , NAME, grade FROM tab_employee GROUP BY NAME, grade;
SELECT COUNT ( num) , NAME, grade FROM tab_employee GROUP BY grade, NAME;
SELECT COUNT ( num) , NAME FROM tab_employee GROUP BY NAME;
SELECT SUM ( salary) , NAME FROM tab_employee GROUP BY NAME;
SELECT NAME, AVG ( salary) FROM tab_employee GROUP BY NAME, grade;
SELECT NAME, grade, AVG ( salary) FROM tab_employee GROUP BY NAME, grade;
SELECT grade, MAX ( salary) FROM tab_employee GROUP BY grade;
SELECT NAME, grade, MAX ( salary) FROM tab_employee GROUP BY grade, NAME;
SELECT NAME, grade, MIN ( salary) FROM tab_employee GROUP BY grade, NAME;
SELECT COUNT ( num) , NAME FROM tab_employee GROUP BY NAME;
SELECT COUNT ( num) , NAME FROM tab_employee GROUP BY NAME HAVING COUNT ( num) > 1 ;