1、学生表

Student(SID,Sname,Sage,Ssex)
–SID 学生编号,Sname 学生姓名,Sage 年龄,Ssex 学生性别

编号  姓名  年龄  性别
1    赵雷  20    男
2    钱电  20    男
3    孙风  21    男
4    吴兰  18    女
5    孙兰  17    女

2.课程表

Course(CID,Cname,TID)
–CID --课程编号,Cname 课程名称,TID 教师编号

课程号  课程名称  教师编号
1       语文     2
2       数学     1
3       英语     3

3.教师表

Teacher(TID,Tname)
–TID 教师编号,Tname 教师姓名

教师编号   教师名
1         张三
2         李四
3         王五

4.成绩表

SC(SID,CID,score)
–SID 学生编号,CID 课程编号,score 分数

学生编号   课程编号   分数
1         1         80
1         2         71
1         3         87
2         1         88
2         2         70
2         3         89
3         1         68
3         2         78
3         3         87
4         1         67
4         2         58
4         3         89
5         1         56
5         2         89
6         3         38

解析:

1.两个表有外键才可以直接关联。(即要有同一个属性)
2.课程表 或 成绩表 是重要的中介,比如:教师表和成绩表需要课程表来连接
3.模式:

Select  结果需要的属性
From 需要用到的表
Where   条件

1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数

分析:必须要用:学生信息(Student)和课程分数(SC)
可能要用: Course、SC

select s.*, s1.score 1score ,  s2.score 2score //需要学生信息和两科分数
from Student s, SC s1, SC s2 //一张表两个别名   在表的数据的所有组合里找满足条件的
where //条件的组合
      s.SID = s1.SID and //找同一个人
	  s.SID = s2.SID and 
      s1.CID ='01' and //比01课程比02高
      s2.CID = '02' and 
      s1.score > s2.score;//SC表确定了课程是01,所以那一列肯定01分数

2、查询 平均成绩大于等于60分的同学 的 学生编号和学生姓名和平均成绩

学生姓名(在Student表),平均成绩(在SC表找)
mysql函数:avg(变量):对变量求平均 count()组里的数据条数、max()、min()、sum()求和
分组:group by SID //根据学生的SID进行分组,保证每一组都是同一个学生
having avg(score) >= 60;//条件:对同一个同学的分数求平均;要大于60

select s.SID,s.sname,avg(c.score) avgscore 
from Student s,SC c 
where s.SID = c.SID //两个表建立连接的外键
group by c.SID
having avc(c.score) >= 60;

执行顺序:where>group>having(优先级)
父子查询:先子查询

3.查询在sc表中不存在成绩的 学生信息。

Student 和SC

select * 
from Student //在学生信息表里找SID不在SC表的
where SID not in
         ( select  distinct(SID)//子查询  在学生成绩表里查询所有不重复的id(即每个学生的id)并返回
           from sc) ;

4、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩

Student和SC
from SC group by SID;//相同ID在一组

select s.SID,s.sname,count(*),sum(c.score) //最后计算并返回信息
from Student s,SC c 
where s.SID = c.SID //先连接表
group by c.SID  //再分组

5、查询"李"姓老师的数量

Teacher 模糊查询:like ‘李%’

select conut(*)
from Teacher
 where tname like '李%';

6、查询学过"张三"老师授课的同学的信息

Student、Teacher,SC,Corese

select s.*
 from Student s,Teacher t,SC sc,Courese c
where s.SID = sc.SID and //连接
      sc.CID = c.CID and 
      c.TID = t.TID and
      t.tname = '张三';//筛选

7、查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息

Student,SC

select s.* 
from Student s,SC s1,SC s2 //一个表起俩名,就可以同时查两属性
where s.SID = s1.SID
      and s1.SID=s2.SID
      and s1.CID='01'
      and s2.CID ='02';

8、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

分析:
1.需要的表:Student、SC
2.先过滤在分组在统计判断:
from SC
where SC.score < 60 //将成绩小于60的人按SID分组,然后判断每个SID挂科数量
group by SC.SID
having count(*) > 1

方法1:是不及格的平均

    select s.SID,s.sname,avg(c.score) //同一个SID在一组,计算其平均成绩
from Student s,SC c 
where s.SID = c.SID and //需要同时满足的条件;按SID相等连接起来再筛选
      c.score < 60//检索到了所有不及格的人和不及格的分数值,下面再分组并筛选
group by c.SID
having count(*) > 1;

方法2:所有科目的平均

select s.SID,s.sname,avg(c.score)
 from Student s,SC c 
where s.SID = c.SID and
      s.SID in 
            (select SID //在成绩表里找 挂科数大于1的人的SID
             from SC 
             where SC.score < 60 
             group by SC.SID
             having count(*) > 1);
Logo

快速构建 Web 应用程序

更多推荐