美文网首页
2018-11-25

2018-11-25

作者: 三斤耳朵 | 来源:发表于2018-11-26 22:48 被阅读105次

按照成绩默认排序

默认情况下,按照ASC方式进行排序

select name from student order by grade;

按照成绩升序排序

select name from student order by grade asc;

按照成绩降序排序

select name from student order by grade desc;

按照成绩依据多字段排序

在进行多字段排序的过程中,有排序的先后之分

例如id和name两个字段组合

先修改一下孙悟空的id

update student set id = 20 where id = 2;

再进行两个字段的升序排列id20的孙悟空在id4的叶良辰之后

再将孙悟空的id改回来

update student set id = 2 where id = 20;

再进行两个字段的升序排列id2的孙悟空在id4的叶良辰之前

select name from student order by grade , id;

但是如果修改了成绩就不涉及到id了

update student set grade = 99 where id = 2;

可见多字段进行排序时,先后顺序时有作用的。

GROUP BY

单独使用GROUP BY分组
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'cxc.student.name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
SELECT查询的第二列不在GROUP BY子句中,并且包含非聚合字段“cxc.student.name”,该字段在功能上不依赖于GROUP BY子句中的列;这与sql模式sql_mode=only_full_group_by不兼容

GROUP BY

单独使用GROUP BY 分组

select * from student group by grade
这句话表示我们最初想通过成绩对student表中的所有数据进行分组,但是,会出现问题,如下
这里指的是:
SELECT查询的第二列不在GROUP BY子句中,并且包含非聚合字段“cxc.student.name”,该字段在功能上不依赖于GROUP BY子句中的列;这与sql模式sql_mode=only_full_group_by不兼容
所以我们在最初使用的时候,查询的字段要和我们分组的字段一致
select grade from student group by grade;
这时候可以看到,原本的7个成绩被分组为六组,两个NULL成绩被分为一组。

GROUP BY 和聚合函数一起使用

GROUP BY 一般和聚合函数一起使用,如果查询字段出现在GROUP BY 后,却没有包含在聚合函数中,该字段显示的是分组后的第一条记录的值,这是这部分常常出现的问题。
select count(grade) from student group by grade;
这样我们就能够知道,各个成绩分别对应多少人

mysql> select grade ,count(grade) from student group by grade;
+-------+--------------+
| grade | count(grade) |
+-------+--------------+
|  NULL |            0 |
|    10 |            1 |
|    20 |            1 |
|    60 |            1 |
|    99 |            1 |
|   100 |            1 |
+-------+--------------+
6 rows in set (0.04 sec)

GROUP BY 和聚合函数和HAVING一起使用

这里HAVING表示类似于WHERE的条件子句
这里我们查询炸天帮中所有男性成员的总成绩
select sum(grade) from student group by gender having gender='M';

除此之外,我们还可以对分组条件进行适当的优化

select sum(grade) from student group by (name like "炸天帮%");

统计计数为空的问题
1、原有数据

mysql> select * from student;
+----+--------------+-------+--------+-----+
| id | name         | grade | gender | num |
+----+--------------+-------+--------+-----+
|  1 | 炸天帮徐缺   |    10 | M      |   1 |
|  2 | 炸天帮孙悟空 |    99 | M      |   2 |
|  3 | 炸天帮花无缺 |  NULL | 0      |   3 |
|  4 | 炸天帮叶良辰 |   100 | M      |   4 |
|  5 | 炸天帮二狗   |    20 | M      |   5 |
|  6 | 炸天帮段九德 |    99 | M      |   6 |
|  7 | 炸天帮薛之谦 |    60 | 0      |   7 |
+----+--------------+-------+--------+-----+
7 rows in set (0.03 sec)

2、查询出的两种不同情况

mysql> select grade , count(grade) from student group by grade ;
+-------+--------------+
| grade | count(grade) |
+-------+--------------+
|  NULL |            0 |
|    10 |            1 |
|    20 |            1 |
|    60 |            1 |
|    99 |            2 |
|   100 |            1 |
+-------+--------------+
6 rows in set (0.03 sec)

mysql> select grade , count(name) from student group by grade ;
+-------+-------------+
| grade | count(name) |
+-------+-------------+
|  NULL |           1 |
|    10 |           1 |
|    20 |           1 |
|    60 |           1 |
|    99 |           2 |
|   100 |           1 |
+-------+-------------+
6 rows in set (0.03 sec)

没有成绩同学,在统计成绩字段人数时,是无法被统计上的。

相关文章

网友评论

      本文标题:2018-11-25

      本文链接:https://www.haomeiwen.com/subject/wlomqqtx.html