MySQL 数据库(数据分组、排序以及表连接)

分组及其筛选

此处我直接在可视化工具下手动操作数据,直到显示如下效果

在这里插入图片描述

我们可以发现,表格中的(sex)字段,可以分为二类(二组),我们尝试一下将查询到的数据总数按照(sex)字段来分组

select count(*) from xiaoke group by sex;

在这里插入图片描述

我们可以粗略知道按照字段(sex)分类,可以得到总数为 3 和 4 的分组,但是具体来说并未归类,接下来我们将数据归类

select sex as "性别",count(*) from xiaoke group by sex;

在这里插入图片描述

如果我们想要知道每组的详细信息,那么我们用方法 group_concat(...)

select sex as "性别",count(*),group_concat(name) from xiaoke  group by sex;

在这里插入图片描述

如果分组之后还想查看总人数,那么使用方法 with rollup

select sex,count(*) from xiaoke group by sex with rollup;

在这里插入图片描述

如果我们想查询组内的多种数据,也是使用方法 group_concat(...),但是我们会发现查询到的多个字段是拼接到一起的,并不利于查看

select sex as "性别",count(*),group_concat(name,age) from xiaoke  group by sex;

在这里插入图片描述

我们将其视为字符串的拼接原则,我们重新修改代码

select sex as "性别",count(*),group_concat(name,":",age) from xiaoke  group by sex;

在这里插入图片描述

分组之后我们依然可以筛选,使用方法 having... ,例如如下代码是以字段(sex)分组,当分组的平均年龄(小于 20)的时候显示数据

select sex,avg(age),group_concat(name) from xiaoke group by sex having avg(age)<20;

在这里插入图片描述

排序

语法:order by 字段 desc/asc

查询表中年龄在 18 到 26 男生,并按照(age)的大小进行排序(升序),默认为升序

select * from xiaoke where (age between 18 and 26) and sex="man" order by age asc;

在这里插入图片描述
查询表中年龄在 18 到 26 男生,并按照(age)的大小进行排序(降序)

select * from xiaoke where (age between 18 and 26) and sex="man" order by age desc;

在这里插入图片描述
查询表中年龄在 18 到 20 女生,并按照(id)的大小进行排序(降序)

select * from xiaoke where (age between 18 and 20) and sex="woman" order by id desc;

在这里插入图片描述
增加表字段(height),使表格为如下所示

在这里插入图片描述

查询年龄在 18 - 25 之间的女性,年龄从高到低降序,当年龄相同时,按照身高从低到高升序

select sex,name,height,age from xiaoke where (age between 18 and 25) and sex="woman" order by age desc,height asc;

在这里插入图片描述

数据的限制

select * FROM xiaoke;
select * FROM xiaoke limit 2; -- 显示前 2 条数据
select * FROM xiaoke limit 5; -- 显示前 5 条数据
select * FROM xiaoke limit 2,3; -- 从索引项为 2 开始选 3 个数据

在这里插入图片描述

连接

xiaoke 表内容如下

在这里插入图片描述
xiaosu 表如下

在这里插入图片描述

直接内连接数据集

select * from xiaoke inner join xiaosu;

指定范围连接

当表(xiaoke)的(id)和表(xiaosu)的(iid)相等的时候,显示所有数据

select * from xiaoke as k inner join xiaosu as s on k.id=s.iid;

在这里插入图片描述

当表(xiaoke)的(id)和表(xiaosu)的(iid)相等的时候,显示对应数据

select k.name,s.iname from xiaoke as k inner join xiaosu as s on k.id=s.iid;

在这里插入图片描述

当表(xiaoke)的(id)和表(xiaosu)的(iid)相等的时候,显示表(xiaoke)的所有数据,表(xiaosu)的指定数据

select k.*,s.iname from xiaoke as k inner join xiaosu as s on k.id=s.iid;

在这里插入图片描述

当表(xiaoke)的(id)和表(xiaosu)的(iid)相等的时候,以(id)降序显示数据

select *  from xiaoke  as k inner join xiaosu as s on k.id=s.iid order by k.id desc;

在这里插入图片描述

左连接

以左表为主 右表填充 null,特别注意:on 是必须有的

select *  from xiaoke  k left join xiaosu s on k.id=s.iid; 

在这里插入图片描述

连接后筛选,当(iid)为(NULL),此处(having)改为(where)也是正确的

 select *  from xiaoke  k left join xiaosu s on k.id=s.iid having iid is NULL;

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是我来晚了!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值