表情况:学生表:student(SID学号,SNAME学生姓名,SAGE出生年月,SSEX性别) ; 成绩表:sc(SID学号,CID课程号,SCO成绩) 课程表:course(CID课程号,CNAME课程名称,TID教师号) 教师表:teacher(TID教师号,TNAME教师姓名)
本题涉及到学生表、成绩表,两个简单的限定条件可以用and进行限定。
SELECT A.SID,A.SNAME FROM STUDENT A,SC B WHERE A.SID=B.SID AND B.SID='01' AND B.SCORE>=80本题涉及到课程表中的课程名称,使用成绩表中的学生id进行计数,两个表用CID连接。最后的限定条件是在分组之后进行的,因此使用GROUP BY和Having
SELECT B.CNAME,COUNT(*) FROM SC A,COURSE B WHERE A.CID=B.CID GROUP BY A.CID HAVING COUNT(*)>5本题只需要用到成绩表,限定条件使用having完成。
SELECT SID FROM SC GROUP BY SID HAVING COUNT(CID)>=2难点在于如何获取全部课程数量,需要从第三张表额外获取。
SELECT A.* FROM STUDENT A,SC B WHERE A.SID=B.SID GROUP BY A.SID HAVING COUNT(CID)=(SELECT COUNT(*) FROM COURSE)值得一提的是,同一门课程不及格的学生可能不止一个,因此要进行去重操作。
SELECT DISTINCT COURSE.CNAME FROM SC,COURSE WHERE SC.CID=COURSE.CID AND SC.SCORE<60三张表的联结
SELECT A.SNAME,B.CNAME,C.SCO FROM STUDENT A,COURSE B,SC C WHERE A.SID=C.SID AND B.CID=C.CID AND C.SCO>70首先是三张表联结,但是因为存在有学生成绩、课程为空值,则需要以学生表为准使用左联结,使用sid字段联结到成绩表,在使用cid字段联结到课程表。
SELECT A.SNAME,B.CNAME,C.SCO FROM STUDENT A LEFT JOIN SC C ON A.SID=C.SID LEFT JOIN COURSE B ON B.CID=C.CID平均成绩是表内没有的列,使用avg之后用单引号使其在查询结果中有列名。
SELECT A.SID,A.SNAME,AVG(B.SCO)'平均成绩' FROM STUDENT A,SC B WHERE A.SID=B.SID GROUP BY A.SID HAVING AVG(B.SCO)>=85需要查询的字段都在成绩表中,先按照成绩降序,再按照课程号升序。
SELECT CID,AVG(SCO) FROM SC GROUP BY CID ORDER BY AVG(SCORE) DESC,CID ASC以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率 优秀率及格为>=60,中等为:60-80,优良为:80-90,优秀为:>=90 要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
及格率、中等率、优良率算出在各个分段的人数后除以总人数得到。使用case when函数进行计数。别忘了逗号
SELECT COURSE.CNAME,SC.CID,AVG(SC.SCORE),MAX(SC.SCORE),MIN(SC.SCORE),COUNT(SC.SID), SUM(CASE WHEN SCORE<60 THEN 1 ELSE 0 END)/COUNT(SC.CID)'及格率', SUM(CASE WHEN SCORE<80 AND SCORE>=60 THEN 1 ELSE 0 END)/COUNT(SC.CID)'中等率', SUM(CASE WHEN SCORE<90 AND SCORE>=80 THEN 1 ELSE 0 END)/COUNT(SC.CID)'优良率', SUM(CASE WHEN SCORE>=90 THEN 1 ELSE 0 END)/COUNT(SC.CID)'优秀率' FROM SC,COURSE WHERE SC.CID=COURSE.CID GROUP BY SC.CID ORDER BY COUNT(SC.CID) DESC,CID ASC拿到题目的第一反应是四表联结,但如果使用where teacher.tname !=张三的话,选了两门课(包含一门张三的课)的同学也会被查询到,因此用not in
SELECT STUDENT.SNAME FROM STUDENT WHERE STUDENT.SID NOT IN (SELECT SC.CID FROM TEACHER,COURSE,SC WHERE SC.CID=COURSE.CID AND TEACHER.TID=COURSE.TID AND TEACHER.TNAME='张三')只需要最高的学生成绩或者最高的几位学生成绩,就不需要用max,对查询结果限定出前几名就可以了。
SELECT A.*,B.SCO FROM STUDENT A,SC B,TEACHER C,COURSE D WHERE A.SID=B.SID AND B.CID=D.CID AND C.TID=D.TID AND C.TNAME='张三' ORDER BY B.SCORE DESC LIMIT 1找出最高的成绩,找出成绩等于这个成绩的学生即可
SELECT A.*,B.SCO, FROM STUDENT A,SC B,TEACHER C,COURSE D WHERE A.SID=B.SID AND B.CID=D.CID AND C.TID=D.TID AND C.TNAME='张三' AND B.SCO=(SELECT MAX(B.SCORE) FROM STUDENT A,SC B,TEACHER C,COURSE D WHERE A.SID=B.SID AND B.CID=D.CID AND C.TID=D.TID AND C.TNAME='张三'要查询不同课程成绩相同的学生,需要用到两次成绩表,因此使用自联结,相当于将一张表复制成两份,提取出需要的元素。
SELECT ANY_VALUE(A.CID),ANY_VALUE(A.SID),ANY_VALUE(A.SCO) FROM SC AS A INNER JOIN SC AS B ON A.SID=B.SID AND A.CID!=B.CID AND A.SCO=B.SCO GROUP BY A.CID,B.CID同样,也是需要同一个表内比较,使用自联结。
SELECT ANY_VALUE(A.SID),ANY_VALUE(A.CID),ANY_VALUE(A.SCORE) FROM SC AS A LEFT JOIN SC AS B ON A.CID=B.CID AND A.SCO<B.SCO GROUP BY A.CID,A.SID HAVING COUNT(B.SCO)<2 ORDER BY A.CID重名=有两个及以上相同的值
SELECT SNAME,COUNT(*) FROM STUDENT GROUP BY SNAME HAVING COUNT(*)>1需要用到日期函数YEAR
SELECT * FROM STUDENT WHERE YEAR(SAGE)=1990考察日期比较函数的使用,TIMESTAMPDIFF(时间单位,之前的时间,现在的时间);CURDATE()返回现在的时间
SELECT SID,SNAME,TIMESTAMPDIFF(YEAR,SAGE,CURDATE()) FROM STUDENT有的学生没有成绩、没有选课,因此要把学生表当成主表进行左连接。
SELECT A.SID,A.SNAME,COUNT(B.CID),COUNT(B.SCO) FROM STUDENT A LEFT JOIN SC B ON A.SID=B.SID GROUP BY A.SID与上一题的不同在于,01和02可以同时存在,其实只需要01就可以了
SELECT * FROM SC WHERE CID='01'保留名次空缺,因此选择rank
SELECT *,RANK() OVER(ORDER BY SCO DESC)AS RANK_NUM FROM SC还是没选课的同学的问题,需要左联结
SELECT A.* FROM STUDENT A LEFT JOIN SC B ON A.SID=B.SID GROUP BY A.SID HAVING COUNT(B.CID)<(SELECT COUNT(CID) FROM COURSE)首先找出01同学学的课程,再找出cid在01同学课程里的同学的sid就可以了。
SELECT A.* FROM STUDENT A,SC B WHERE A.SID=B.SID AND B.CID IN(SELECT CID FROM SC WHERE SID='01') GROUP BY A.SID完全相同,则学的课程没有01同学没有学的课程,并且学的课程的数量一致。
SELECT * FROM STUDENT WHERE SID IN (SELECT SID FROM SC WHERE SID NOT IN (SELECT SID FROM SC WHERE CID NOT IN (SELECT CID FROMSC WHERE SID='01')) GROUP BY SID HAVING COUNT(*)=(SELECT COUNT(CID) FROM SC WHERE SID='01')AND SID<>'01')