优化MySchool 第四章 高级查询

本文通过一系列SQL查询示例,展示了如何进行高级查询,包括子查询、内连接、最近考试的学生名单、成绩统计与优化等操作。涉及到的表包括Student、Result、Subject等,查询内容涵盖学生信息、考试成绩、科目最高最低分、缺考情况以及通过率的计算等。
摘要由CSDN通过智能技术生成
/****** Script for SelectTopNRows command from SSMS  ******/
SELECT TOP 1000 [StudentNo]
      ,[LoginPwd]
      ,[StudentName]
      ,[Gender]
      ,[GradeId]
      ,[Phone]
      ,[Address]
      ,[Birthday]
      ,[Email]
      ,[MyTT]
  FROM [MySchool].[dbo].[Student]
  
  
  --比较运算符后面的子查询只能返回单个数值
  
  --in子查询后面可跟随返回多条记录的子查询,用于检测某列的值是否存在于某个范围内
  
  
  
  declare @birthday datetime
  select @birthday=Birthday from Student where StudentName='微冷的雨'
  select * from Student where Birthday>@birthday
  
  
  
  --简单子查询
  select * from dbo.Student where Birthday>(select Birthday from Student  where  StudentName='微冷的雨')
  
  
  
  
  --内连接
  select StudentName from Student where StudentNo in
  (
  select StudentNo from Result R
  inner join Subject S on R.SubjectId=S.SubjectId
  where StudentResult>60 and SubjectName='oop'
  )
  
  select StudentName,StudentResult
  from dbo.Result R,dbo.Student S,dbo.Subject B
  where R.SubjectId=B.GradeId and S.StudentNo=R.StudentNo
  and StudentResult>60
  and SubjectName='oop'
 
 


--最近一次考试的学生名单(学生姓名,编号)考试科目为'oop'
      select StudentName,StudentNo from dbo.Student 
      where StudentNo in
      (
      select StudentNo from dbo.Result 
           where SubjectId=(
           select SubjectId from dbo.Subject 
           where SubjectName='oop'
                 )and ExamDate=(
           select MAX(ExamDate) from dbo.Result 
           where SubjectId=(
           select SubjectId from dbo.Subject
           where SubjectName='oop'
       )
     )
   )
   
   
   
   
--**********************************************************   
   
 --查询oop的最高和最低成绩
 --上机一
 select MAX(StudentResult),MIN(StudentResult) from dbo.Result 
  where ExamDate=( 
        select MAX(ExamDate) from dbo.Result 
        where SubjectId=(
         select SubjectId from dbo.Subject where SubjectName='oop'      
          )
      )
      
      
      
      
 --***************************************************
 --上机练习二
 --(1)查询年级为S1的课程编号
  select GradeId from dbo.Subject where GradeId in
  (
  select GradeId from dbo.Grade where GradeName='S1'
  )
 --(2)根据课课程编号查询课程表的课程名称
  select SubjectName  from dbo.Subject S , dbo.Grade  G where S.GradeId=G.GradeId 
  and  G.GradeId in(
  select GradeId from dbo.Grade where GradeName='S1'
  )
  



 --****************************************************************$$$
 --上机练习三
 
  select StudentName from Student
  where Studentno not in(
  select Studentno from result where examdate=(
  select max(ExamDate)
  from result 
  where SubjectId=(
  select SubjectId from Subject where Subjectname='java' 
  )
  )
  )and Gradeid=1

 
 
 
 
 --**************************************************************
 --上机练习四
if exists(
 select Gradeid from Grade 
 where Gradeid in (Select Gradeid from Grade where Gradename='S1' or Gradename='S2')
 )
 begin
 update Student 
 set Gradeid='2'
 where Gradeid='1'
 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  






--检查“oop”课程最近一次考试。--如果有分以上的成绩,则每人提分;
--否则,每人提分。最终的成绩不得大于分


   if exists( 
   select StudentResult from dbo.Result 
   where SubjectId=(
   select SubjectId from dbo.Subject  where SubjectName='oop'
   )and ExamDate=(
   select MAX(ExamDate) from dbo.Result 
   where SubjectId=(
   select SubjectId from dbo.Subject where SubjectName='oop'
   )
   )
and StudentResult>80
 )
 begin
 update dbo.Result set StudentResult=100
 where SubjectId=(
 select SubjectId from dbo.Subject where SubjectName='oop'
 )and ExamDate=(
   select MAX(ExamDate) from dbo.Result 
   where SubjectId=(
   select SubjectId from dbo.Subject where SubjectName='oop'
   )
   )
 and StudentResult>98
 update dbo.Result set StudentResult+=2 
 where SubjectId=(
 select SubjectId from dbo.Subject where SubjectName='oop'
 )and ExamDate=(
 select MAX(ExamDate) from dbo.Result where SubjectId=(
 select SubjectId from dbo.Subject where SubjectName='oop'
 )
 )
 and StudentResult<=98
 end 
 else
 begin
 update dbo.Result set StudentResult+=5
 where SubjectId=(
 select SubjectId from dbo.Subject where SubjectName='oop'
 ) and ExamDate=(
 select MAX(ExamDate) from dbo.Result where SubjectId=(
  select SubjectId from dbo.Subject where SubjectName='oop'
 )
 )
 end

 
 --分页查询 top  ,order by
 select top 2 * from dbo.Student
 where StudentNo not in(
 select top 3 StudentNo from dbo.Student
 )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值