目录
之后要涉及到多表了,所以又重新梳理出来三个表
学员信息表:person | ||
id | name | age |
1 | atom | 19 |
2 | atom2 | 19 |
3 | atom3 | 21 |
4 | atom4 | 21 |
5 | atom5 | 25 |
6 | atom6 | 25 |
班级列表:class | ||
id | name | class |
1 | atom | class1 |
2 | atom2 | class1 |
3 | atom3 | class2 |
4 | atom4 | class2 |
5 | atom5 | class3 |
6 | atom6 | class3 |
成绩列表:score | ||||
id | name | chinese | math | english |
1 | atom | 90 | 60 | 45 |
2 | atom2 | 60 | 60 | 60 |
3 | atom3 | 40 | 80 | 90 |
4 | atom4 | 70 | 70 | 70 |
5 | atom5 | 45 | 35 | 75 |
6 | atom6 | 100 | 40 | 85 |
1、子查询
如果我们想知道班级1的学生英语都考了多少分,应该怎么查询呢?
思考这个题目,我们可以分为两步去做
(1)、筛选出班级1都有哪些学生
(2)、根据筛选出来的学生,再去搜索英语成绩
怎么筛选班级1有哪些学生呢? 这个很简单,就是我们最开始学的sql
SELECT name from class where class = "class1" 搜索班级为class1的学生
得到结果为 atom和atom2
然后我们在根据得到的学员atom和atom2去class表查询对应学员的英语成绩
SELECT name,english FROM score where name in ("atom","atom2")
得到结果为 atom英语成绩为 45 atom2英语成绩为60
好,到此为止算是求出来,atom和atom2的英语成绩了,但是我想用一个sql语句怎么实现呢?
这时候就可以用到子查询了
SELECT name,english FROM score where name in (SELECT name from class where class = "class1")
这个语句就是先搜索括号内的结果得到班级为class1的学员,然后在去搜索学员的英语成绩
2、子查询带计算函数的写法
如果我们要查询班级A的语文(chinese)的平均成绩应该怎么办?
(1)、筛选出班级1都有哪些学生
(2)、根据筛选出来的学生,再去搜索平均的语文成绩
和上面一样
SELECT name from class where class = "class1" 搜索班级为class1的学生
得到结果为 atom和atom2
然后再根据结果求平均数,把atom和atom2带入到句子里
select avg(chinese) from score where name in (select name from class where class = "class1")