MySQL分组查询和子查询
1.分组查询
分组的使用方式:分组查询是为了将数据分成不同的组,然后对每组分别处理,对每组的数据做统计,所以一般都要配合聚集函数来使用。如果不做统计,单纯的分组是没有意义的,单纯分组会返回每组的第一条数据。
我们应该配合聚集函数使用分组,同时注意在聚集结果之前添加分组名称,不然不知道统计结果属于哪一组。
语法:关键字group by 后面跟上要分组的字段。
举例:select 班级,avg(年龄) form 表名 group by 班级;
SELECT classnum,AVG(age) FROM studentinfo GROUP BY classnum;
分组也可以加条件: 可以使用having关键字对分组之后统计的聚集结果进行进一步的筛选。having专门配合分组使用。
举例用的bus_car表,
例如
-- 统计不同车型的平均价格,然后只筛选平均价大于40万的车型
SELECT carnumber,AVG(price)FROM bus_car GROUP BY carnumber HAVING AVG(price)>400000;
-- 根据颜色分组,统计每种颜色车的数量,求数量大于3的组
SELECT color,COUNT(*) FROM bus_car GROUP BY color HAVING COUNT(*)>3;
-- 查询bus_rent表,查询租车订单数量排在前三名的操作员
SELECT opername,COUNT(*) FROM bus_rent GROUP BY opername ORDER BY COUNT(*) DESC LIMIT 3;
查询bus_rent表,查询租车订单数量大于等于3个的操作员
SELECT opername,COUNT(*) FROM bus_rent GROUP BY opername HAVING COUNT(*)>=3;
综合使用:
联合使用分组、排序、以及限制返回行数、条件查询等。注意它们的顺序:
select 分组字段,聚集函数统计的分组结果 from 表名 where 条件 group by 分组字段 having 分组之后的条件 order by 排序字段 limit 返回行数;
-- 查询bus_car表,求租金大于2500的平均车价在30万以上的平均车价最贵的汽车类型。
SELECT cartype,AVG(price)
FROM bus_car WHERE rentprice>2500
GROUP BY cartype HAVING AVG(price)>300000
ORDER BY AVG(price) DESC LIMIT 1;
2.子查询
子查询就是查询的嵌套,通过()表示嵌套的层级关系。
有的时候我们要查询的数据,一层查询是不够的,拿不到想要的数据。这时候可以把问题分解成两步,第一步先写一个查询,拿到中间数据,这个查询就是子查询。然后再写一个外层的查询,叫做父查询,父查询通过子查询的结果再去查询,得到最终结果。
嵌套查询执行过程:从最里层的查询开始执行,逐步往外执行。
例如·查询班级人数大于30人的班级的学生姓名
SELECT classnum FROM classinfo WHERE studentnums>30; -- 子查询
SELECT stuname FROM studentinfo WHERE classnum IN (SELECT classnum FROM classinfo WHERE studentnums>30); -- 查询嵌套
使用租车数据库,查询操作员李四出租的订单中车的价格
SELECT price FROM bus_car WHERE carnumber IN(SELECT carnumber FROM bus_rent WHERE opername='李四');
查询2019年10月的订单的车型描述信息
SELECT description FROM bus_car WHERE carnumber IN(SELECT DISTINCT carnumber FROM bus_rent WHERE createtime LIKE '2019-10%');