MySQL -- SQL查询排序/分组/筛选

一、SQL查询排序/分组/筛选 (1)、总结(执行顺序)
3、select ... 聚合函数 from ...
1、where ...
2、group by ...
4、having ...
5、order by ...
6、limit ...;
注:一条SQL命令的执行顺序,一般先执行where语句,最后执行limit。下面分别介绍下group by、having、order by、limit的用法。
(2)、order by
1、作用:对查询的结果进行排序
2、语法格式:order by 字段名 排序方式;
3、排序方式
1、ASC(默认):升序
2、DESC:降序
4、练习(参考《MySQL -- 表记录管理和运算符操作》创建一个MoShou库)
MySQL -- SQL查询排序/分组/筛选
文章图片

1、将英雄按防御值从低到高排序
select * from sanguo order by fangyu ASC;
MySQL -- SQL查询排序/分组/筛选
文章图片

2、将蜀国英雄按攻击值从高到低排序
select * from sanguo where country="蜀国" order by gongji desc;
MySQL -- SQL查询排序/分组/筛选
文章图片

3、将魏蜀两国男英雄中名字为三个字的英雄按防御值升序排序
select * from sanguo where country in("蜀国","魏国") and sex="男" and name like "___" order by fangyu asc;
MySQL -- SQL查询排序/分组/筛选
文章图片

(3)、limit(永远放在SQL语句的最后面)
1、作用:限制显示查询记录的条数
2、用法
1、limit n -->显示几条记录
2、limit m,n
m表示从第几条记录开始显示,n表示显示几条;
m的值是从0开始计数的,3从第四条记录开始
limit 1,3 --> 显示 2、3、4 三条记录
3、练习
1、查找防御值倒数第二名至倒数第四名的蜀国英雄记录
select * from sanguo where country="蜀国" order by fangyu asc limit 1,3
MySQL -- SQL查询排序/分组/筛选
文章图片

2、查找攻击值前三名且名字不为空值得蜀国英雄的名字,攻击值和国家
select name,gongji,country from sanguo where name is not null and country="蜀国" order by gongji desc limit 3;
MySQL -- SQL查询排序/分组/筛选
文章图片

(4)、聚合函数
1、分类
1、avg(字段名) : 求字段的平均值
2、sum(字段名) : 求字段的和
3、max(字段名) : 求字段的最大值
4、min(字段名) : 求字段的最小值
5、count(字段名) : 统计该字段的记录的个数
2、练习
1、攻击力最强值是多少
select max(gongji) from sanguo;
select max(gongji) as zqgj from sanguo;
MySQL -- SQL查询排序/分组/筛选
文章图片

2、统计一下表中id,name字段分别有多少条记录
select count(id),count(name) from sanguo;
MySQL -- SQL查询排序/分组/筛选
文章图片

# 空值NULL不会被统计,空字符串""会被统计
3、计算蜀国英雄的总攻击力
select sum(gongji) from sanguo where country="蜀国";
MySQL -- SQL查询排序/分组/筛选
文章图片

4、统计蜀国英雄中攻击值大于200的英雄的数量
select count(*) from sanguo where country="蜀国" and gongji>200;
MySQL -- SQL查询排序/分组/筛选
文章图片

(5)、group by
1、作用:给查询的结果进行分组,通常配合聚合函数一起使用
2、语法格式:group by 字段名
3、练习
1、查询sanguo表中一共有几个国家
select country from sanguo group by country;
MySQL -- SQL查询排序/分组/筛选
文章图片

2、计算所有国家的平均攻击力
select country,avg(gongji) from sanguo group by country;
MySQL -- SQL查询排序/分组/筛选
文章图片

3、查找所有国家中,英雄数量最多的前2名的国家的名称及英雄数据
select country,count(*) from sanguo group by country order by count(*) desc limit 0,2;
MySQL -- SQL查询排序/分组/筛选
文章图片

4、注意:
1、group by后的字段名必须要为select之后的字段名
2、group by处理的是group by之后的所有字段,如果查询字段和group by之后的字段不一致,则必须要对该字段值做聚合处理(聚合函数)
(6)、having
1、作用:对查询的结果进行进一步筛选,通常配合group by使用
2、语法格式:group by 字段名 having 条件3、练习:
1、找出平均攻击力大于105的国家的前两名,显示国家名和平均攻击力
select country,avg(gongji) from sanguo group by country having avg(gongji)>105 order by avg(gongji) desc limit 2;
MySQL -- SQL查询排序/分组/筛选
文章图片

4、注意
1、having语句通常与group by语句联合使用,用来过滤由group by语句返回的记录集
2、having语句的存在弥补了where关键字不能与聚合函数联合使用的不足,having操作的是聚合函数生成的显示列
(7)、distinct
1、作用:不显示字段的重复值
2、语法格式:select distinct 字段名列表 from 表名; 3、练习:
1、sanguo表中一共有多少个国家
select distinct country from sanguo;
MySQL -- SQL查询排序/分组/筛选
文章图片

2、计算蜀国一共有多少个英雄
select count(distinct id) from sanguo where country="蜀国";
MySQL -- SQL查询排序/分组/筛选
文章图片

4、注意:
1、distinct处理的是distinct与from之间的所有字段,所有字段必须全部相同才能去重
2、distinct不能对任何字段做聚合处理
(8)、查询表记录时做数学运算
1、运算符:+ - * / %
2、练习
1、查询时显示所有英雄的攻击力*10
select id,name,gongji*10 as xgjl from sanguo;
MySQL -- SQL查询排序/分组/筛选
文章图片

2、查询时显示所有英雄的防御力+5
select id,name,fangyu+5 as xfy from sanguo;
MySQL -- SQL查询排序/分组/筛选
文章图片







【MySQL -- SQL查询排序/分组/筛选】

    推荐阅读