分组及其筛选
此处我直接在可视化工具下手动操作数据,直到显示如下效果
我们可以发现,表格中的(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;