优化Mysh高级查询

/****** 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='微冷的雨')  
    
    /****** 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  


    
--检查“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  
 )  

 

 

 

 

 

 

--上机题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 

 

 
 
 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值