打算提升sql技能的,可以加我微信itsoku,带你成为sql高手。
这是Mysql系列第9篇。
环境:mysql5.7.25,cmd命令中进行演示。
本篇内容
-
分组查询语法
-
单字段分组
-
多字段分组
-
分组前筛选数据
-
分组后筛选数据
-
where和having的区别
-
分组后排序
-
where & group by & having & order by & limit 一起协作
-
mysql分组中的坑
-
in多列查询的使用
分组查询
语法:
-
SELECT column, group_function,...
FROM table
-
[
WHERE condition]
-
GROUP
BY group_by_expression
-
[
HAVING group_condition];
说明:
group_function:聚合函数。
group_by_expression:分组表达式,多个之间用逗号隔开。
group_condition:分组之后对数据进行过滤。
分组中,select后面只能有两种类型的列:
出现在group by后的列
或者使用聚合函数的列
聚合函数
函数名称 | 作用 |
---|---|
max | 查询指定列的最大值 |
min | 查询指定列的最小值 |
count | 统计查询结果的行数 |
sum | 求和,返回指定列的总和 |
avg | 求平均值,返回指定列数据的平均值 |
分组时,可以使用使用上面的聚合函数。
准备数据
-
drop table
if exists t_order;
-
-- 创建订单表
-
create table
t_order(
-
id int not
null
AUTO_INCREMENT
COMMENT
'订单id',
-
user_id bigint not
null comment
'下单人id',
-
user_name
varchar(
16) not
null
default
'' comment
'用户名',
-
price
decimal(
10,
2) not
null
default
0 comment
'订单金额',
-
the_year
SMALLINT not
null comment
'订单创建年份',
-
PRIMARY
KEY (id)
-
) comment
'订单表';
-
-- 插入数据
-
insert into
t_order(user_id,user_name,price,the_year) values
-
(
1001,
'路人甲Java',
11.11,
'2017'),
-
(
1001,
'路人甲Java',
22.22,
'2018'),
-
(
1001,
'路人甲Java',
88.88,
'2018'),
-
(
1002,
'刘德华',
33.33,
'2018'),
-
(
1002,
'刘德华',
12.22,
'2018'),
-
(
1002,
'刘德华',
16.66,
'2018'),
-
(
1002,
'刘德华',
44.44,
'2019'),
-
(
1003,
'张学友',
55.55,
'2018'),
-
(
1003,
'张学友',
66.66,
'2019');
-
mysql> select *
from t_order;
-
+----+---------+---------------+-------+----------+
-
| id | user_id | user_name | price | the_year |
-
+----+---------+---------------+-------+----------+
-
|
1 |
1001 | 路人甲
Java |
11.11 |
2017 |
-
|
2 |
1001 | 路人甲
Java |
22.22 |
2018 |
-
|
3 |
1001 | 路人甲
Java |
88.88 |
2018 |
-
|
4 |
1002 | 刘德华 |
33.33 |
2018 |
-
|
5 |
1002 | 刘德华 |
12.22 |
2018 |
-
|
6 |
1002 | 刘德华 |
16.66 |
2018 |
-
|
7 |
1002 | 刘德华 |
44.44 |
2019 |
-
|
8 |
1003 | 张学友 |
55.55 |
2018 |
-
|
9 |
1003 | 张学友 |
66.66 |
2019 |
-
+----+---------+---------------+-------+----------+
-
9 rows
in set (
0.00 sec)
单字段分组
需求:查询每个用户下单数量,输出:用户id、下单数量,如下:
-
mysql>
SELECT
-
user_id 用户id,
COUNT(id) 下单数量
-
FROM
-
t_order
-
GROUP
BY user_id;