参考资料来源于Bilibili《一天学会MYSQL数据库》
- 分组查询
- 模糊查询
- 范围查询
1、分组计算
接着上述的学习笔记,score表的结构如下(三个字段分别为学号、课程号以及分数):
+-------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| s_no | varchar(10) | NO | PRI | NULL | |
| c_no | varchar(10) | NO | PRI | NULL | |
| grade | decimal(10,0) | YES | | NULL | |
+-------+---------------+------+-----+---------+-------+
若我们想知道每一门课程的平均成绩,则要用到avg()函数以及group by方法
select c_no,avg(grade) from score group by c_no;
--result
+-------+------------+
| c_no | avg(grade) |
+-------+------------+
| 3-105 | 85.3333 |
| 3-245 | 76.3333 |
| 6-166 | 81.6667 |
+-------+------------+
即先通过group by对score表按c_no分组,再计算组内平均值
2、分组条件和模糊查询
计算选修人数不小于2人且以3开头的课程的平均分数。
平均:avg()
选修人数不少于2:count
以3开头:like 模糊查询(类似于正则表达)
首先对课程进行分组,再筛选组内记录数大于2的课程,再使用模糊查询进行匹配
select c_no, avg(grade),count(*) from score where c_no like '3%'
group by c_no having count(*)>=2;
-- result
+-------+------------+----------+
| c_no | avg(grade) | count(*) |
+-------+------------+----------+
| 3-105 | 85.3333 | 3 |
| 3-245 | 76.3333 | 3 |
+-------+------------+----------+
其中having表示分组后的筛选方法。在sql中,执行顺序为where > group by > having(原因见SQL中where与having的区别)
like表示模糊查询,对字符串进行匹配,%表示匹配任意字符串
3、范围查询的两种方式
查询score表中分数在70到90的数据。
- where between and
- where > and <
select * from score where grade >70 and grade <90;
--result
+------+-------+-------+
| s_no | c_no | grade |
+------+-------+-------+
| 103 | 3-245 | 86 |
| 103 | 6-166 | 85 |
| 105 | 3-105 | 88 |
| 105 | 3-245 | 75 |
| 105 | 6-166 | 79 |
| 109 | 3-105 | 76 |
| 109 | 6-166 | 81 |
+------+-------+-------+
--第二种方式
select * from score where grade between 70 and 90;
--结果同上
+------+-------+-------+
| s_no | c_no | grade |
+------+-------+-------+
| 103 | 3-245 | 86 |
| 103 | 6-166 | 85 |
| 105 | 3-105 | 88 |
| 105 | 3-245 | 75 |
| 105 | 6-166 | 79 |
| 109 | 3-105 | 76 |
| 109 | 6-166 | 81 |
+------+-------+-------+