04高级查询

来源:互联网 发布:虚拟专用网络 博客 编辑:程序博客网 时间:2024/06/05 02:00
-上机题1  --参加oop最近一次考试时间的最高分数和最低分数  select MAX(studentresult), MIN(studentresult) from Result  where ExamDate=  (  select MAX(ExamDate) from Result   where SubjectId=  (  select SubjectId from Subject where SubjectName='oop'  )  )  and SubjectId=  (  select SubjectId from Subject where SubjectName='oop'  )      --上机题2    --使用in关键字的子查询来查询S1学期开设的课程      select SubjectName from Subject  where GradeId in  (      select GradeId from Grade where GradeName='S1'  )      --上机题3    --查询某课程最近一次考试缺考的学生名单     select studentno, StudentName from Student   where StudentNo not in  (    select StudentNo from Result    where SubjectId=    (    select SubjectId from Subject where SubjectName='oop'    )    and ExamDate=  (  select MAX(ExamDate) from Result   where SubjectId=  (  select SubjectId from Subject where SubjectName='oop'  )  )     )   and GradeId=  (  select GradeId from Subject where SubjectName='oop'  )    --上机题4  --检查并更新S1的学生为S2      if exists(    select studentno,StudentName from Student   where StudentNo in  (    select StudentNo from Student where    GradeId=    (    sleelct GradeId from grade where GradeName='S1'    )  )  )  begin    update Student set GradeId=2  where GradeId in  (    select GradeId from Grade where GradeName='S1'   )  end      --上机题5      select studentname,(select GradeName from Grade)as Gradename,subjectname,examdate,studentresult from  Student,Subject,Result  where result.StudentNo in  (     select MAX(ExamDate) from Result     group by SubjectId  )      --上机题6  --SQL语句的综合运用    --赋值科目名称为oop  declare @subjectName varchar(50)  SET @subjectName='oop'  --科目为oop最近考试时间  declare @date datetime  select @date=MAX(examdate) from Result  inner join Subject on Result.SubjectId=Subject.SubjectId  where SubjectName=@subjectName  --课程oop的编号  declare @subjectNo int  select @subjectNo=SubjectId from Subject where SubjectName=@subjectName    --统计考试缺考情况    SELECT 应到人数=(                   SELECT COUNT(*)  FROM Student                    INNER JOIN Subject ON Subject.GradeId=Student.GradeId                    WHERE SubjectName= @subjectName                   ) ,             实到人数=(                   SELECT COUNT(*) FROM Result                   WHERE ExamDate=@date AND SubjectNo=@subjectNo                 ),        缺考人数=(                   SELECT COUNT(*)  FROM Student                    INNER JOIN Subject ON Subject.GradeId=Student.GradeId                    WHERE SubjectName= @subjectName                ) -                (                   SELECT COUNT(*) FROM Result                    WHERE ExamDate=@date AND SubjectNo=@subjectNo                )     --统计考试通过情况,并将统计结果存放在新表TempResult中--  IF EXISTS(SELECT * FROM sysobjects WHERE name='TempResult')    DROP TABLE TempResult    SELECT  Student.StudentName,Student.StudentNo,StudentResult,          IsPass=CASE                    WHEN StudentResult>=60  THEN 1                   ELSE 0                 END   INTO TempResult   FROM Student LEFT JOIN (                           SELECT * FROM Result  WHERE ExamDate=@date AND SubjectNo=@subjectNo                          ) R  ON Student.StudentNo=R.StudentNo  WHERE GradeId=(SELECT GradeId FROM Subject WHERE SubjectName= @subjectName)           SELECT * FROM TempResult       DECLARE @avg numeric(4,1)   SELECT @avg=AVG(StudentResult) FROM TempResult WHERE StudentResult IS NOT NULL    --判断平均分是否低于60分。如果低于60分,设置平均分为60分  IF (@avg<60)     SET @avg=60     --循环加分,最高分不能超过97分  WHILE (1=1)   BEGIN       IF(NOT Exists(SELECT * FROM TempResult WHERE StudentResult<@avg))        BREAK     ELSE       UPDATE TempResult SET StudentResult=StudentResult+1       WHERE StudentResult<@avg AND StudentResult<97  END       --因为提分,所以需要更新IsPass(是否通过)列的数据  UPDATE TempResult     SET IsPass=CASE                 WHEN StudentResult>=60  THEN 1                 ELSE  0              END    SELECT * FROM newTable    --显示考试最终通过情况  SELECT 姓名=StudentName,学号=StudentNo,          成绩=CASE                 WHEN StudentResult IS NULL THEN '缺考'                ELSE  CONVERT(varchar(5),StudentResult)              END,     是否通过=CASE                 WHEN isPass=1 THEN '是'                ELSE  '否'             END   FROM TempResult      --显示通过率及通过人数  SELECT 总人数=COUNT(*) ,通过人数=SUM(IsPass),         通过率=(CONVERT(varchar(5),AVG(IsPass*100))+'%')  FROM TempResult   GO  [sql] view plain copy 在CODE上查看代码片派生到我的代码片//经典案例      --参加oop最近一次考试时间的最高分数和最低分数  select MAX(studentresult), MIN(studentresult) from Result  where ExamDate=  (  select MAX(ExamDate) from Result   where SubjectId=  (  select SubjectId from Subject where SubjectName='oop'  )  )  and SubjectId=  (  select SubjectId from Subject where SubjectName='oop'  )    ----参加oop最近一次考试时间的学生姓名和学生编号    select studentno, studentname from Student  where StudentNo in  (    select StudentNo from result     where subjectid=    (     select subjectid from Subject where SubjectName='oop'         )    and ExamDate=    (    select MAX(ExamDate) from Result     where subjectid=    (     select subjectid from Subject where SubjectName='oop'         )    )  )        --案例:检查“oop”课程最近一次考试。--如果有分以上的成绩,则每人提分;      --否则,每人提分。最终的成绩不得大于分      if exists(   select studentresult from Result     where subjectid=    (     select subjectid from Subject where SubjectName='oop'         )    and ExamDate=    (    select MAX(ExamDate) from Result     where subjectid=    (     select subjectid from Subject where SubjectName='oop'         )    )   and StudentResult>80    )    begin  update Result set StudentResult=100    where subjectid=    (     select subjectid from Subject where SubjectName='oop'         )    and ExamDate=    (    select MAX(ExamDate) from Result     where subjectid=    (     select subjectid from Subject where SubjectName='oop'         )    )  and StudentResult>98    update Result set StudentResult+=2    where subjectid=    (     select subjectid from Subject where SubjectName='oop'         )    and ExamDate=    (    select MAX(ExamDate) from Result     where subjectid=    (     select subjectid from Subject where SubjectName='oop'         )    )  and StudentResult<=98  end    else    begin  update Result set StudentResult+=5    where subjectid=    (     select subjectid from Subject where SubjectName='oop'         )    and ExamDate=    (    select MAX(ExamDate) from Result     where subjectid=    (     select subjectid from Subject where SubjectName='oop'         )    )    end  

0 0