MySQL超i详细的知识点总结,小白也可进行参考,一看即会,---分组查询

1、知识点进行的前提是,了解数据库中表的简单结构:(为了方便大家,更加节省时间,已经将数据库创建的sql语句粘贴如下:)

/*创建数据库*/
create database des;
/*创建表*/
create table emp(
    id int comment '编号',
    warkno varchar(10) comment '工号',
    name varchar(32) comment '姓名',
    gender varchar(10) comment '性别',
    age int comment '年龄',
    idcard char(18) comment '身份证号',
    workaddress varchar(32) comment '地址',
    entrydate date comment '入职时间'
) comment '员工表';

在表中插入数据:

insert into emp (id,warkno,name,gender,age,idcard,workaddress,entrydate)
values (1,'1','李勇','','22','null','河南新乡','2001-01-09'),
       (2,'2','张晨','','20','410888000666686668','河南汝州','2001-06-09'),
       (3,'3','张碧','','22','410899000666688668','河南信阳','2001-09-09'),
       (4,'4','刘文','','21','41089900066666666X','河南新乡','2001-08-09'),
       (5,'5','王梓','','25','410899770666686668','河南商丘','2001-01-29'),
       (6,'6','张佳佳','','28','41089900066699666X','河南焦作','2001-01-19'),
       (7,'7','刘麻子','','20','410899990666686668','河南新乡','2001-02-09'),
       (8,'8','张三','','24','410899900666686668','河南新乡','2001-08-09'),
       (9,'9','李四','','20','null','河南新乡','2001-08-09'),
       (10,'10','姚浮','','25','410899008866686668','河南','2001-11-09'),
       (11,'11','冯涵','','28','41066600066668666X','河南','2011-06-09'),
       (12,'12','李欣','','20','null','河南','2008-09-09'),
       (13,'13','肖寒','','23','410787000666666668','河南','2009-08-09'),
       (14,'14','王麻子','','28','410899770667865668','河南','2001-08-29'),
       (15,'15','张浩','','20','null','河南','2010-01-19'),
       (16,'16','张伞','','20','41089999099068666X','河南','2008-02-09'),
       (17,'17','鲁尼','','29','416668900666686668','河南','2007-08-09'),
       (18,'18','嗯哼','','22','410886000699686668','河南','2009-08-09');

2、下面进行本章知识点的开始:

①分组查询(group by)

sql语句:select 字段列表 from 表名 where 条件 group by 分组的字段名 having 分组后过滤条件

注意:where和having的区别

执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组

                          having是分组之后对结果进行过滤分组的

判断条件不同:where不能对聚合函数进行判断

                          having可以。

对于分组有三个需求完成这三个问题将会了解分组查询的一些简单概念:

/*分组查询*/
/*1、根据性别分组,统计男性员工和女性员工的数量*/
/*首先查询出根据性别进行分组:select * from emp group by gender;由于是统计男性员工和女性员工的数量所以用聚合函数count*/
/*由于是求数量所以用count(),并且求的是总数量所以用count(*)聚合函数,*/
/*sql语句可以写为:select count* from emp group by gender但是由于算出来不知道哪一个是男性员工哪一个是女性员工所以在查询时,查询出性别*/
/*sql语句写为下面这种正确方法*/
select gender,count(*) from emp group by gender;
/*和上面相同的方法进行尝试*/
/*先尝试将所有员工按性别进行分组:select * from emp group by gender;*/
/*由于是求每个性别平均年龄所以select avg(age) from emp group by  gender;但是求出来不知道性别,所以最终sql语句如下*/
/*2、根据性别分组,统计男性性别和女性性别的平均年纪*/
select gender,avg(age) from emp group by  gender;
/*3、查询年纪小于22的员工,并根据工作地址分组,获取员工数量大于等于3的工作地址*/
/*首先先打出查询所有员工,并且以工作地址进行分组的sql语句:select * from emp group by workaddress;*/
/*由于需要筛选出来查询年龄小于22的员工所以上面的sql语句:select * from emp where age<22 group by workaddress;*/
/*并且要求获取员工数量用count()聚合函数,由于为了分辨所以查询时带上workadressselect workaddress,count(*) from emp where age<22 group by workaddress;*/
/*最后需要求员工数量大于等于3的工作地址,这个是对分组后的所以用having:如下*/
select workaddress,count(*) from emp where age < 22 group by workaddress having count(*)>=3;

注意:

执行顺序: where>聚合函数 >having

分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

侯你已久L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值