分组查询
- 对数据按照某个或多个字段进行分组(使用group by分组),然后查看
- group by通常与集合集合函数放在一起使用
一、group by基本使用
将s_id分组,然后算每一种s_id的数量
- select s_id,count(*) AS Total from fruits group by s_id;
二、group_concat函数
- group_concat函数可以将括号内的指定字段显示出来
将s_id分组,然后显示每种s_id中的f_name
- select s_id,group_concat(f_name) AS Names from fruits group by s_id;
三、使用having过滤分组
- having后面接条件,只显示满足后面条件的数据
- having与where的不同:where是分组之前筛选,having是分组之后再筛选
先通过s_id将数据分组,然后显示s_id中对应的f_name种类大于1的数据
- select s_id,group_concat(f_name) AS Names from fruits group by s_id having count(f_name) >1;
四、在group by中使用with roolup
- with rollup:可用于算出查询字段的总数,然后再所有的数据最后一行添加新的一行,用于列出指定字段的总数值
先按照s_id分组查询,然后算出s_id的总数
- select s_id,count(*) AS Total from fruits group by s_id with rollup;
五、多字段分组
- group by后面跟多个分组字段。分组层次从左到右,即先按第1个字段分组,然后再根据第2个字段进行分组
- 先按s_id分组,然后再按f_name分组
六、group by和order by一起使用
- 先根据group by将字段分组,然后再根据order by后面的字段排序
create table orderitems(
o_num int not null,
o_item int not null,
f_id char(10) not null,
quantity int not null, //数量
item_price decimal(8,2) not null, //单价
primary key(o_num,o_item)
);
- 先根据o_num分组,然后通过having筛选出订单总价大于100的o_num,然后通过订单总价进行排序
select o_num,sum(quantity*item_price) As Total from orderitems group by o_num having sum(quantity*item_price)>100 order by Total;