MYSQL数据库-进阶

目录

排序

升序

降序

组合排序

聚合函数

 总数

 最大值

          最小值 

 求和

平均值 

分组

group by 

group by + group_concat()

group by + 集合函数

group by + having

group by + with rollup

分页

获取部分行

连接查询

内连接查询

右连接查询

左连接查询


排序

select * from 表名 order by 列1 asc|desc [,列2 asc|desc,...]

升序

将行数据按照列1进行排序,如果某些行列1的值相同时,则按照列2排序,以此类推

默认按照列值从小到大排列(asc)

asc:从小到大排列,即升序

/*查询未删除学生信息,按名称升序*/
select * from students where is_delete=0 order by name;
降序

desc: 从大到小排序,即降序

/*查询未删除男生信息,按学号降序*/
select * from students where gender=1 and is_delete=0 order by id desc;

组合排序

/*显示所有的学生信息,先按照年龄从大到小排序,当年龄相同时,按照身高从高到矮排序*/
select * from students  order by age desc,height desc;
聚合函数
总数

count(*) : 表示计算总行数,括号中写星与列名,结果是相同的

/*查询学生总数*/
select count(*) from students;
 最大值

 max(列) : 表示求此列的最大值

/*查询女生的编号最大值*/
select max(id) from students where gender=2;
最小值 

 min(列): 表示求此列的最小值

/*查询未删除的学生最小编号*/
select min(id) from students where is_delete=0;
 求和

 sum(列): 表示求此列的和

/*查询男生的总年龄*/
select sum(age) from students where gender=1;
平均值 

avg(列): 表示求此列的平均值  

/*查询未删除女生的编号平均值*/
select avg(id) from students where is_delete=0 and gender=2;

/*平均年龄*/
select sum(age)/count(*) from students where gender=1;

分组

group by 
  1. group by的含义:将查询结果按照1个或多个字段进行分组,字段值相同的为一组

  2. group by可用于单个字段分组,也可用于多个字段分组

/*通过学生性别分组*/
select gender from students group by gender;
+--------+
| gender |
+--------+
| 男     |
| 女     |
+--------+
group by + group_concat()
  1. group_concat(字段名)可以作为一个输出字段来使用,

  2. 表示分组之后,根据分组结果,使用group_concat()来放置每一组的某字段的值的集合

/*example1*/
select gender,group_concat(name) from students group by gender;
+--------+-----------------------------------------------------------+
| gender | group_concat(name)                                        |
+--------+-----------------------------------------------------------+
| 男     | 张三,李四,王五                                             |
| 女     | 小花,小丽,小雯                                             |
+--------+-----------------------------------------------------------+
/*example2*/
select gender,group_concat(id) from students group by gender;
+--------+------------------+
| gender | group_concat(id) |
+--------+------------------+
| 男     | 3,4,8,9,14       |
| 女     | 1,2,5,7,10,12,13 |
+--------+------------------+
group by + 集合函数

通过group_concat()的启发,我们既然可以统计出每个分组的某字段的值的集合,那么我们也可以通过集合函数来对这个值的集合做一些操作

select gender,group_concat(age) from students group by gender;

+--------+----------------------+
| gender | group_concat(age)    |
+--------+----------------------+
| 男     | 29,59,36,27,12       |
| 女     | 18,18,38,18,25,12,34 |
+--------+----------------------+

/*分别统计性别为男/女的人年龄平均值*/

select gender,avg(age) from students group by gender;
+--------+----------+
| gender | avg(age) |
+--------+----------+
| 男     |  32.6000 |
| 女     |  23.2857 |
+--------+----------+

/*分别统计性别为男/女的人的个数*/
select gender,count(*) from students group by gender;
+--------+----------+
| gender | count(*) |
+--------+----------+
| 男     |        5 |
| 女     |        7 |
+--------+----------+
group by + having
  1. having条件表达式:用来分组查询后指定一些条件来输出查询结果

  2. having作用和where一样,但having只能用于group by

select gender,count(*) from students group by gender having count(*)>2;
+--------+----------+
| gender | count(*) |
+--------+----------+
| 男     |        5 |
| 女     |        7 |
+--------+----------+
group by + with rollup

with rollup的作用是:在最后新增一行,来记录当前列里所有记录的总和

select gender,count(*) from students group by gender with rollup;
+--------+----------+
| gender | count(*) |
+--------+----------+
| 男     |        5 |
| 女     |        7 |
| NULL   |       12 |
+--------+----------+

select gender,group_concat(age) from students group by gender with rollup;
+--------+-------------------------------------------+
| gender | group_concat(age)                         |
+--------+-------------------------------------------+
| 男     | 29,59,36,27,12                            |
| 女     | 18,18,38,18,25,12,34                      |
| NULL   | 29,59,36,27,12,18,18,38,18,25,12,34       |
+--------+-------------------------------------------+

分页

获取部分行

当数据量过大时,采用limit

select * from 表名 limit start,count

start开始,获取count条数据

/*查询前3行男生信息*/
select * from students where gender=1 limit 0,3;

连接查询

内连接查询

查询的结果为两个表匹配到的数据

select * from 表1 inner或left或right join 表2 on 表1.列=表2.列
右连接查询

查询的结果为两个表匹配到的数据,右表特有的数据,对于左表中不存在的数据使用null填充。

select * from students as s left join classes as c on s.cls_id=c.id;
左连接查询

查询的结果为两个表匹配到的数据,左表特有的数据,对于右表中不存在的数据使用null填充

select s.name,c.name from students as s inner join classes as c on s.cls_id=c.id;
  • 22
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值