按照成绩默认排序
默认情况下,按照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)
没有成绩同学,在统计成绩字段人数时,是无法被统计上的。
网友评论