zoukankan      html  css  js  c++  java
  • 学生表/教师表/课程表/成绩表常见SQL查询

    学生表/教师表/课程表/成绩表常见SQL查询
     
     
    1. 在表中插入符合主键
    [sql] 
    /*成绩表*/  
    CREATE TABLE SC  
    (  
    Sid INT REFERENCES Student(Sid), /*学生学号*/  
    Cid INT REFERENCES Course(Cid), /*课程编号*/  
    Score INT NOT NULL, /*课程分数*/  
    PRIMARY KEY(Sid,Cid) /*将学生学号和课程编号设为复合主键*/  
    )  
    
    2. 查询各科成绩最高分,最低分以及平均分
    [sql] 
    SELECT c.Cname, MAX(s.Score) AS Max, MIN(s.Score) AS Min, AVG(s.Score) AS Average   
    FROM Course c JOIN SC s ON c.Cid = s.Cid   
    GROUP BY c.Cname   
    /*此处应注意,若不按照c.Cname进行分组,SQL语句会报错,c.Cname在SELECT语句中不合法,因为它  
    并未出现在聚合函数中也没有出现在GROUP BY语句中*/  
    
    
    3. 查询平均成绩大于80分的学生姓名以及平均成绩
    [sql] 
    SELECT Sname, AVG(Score) AS Average FROM Student JOIN SC   
    ON Student.Sid=SC.Sid   
    GROUP BY Sname  
    HAVING AVG(Score)>80   
    /*以聚合函数为条件进行删选只能在HAVING语句中进行,WHERE语句不支持聚合函数*/  
    
    
    4. 查询各学生都选了多少门课
    [sql] 
    SELECT Sname, COUNT(Cid) AS TOTAL_COURSE FROM Student   
    LEFT JOIN SC ON Student.Sid=SC.Sid  
    GROUP BY Sname  
    /*使用LEFT JOIN可以将一门课也没有选的学生也查询出来,  
    若不加LEFT查不出DAISY和SHERRY*/  
    
    
    5. 查询没有选JANE老师课的学生信息
    [sql] 
    SELECT s.Sid,s.Sname,s.Sage,s.Sage FROM Student s   
    WHERE s.Sid NOT IN   
    (SELECT s.Sid FROM SC s JOIN Course c ON s.Cid=c.Cid   
    JOIN Teacher t ON c.Tid=t.Tid   
    WHERE t.Tname='JANE')  
    /*子查询中查询出所有选择JANE老师课的学生学号,  
    主查询去查询在学生表中但不在子查询结果集中的学生信息*/  
    
    
    6. 查询既选择了COMPUTER课程,又选择了MATH课程的学生信息
    [sql] 
    SELECT s.Sid,s.Sname,s.Sage,s.Ssex FROM STUDENT s   
    JOIN SC ss ON s.Sid=ss.Sid  
    JOIN Course c ON ss.Cid=c.Cid WHERE c.Cname='COMPUTER'  
    INTERSECT  
    SELECT s.Sid,s.Sname,s.Sage,s.Ssex FROM STUDENT s   
    JOIN SC ss ON s.Sid=ss.Sid  
    JOIN Course c ON ss.Cid=c.Cid WHERE c.Cname='MATH'  
    /*第一个查询查询出选择COMPUTER课程的学生信息,  
    第二个查询查询出选择MATH课程的学生信息,  
    用INTERSECT关键字取交集*/  
    
    
    7. 查询COMPUTER课程比MATH课程分数高的学生学号
    [sql] 
    SELECT a.Sid FROM   
    (SELECT s.Sid,s.Score FROM SC s JOIN Course c ON s.Cid=c.Cid WHERE c.Cname='COMPUTER') a  
    JOIN  
    (SELECT s.Sid,s.Score FROM SC s JOIN Course c ON s.Cid=c.Cid WHERE c.Cname='MATH') b  
    ON a.Sid=b.Sid  
    WHERE a.Score>b.Score  
    /*将选了COMPUTER课的学生学号和成绩和选了MATH课的学生学号和成绩连接  
    WHERE语句限制COMPUTER课的成绩高于MATH课*/  
    
    
    8. 查询和JOHN选的课相同的学生信息
    [sql] 
    SELECT Student.Sname FROM Student JOIN SC ON Student.Sid=SC.Sid  
    WHERE SC.Cid IN  
    (SELECT SC.Cid FROM SC JOIN Student ON SC.Sid=Student.Sid WHERE Student.Sname='JOHN') /*查询选了的课JOHN也都选了的学生的姓名*/  
    AND Student.Sname<>'JOHN' /*限制该学生不能是JOHN本人*/  
    GROUP BY Student.Sname   
    HAVING COUNT(SC.Cid)=  
    (SELECT COUNT(*) FROM SC JOIN Student ON SC.Sid=Student.Sid WHERE Student.Sname='JOHN') /*该学生选的课程总数与JOHN选的课程总数相同*/  
    
    
    9. 按总分为学生排名,总分相同名次相同
    [sql] 
    SELECT RANK() OVER (ORDER BY SUM(ss.Score) DESC) AS Rank, s.Sname, ISNULL(SUM(ss.Score),0)   
    FROM Student s LEFT JOIN SC ss   
    ON s.Sid = ss.Sid   
    GROUP BY s.Sname   
    ORDER BY SUM(ss.Score) DESC  
    /*RANK()是SQL Server的一个built-in函数,语法为  
    RANK() OVER ( [ partition_by_clause ] order_by_clause ).*/  
    
    
    10. 查询总分在100至200之间的学生姓名及总分
    [sql] 
    SELECT s.Sname,SUM(ss.Score) FROM Student s JOIN SC ss ON s.Sid=ss.Sid  
    GROUP BY s.Sname HAVING SUM(ss.Score) BETWEEN 100 AND 200  
    
    
    11. 查询总分第六到十名的学生姓名以及总分
    [sql] 
    SELECT * FROM  
    (SELECT TOP(5) * FROM  
    (SELECT TOP(10) SC.Sid,SUM(SC.Score) AS SUM FROM SC GROUP BY SC.Sid ORDER BY SUM(SC.Score)) a  
    ORDER BY a.SUM) b  
    ORDER BY b.SUM DESC  
    /*SELECT TOP(10) SC.Sid,SUM(SC.Score) AS SUM FROM SC GROUP BY SC.Sid ORDER BY SUM(SC.Score)查询出总分前十名  
    SELECT TOP(5) FROM (...) a ORDER BY a.SUM查询出成绩六到十名  
    SELECT * FROM (...) b ORDER BY b.SUM DESC将结果倒序按照从高分到低分排列*/  
    
    
    12. 查询各科成绩的前三名以及分数
    [sql] 
    SELECT s.Sid,s.Cid,s.Score FROM SC s   
    WHERE s.Score IN   
    (SELECT TOP(3) Score FROM SC WHERE s.Cid= Cid ORDER BY score DESC)   
    ORDER BY s.Cid;  
    /*从SC表中查询出学生学号,课程编号以及成绩,WHERE子句限制了查询出的记录成绩必须在子查询集合内  
    子查询查询出了各科成绩的前三名并通过课程编号和主查询关联*/   
    
    
    13. 查询有不及格科目的学生的姓名,不及格科目以及不及格科目成绩
    [sql] 
    SELECT s.Sname,c.Cname,ss.Score FROM Student s JOIN SC ss ON s.Sid=ss.Sid JOIN Course c ON ss.Cid=c.Cid  
    WHERE ss.Score<60  
    
    
    14. 查询所有学生都选修的课程
    [sql] 
    SELECT c.Cname FROM SC s JOIN Course c ON s.Cid=c.Cid   
    GROUP BY c.Cname HAVING COUNT(s.Sid)=(SELECT COUNT(*) FROM Student)  
    
    15. 查询选修了两门或以上的学生姓名及选修总科目
    [sql] 
    SELECT s.Sname,COUNT(ss.Cid) AS TOTAL FROM Student s JOIN SC ss ON s.Sid=ss.Sid   
    GROUP BY s.Sname HAVING COUNT(ss.Cid)>1  
  • 相关阅读:
    20160729noip模拟赛zld
    20160728noip模拟赛zld
    20160727noip模拟赛zld
    20160725noip模拟赛“Paodekuai” alexandrali
    20160723数据结构节alexandrali
    20160722noip模拟赛alexandrali
    洛谷 [P2594] 染色游戏
    洛谷 [P3480] KAM-Pebbles
    UVA 1378 A Funny Stone Game
    SPOJ 4060 A game with probability
  • 原文地址:https://www.cnblogs.com/llkey/p/3595254.html
Copyright © 2011-2022 走看看