在MySQL中,分组查询的语法为
select 列表列名
from 表名
[where 条件]
group by 分组列名
[having 分组后的条件过滤]
[order by 排序列名 排序方式]
DDL创建一个product表
create table product (
id int auto_increment not null primary key,
name varchar(10) not null,
price int not null,
brand varchar(10) not null,
stock int,
insert_time date
);
id | name | price | brand | stock | insert_time |
---|---|---|---|---|---|
1 | 华为手机 | 3999 | 华为 | 23 | 2088-03-10 |
2 | 小米手机 | 2999 | 小米 | 30 | 2088-05-15 |
3 | 苹果手机 | 5999 | 苹果 | 18 | 2088-08-20 |
4 | 华为电脑 | 6999 | 华为 | 14 | 2088-06-16 |
5 | 小米手机 | 4999 | 小米 | 26 | 2088-07-08 |
6 | 苹果电脑 | 6999 | 苹果 | 15 | 2088-10-25 |
7 | 联想电脑 | 7999 | 联想 | null | 2088-11-11 |
DML插入数据
insert into product values (1, '华为手机', 3999, '华为', 23, '2088-03-10'),
(2, '小米手机', 2999, '小米', 30, '2088-05-15'),
(3, '苹果手机', 5999, '苹果', 18, '2088-08-20'),
(4, '华为电脑', 6999, '华为', 14, '2088-06-16'),
(5, '小米手机', 4999, '小米', 26, '2088-07-08'),
(6, '苹果电脑', 6999, '苹果', 15, '2088-10-25'),
(7, '联想电脑', 7999, '联想', null, '2088-11-11');
使用DQL分组查询
按照品牌分组,获取每组商品的总金额
select brand, sum(price) from product group by brand;
查询结果:
brand | sum(price) |
---|---|
华为 | 10998 |
小米 | 7998 |
苹果 | 12998 |
联想 | 7999 |
对金额大于4000元的商品,按照品牌分组,获取每组商品的总金额
select brand, sum(price) from product where price > 4000 group by brand;
查询结果:
brand | sum(price) |
---|---|
苹果 | 12998 |
华为 | 6999 |
小米 | 4999 |
联想 | 7999 |
对金额大于4000元的商品,按照品牌分组,获取每组商品的总金额,只显示总金额大于7000元的
select brand, sum(price) as getSum from product where price > 4000 group by brand having getSum > 7000;
查询结果:
brand | getSum |
---|---|
苹果 | 12998 |
联想 | 7999 |
对金额大于4000元的商品,按照品牌分组,获取每组商品的总金额,只显示总金额大于7000元的,并按照总金额升序排序
select brand, sum(price) as getSum
from product
where price > 4000
group by brand
having getSum > 7000
order by getSum asc;
查询结果:
brand | getSum |
---|---|
联想 | 7999 |
苹果 | 12998 |
总结:
where
是对分组前的元组根据一定条件进行过滤,用于选择满足给定条件的元组,不能使用聚合函数。group by
可按指定列的值分组 .having
搭配group by
使用,对分组后的元组根据一定条件进行过滤,可提取满足条件的组,可以使用聚合函数。