数据库多表查询

多表查询练习:  

Student 学生信息表(Student(SID,Sname,Sage,Ssex)     -SID 学生编号,Sname 学生姓名,Sage 年龄,Ssex 学生性别)

SC学生课程成绩表( SC(SID,CID,score)     --SID 学生编号,CID 课程编号,score 分数

course课程信息表(Course(CID,Cname,TID)  --CID --课程编号,Cname 课程名称,TID 教师编号)  

teacher表(Teacher(TID,Tname)   --TID 教师编号,Tname 教师姓名)

查询语句练习:

1.查询"01"课程比"02"课程成绩高的学生的信息及课程分数
 select a.*, b.score as ‘01课程分数’,  c.score as ‘02课程分数’       //as取别名
 from student a,SC b,SC c
 where a.SID = b.SID and a.SID = c.SID and b.CID = 1 and c.CID = 2 and b.score > c.score;

 取别名和as关键字:

2、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩
select a.SID , a.Sname ,avg(b.score) avg_score
from Student a,SC b
where a.SID = b.SID group by a.SID  having avg(b.score) >= 60;   //因为要根据每一个的成绩作平均值再排序,所以用到group by

group by和having的用法

 3、查询在sc表中不存在成绩的学生信息。
select * from Student where SID not in (select distinct SID from SC);

distinct关键字:

 4、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩
select a.SID, a.Sname,count(b.CID) as count, sum(b.score) as sum_score
from Student a, SC b
where a.SID = b.SID group by a.SID;

 5.查找有成绩但不是学生的学生学号、课程号、成绩

select *from SC where SID not in(select distinct SID from student) 

 6.查询李姓老师的数量

select count(TID) from Teacher where Tname like '李%';

like关键字:

 mysql入门很简单中对count和sum的描述(疑惑点?): count()记录条数;sum对某个字段进行求和

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

select * from student

where SID in(select distinct SID from SC  where CID in(select distinct CID from Course where TID in(select TID from Teacher  where Tname like 'zhang')));

//通过Tname在teacher表里查老师的TID,通过TID在SC表里查SID,通过SID在student表里查Sname.

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

select Student.*
from Student , SC
where Student.SID = SC.SID and SC.CID = '02' and exists (Select 1 from SC  SC_2  where SC_2.SID = SC.SID  and SC_2.CID = '01') order by Student.SID

 

 exists关键字的用法:

 

order by对查询结果进行排序的关键字:

9、查询两门及其以上课程大于70分的同学的学号,姓名及其平均成绩

select s.SID , s.sname , avg(score) as  avg_score

 from student s , sc
where s.SID = SC.SID and s.SID in (select SID from SC where score>70 group by SID having count(1) >= 2) group by s.SID , s.sname

//学号在选课表SC里面,以学号为组的成绩大于70并且数量大于两门的学生学号;再以学号和学生姓名为一组,找出学生姓名和学号

查找课程号为2的低于平均分的同学的课程分和学学号及姓名(下面的查询语句对,上面的错误太多,分析了一下错因)(子连接)

 

 含有in的子连接:

 10.查找w同学的选课课程名称以及对应的成绩(隐式内连接)

-- 查找w同学的课程名以及对应的成绩
SELECT student.Sname, course.`Cname`,sc.`score`FROM sc,student,course WHERE sc.`CID`=course.`CID` AND student.`Sname`="w" AND student.`Sid`=sc.`SID`;

 11.显示内连接  (inner)  join on +条件

原文地址:https://www.cnblogs.com/laurarararararara/p/11940993.html