首先区分一下这两个函数使用方法:
count():主要用来统计表的行数。
sum():用来求表中某一个字段数据的和,用大白话说就是求某一列的和。
直接上表:
student:
+------+--------+------+------+
| sno | sname | sage | ssex |
+------+--------+------+------+
| s001 | 张三 | 23 | 男 |
| s002 | 李四 | 23 | 男 |
| s003 | 吴鹏 | 25 | 男 |
| s004 | 琴沁 | 20 | 女 |
| s005 | 王丽 | 20 | 女 |
| s006 | 李波 | 21 | 男 |
| s007 | 刘玉 | 21 | 男 |
| s008 | 萧蓉 | 21 | 女 |
| s009 | 陈萧晓 | 23 | 女 |
| s010 | 陈美 | 22 | 女 |
+------+--------+------+------+
sc(学号、课程号、分数):
+------+------+-------+
| sno | cno | score |
+------+------+-------+
| s001 | c001 | 78.9 |
| s001 | c002 | 82.9 |
| s001 | c003 | 59 |
| s002 | c001 | 80.9 |
| s002 | c002 | 72.9 |
| s003 | c001 | 81.9 |
| s003 | c002 | 81.9 |
| s004 | c001 | 60.9 |
+------+------+-------+
需求:查询所有同学的学号、姓名、选课数、总成绩;
错误sql:
select a.sno,a.sname,count(b.cno),sum(b.score) from student a,sc b where a.sno=b.sno;
这是非常大意的写法,没有经过仔细分析,选课数、总成绩应该是成绩表sc来提供,正确写法:
select a.sno,a.sname,b.cnos,b.core from student a,(select sno,count(cno) cnos,sum(score) core from sc group by sno) b where a.sno=b.sno;