当前位置: 代码迷 >> SQL >> 学生表 课表 成绩表 教师表常用SQL语句
  详细解决方案

学生表 课表 成绩表 教师表常用SQL语句

热度:45   发布时间:2016-05-05 10:18:21.0
学生表 课程表 成绩表 教师表常用SQL语句

学生表 课程表 成绩表 教师表 50个常用sql语句

建表

Student(S#,Sname,Sage,Ssex) 学生表
Course(C#,Cname,T#) 课程表
SC(S#,C#,score) 成绩表
Teacher(T#,Tname) 教师表

---- If database exists the same name datatable deletes it.IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Student') DROP TABLE Student;---- Create TABLEcreate table Student(S# varchar(20),Sname varchar(10),Sage int,Ssex varchar(2))

关于表的50问

  1. 查询”001”课程比”002”课程成绩高的所有同学的学号:

    SELECT a.S#FROM (SELECT s#, scoreFROM SCWHERE C# = '001') a, (  SELECT s#, score  FROM SC  WHERE C# = '002'  ) bWHERE a.score > b.score AND a.s# = b.s#;
  2. 查询平均成绩大于60分的同学的学号和平均成绩:

    SELECT S#, avg(score)FROM scGROUP BY S#HAVING avg(score) > 60;

    通过GROUP BY子句,可以让SUM、COUNT、MAX、AVG等聚合函数对属于一组的是数据起作用.属于同一同学的成绩将只能返回一行值,其中除S#字段,其他字段通过聚合函数返回.

    HAVING子句可以让我们筛选成组后的各组数据,WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前.而 HAVING子句在聚合后对组记录进行筛选。

  3. 查询”李”姓老师的个数:

    SELECT count(DISTINCT (Tname))FROM TeacherWHERE Tname LIKE '李%';

    在表中可能包含重复值,关键字distinct用于返回唯一不同的值.distinct语句中select显示的字段只能是distinct指定的字段,其他字段是不可能出现的.
    select distinct name, id from A返回name+id不同的行

  4. 查询所有同学的学号、姓名、选课数、总成绩:

    SELECT stu.S#, stu.Sname, COUNT(scs.C#), SUM(scs.score)FROM Student stuLEFT JOIN SC scsON stu.S# = scs.S#GROUP BY stu.S#, stu.Sname
    • inner join,满足交换律,”A inner join B”和”B inner join A”是相等的
    • left outer join,产生左表(Student)的完全集,右表(SC)匹配的则有值,没有匹配的则NULL值
    • full outer join,产生左右表的全集,没有匹配的则NULL,满足交换律.
  5. 查询没选修”李明”老师课程的学生的学号与姓名:

    SELECT stu.S#, stu.SnameFROM Student stuWHERE stu.S# NOT IN (SELECT DISTINCT scs.S#FROM SC scs, Course crs, Teacher tchWHERE scr.C# = crs.C# AND tch.T# = crs.T# AND tch.Tname = '李明');
  6. 查询各科成绩最高分与最低分:课程ID,最高分,最低分

参考资料:

  • http://www.cnblogs.com/zengxiangzhan/archive/2009/09/23/1572276.html
  相关解决方案