- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章浅谈MySQL中的group by由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
mysql的group by用于对查询的数据进行分组;此外mysql提供having子句对分组内的数据进行过滤.
mysql提供了许多select子句关键字, 。
它们在语句中的顺序如下所示:
子句 | 作用 | 是否必须/何时使用 |
---|---|---|
select | 查询要返回的数据或者表达式 | 是 |
from | 指定查询的表 | 否 |
where | 指定行级过滤 | 否 |
group by | 分组 | 否/对数据分组时使用 |
having | 分组过滤 | 否/对分组后的数据过滤使用 |
order by | 返回数据时指定排序规则 | 否 |
limit | 指定返回数据的行数 | 否 |
准备一张user表,其ddl和表数据如下所示 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
set
names utf8mb4;
set
foreign_key_checks = 0;
-- ----------------------------
-- table structure for user
-- ----------------------------
drop
table
if exists `
user
`;
create
table
`
user
` (
`id`
bigint
(20)
not
null
auto_increment comment
'主键'
,
`
name
`
varchar
(255)
character
set
utf8
collate
utf8_general_ci
not
null
comment
'用户名'
,
`nation`
varchar
(255)
character
set
utf8
collate
utf8_general_ci
null
default
null
comment
'民族'
,
`age`
int
(11)
null
default
null
comment
'年龄'
,
`height`
double
null
default
null
comment
'身高'
,
`sex`
smallint
(6)
null
default
null
comment
'性别'
,
primary
key
(`id`) using btree
) engine = innodb
character
set
= utf8
collate
= utf8_general_ci row_format =
dynamic
;
-- ----------------------------
-- records of user
-- ----------------------------
insert
into
`
user
`
values
(1,
'李子捌'
,
'汉族'
, 18, 180, 1);
insert
into
`
user
`
values
(2,
'张三'
,
'回族'
, 20, 175, 1);
insert
into
`
user
`
values
(3,
'李四'
,
'维吾尔族'
, 45, 168, 0);
insert
into
`
user
`
values
(4,
'王五'
,
'蒙古族'
, 18, 177, 1);
insert
into
`
user
`
values
(5,
'赵六'
,
'汉族'
, 16, 184, 0);
insert
into
`
user
`
values
(6,
'田七'
,
'维吾尔族'
, 27, 192, 1);
|
user表中数据如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
|
mysql>
select
*
from
user
;
+
----+--------+----------+------+--------+------+
| id |
name
| nation | age | height | sex |
+
----+--------+----------+------+--------+------+
| 1 | 李子捌 | 汉族 | 18 | 180 | 1 |
| 2 | 张三 | 回族 | 20 | 175 | 1 |
| 3 | 李四 | 维吾尔族 | 45 | 168 | 0 |
| 4 | 王五 | 蒙古族 | 18 | 177 | 1 |
| 5 | 赵六 | 汉族 | 16 | 184 | 0 |
| 6 | 田七 | 维吾尔族 | 27 | 192 | 1 |
+
----+--------+----------+------+--------+------+
6
rows
in
set
(0.00 sec)
|
使用group by之前需要先了解group by使用的相关规则 。
group by
子句置于where
之后,order by
子句之前having
子句置于group by 之后,order by子句之前group by
子句中的每个列都必须是select的检索列或者有效表达式,不能使用聚集函数select
中使用的表达式,在group by子句中必须出现,并且不能使用别名group by
分组的数据中包含null值,null值被分为一组group by
子句可以嵌套,嵌套的分组在最后分组上汇总
需求:
统计不同民族的用户数 。
语句:
1
2
3
4
5
6
7
8
9
10
|
mysql>
select
nation,
count
(*)
from
user
group
by
nation;
+
----------+----------+
| nation |
count
(*) |
+
----------+----------+
| 汉族 | 2 |
| 回族 | 1 |
| 维吾尔族 | 2 |
| 蒙古族 | 1 |
+
----------+----------+
4
rows
in
set
(0.00 sec)
|
group by可以结合where一起使用,不过where不能在group by之后进行过滤,使用where子句之后,分组的数据是where子句过滤后的数据集.
1
2
3
4
5
6
7
8
|
mysql>
select
nation,
count
(*)
as
nation_num
from
user
where
sex = 0
group
by
nation;
+
----------+------------+
| nation | nation_num |
+
----------+------------+
| 维吾尔族 | 1 |
| 汉族 | 1 |
+
----------+------------+
2
rows
in
set
(0.00 sec)
|
对group by分组后的数据还需要再次过滤,就必须使用having子句。group by子句后使用where子句mysql服务器会抛出异常 。
1
2
|
mysql>
select
nation,
count
(*)
as
nation_num
from
user
group
by
nation
where
nation =
'汉族'
;
error 1064 (42000): you have an error
in
your sql syntax;
check
the manual that corresponds
to
your mysql server version
for
the
right
syntax
to
use near
'where nation = '
汉族
''
at
line 1
|
此时只需要将上面where子句替换成having子句即可,having子句支持所有的where操作符,通俗的说where子句能用的地方只有替换成having就可以在group by子句后使用了 。
1
2
3
4
5
6
7
|
vmysql>
select
nation,
count
(*)
as
nation_num
from
user
group
by
nation
having
nation =
'汉族'
;
+
--------+------------+
| nation | nation_num |
+
--------+------------+
| 汉族 | 2 |
+
--------+------------+
1 row
in
set
(0.00 sec)
|
分组后的数据需要排序可以使用order by,order by子句需要更在having子句之后.
1
2
3
4
5
6
7
8
9
|
mysql>
select
nation,
count
(*)
as
nation_num
from
user
group
by
nation
having
nation !=
'汉族'
order
by
nation_num
desc
;
+
----------+------------+
| nation | nation_num |
+
----------+------------+
| 维吾尔族 | 2 |
| 回族 | 1 |
| 蒙古族 | 1 |
+
----------+------------+
3
rows
in
set
(0.00 sec)
|
对于输出的结果需要指定返回的行数,可以使用limit,limit子句在整个语句的最后.
1
2
3
4
5
6
7
8
|
mysql>
select
nation,
count
(*)
as
nation_num
from
user
group
by
nation
having
nation !=
'汉族'
order
by
nation_num
desc
limit 2;
+
----------+------------+
| nation | nation_num |
+
----------+------------+
| 维吾尔族 | 2 |
| 回族 | 1 |
+
----------+------------+
2
rows
in
set
(0.00 sec)
|
在group by子句中,with rollup 可以实现在分组统计数据基础上再进行相同的统计(sum,avg,count…) 。
比如max():
1
2
3
4
5
6
7
8
9
10
11
|
mysql>
select
nation,
max
(height)
as
nation_num
from
user
group
by
nation
with
rollup
;
+
----------+------------+
| nation | nation_num |
+
----------+------------+
| 回族 | 175 |
| 汉族 | 184 |
| 维吾尔族 | 192 |
| 蒙古族 | 177 |
|
null
| 192 |
+
----------+------------+
5
rows
in
set
(0.00 sec)
|
比如avg():
1
2
3
4
5
6
7
8
9
10
11
|
mysql>
select
nation,
avg
(height)
as
nation_num
from
user
group
by
nation
with
rollup
;
+
----------+--------------------+
| nation | nation_num |
+
----------+--------------------+
| 回族 | 175 |
| 汉族 | 182 |
| 维吾尔族 | 180 |
| 蒙古族 | 177 |
|
null
| 179.33333333333334 |
+
----------+--------------------+
5
rows
in
set
(0.00 sec)
|
比如count():
1
2
3
4
5
6
7
8
9
10
11
|
mysql>
select
nation,
count
(*)
as
nation_num
from
user
group
by
nation
with
rollup
;
+
----------+------------+
| nation | nation_num |
+
----------+------------+
| 回族 | 1 |
| 汉族 | 2 |
| 维吾尔族 | 2 |
| 蒙古族 | 1 |
|
null
| 6 |
+
----------+------------+
5
rows
in
set
(0.00 sec)
|
到此这篇关于浅谈mysql中的group by的文章就介绍到这了,更多相关mysql中的group by内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://juejin.cn/post/7032079581802201124 。
最后此篇关于浅谈MySQL中的group by的文章就讲到这里了,如果你想了解更多关于浅谈MySQL中的group by的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我想编写一个 linq 表达式,该表达式将返回不包含特定值的 ID。例如,我想返回所有不具有 Value = 30 的不同 ID。 ID, Value 1, 10 1, 20 1, 30 2,
我正在尝试使用 Regexp 匹配 Nmap 命令的输出。可以有两种不同的格式。 第一种格式(当 nmap 可以找到主机名时) Nmap scan report for 2u4n32t-n4 (192
我正在 Visual Studio 2012 上使用 C# 开发一个软件。我使用 MySQL Connector 6.9.1 进行 MySQL 连接。我的软件在我的操作系统(Win8 x64)上运行顺
在 Django 中(使用 django.contrib.auth 时)我可以添加一个 Group到另一个 Group ?即一个Group成为另一个成员(member) Group ? 如果是这样,我
我试图通过使用动态组参数对数据进行分组来循环。 我们可以在循环的 WHERE 条件上使用动态查询,但我不知道是否可以在组条件中使用动态字符串。 以下是用户决定按哪个字段分组,然后根据决定放置其他逻辑的
我有这样的字符串 s = 'MR1|L2-S1x' 模式总是相同的:一个或两个字符,在 [|.+:x-] 中可选地后跟一个数字和一个分隔符。此模式可以重复 6 次。 所以匹配模式很明确。 p = r'
我有一个带有时间戳字段“bar”的表“foo”。如何仅获取查询的最旧时间戳,例如: SELECT foo.bar from foo?我尝试执行以下操作: SELECT MIN(foo.bar) fro
在我的 Django 项目中,我有一个 user_manage 应用程序。 我在 user_manage 应用的 model.py 中创建了一个名为 UserManage 的模型: from djan
所以我有这样的输入: 还有一个模板指令,例如: 看来我只获得了 foo 和 bar 的组。 (为什么?我预计我可能会得到第三组 current-group-key() = '')。
我正在尝试扩展 django.contrib.auth 并遇到将用户添加到组中的情况,这可以通过两种方式完成。我只是想知道为什么会这样,以及其中一种相对于另一种的优势是什么。 最佳答案 他们做完全相同
我使用的是旧的 PHP 脚本,并且此查询有错误。由于我没有使用 mysql 的经验,因此无法修复它。 "SELECT COUNT(p.postid) AS pid, p.*, t.* FROM ".T
我有几行 Objective-C 代码,例如: ABAddressBookRef addressBook; CFErrorRef error = NULL; addressBook = ABAddre
我正在使用 MariaDB IMDB 电影数据集,我试图解决以下问题。电影表包含 id、名称、排名和年份列 A decade is a sequence of 10 consecutive years
让我从数据开始,以便更好地描述我的需求。我有一个名为 SUPERMARKET 的表,其中包含以下字段: Field 1: StoreID Field 2: ProductCategory Field
你好我有这个查询: SELECT DISTINCT a.id, a.runcd, (SELECT SUM(b.CALVAL) FROM GRS b WHERE b.PCode=11000 AND a.
我想在 xquery 中使用 Group By。有人可以告诉我如何在 Marklogic 中使用 Group By 吗? 最佳答案 或者,您可以使用 xdmp:xslt-invoke 调用 XSLT或
因此,当通过 from sequelize 请求组时,如下所示: return models.WorkingCalendar .findAll({
我希望我解释正确。 我有 2 个表,有 第一个表(table1) +------------+------+-------+-------+ | Date | Item | Block |
我的表 MYTABLE 有 2 列:A 和 B 我有以下代码片段: SELECT MYTABLE.A FROM MYTABLE HAVING SUM(MYTABLE.B) > 100
我有一个简单的行分组查询,需要 0.0045 秒。 300.000 行 从表 GROUP BY cid 中选择 cid 当我添加 MAX() 进行查询时,需要 0.65 秒才能返回。 从表 GROUP
我是一名优秀的程序员,十分优秀!