查询:分组与排序


1.排序:order by

select * from info order by age desc; -- desc:倒序
select * from info order by age asc;  -- asc顺序

select * from info order by id desc;
select * from info order by id asc;
-- 优先按照age从小到大;如果age相同则按照id从大到小。
select * from info order by age asc,id desc; 
select * from info where id>10 order by age asc,id desc;
select * from info where id>6 or name like "%y" order by age asc,id desc;

2.取部分:limit

select * from info limit 5;   				 -- 获取前5条数据
select * from info order by id desc limit 3;		 -- 先排序,再获取前3条数据
select * from info where id > 4 order by id desc limit 3; -- 先排序,再获取前3条数据

select * from info limit 3 offset 2;	-- 从位置2开始,向后获取前3数据

 数据库表中:1000条数据。

  • 第一页:select * from info limit 10 offset 0;
  • 第二页:select * from info limit 10 offset 10;
  • 第三页:select * from info limit 10 offset 20;
  • 第四页:select * from info limit 10 offset 30;
  • ...

3.分组:group by

  • 通常用于按照某一列进行分组,把这一列相同的数据合并到一起

         例如:获取info表中每个年龄各有多少人

          select age ,count(id) from info group by age;    --以age列进行分组,所有相同的合并到一起

         

  • 进行分组时,想显示其他列的值,但是其他列值都不相同,就不知道保留那个值,这时可以使用聚合函数

         示例1:

         select age,max(id) from info group by age;    --以age进行分组,id会显示合并后的最大值

         表中age = 49 有两条数据,id分别为3和7,这里合并后就会显示7

         

         示例2:其他的聚合函数

          select age,count(id),max(id),min(id),sum(id),avg(id) from info group by age;

         

  • 按照条件进行分组:having

         # 查询相同年龄大于1的

         select age,count(id) from info group by age having count(id) > 1;

         查询出年龄为49岁的大于1

4.执行顺序

  • 目前学习的sql执行顺序为:

         where、group by 、having、order by、limit

select age,count(id) from info where id > 2 group by age having count(id) > 1 order by age desc limit 1;
- 要查询的表info
- 条件 id>2
- 根据age分组
- 对分组后的数据再根据聚合条件过滤 count(id)>1
- 根据age从大到小排序
- 获取第1条