1. 程式人生 > >SQL高階 第四章 高階查詢

SQL高階 第四章 高階查詢

作業:
------------------------------------------------------------------------
--關鍵字 " in "  返回多條記錄

select StudentName from student where LoginPwd in
(select LoginPwd from student  where LoginPwd='111111')

--關鍵字 " = "  返回單條記錄
select StudentName from student where LoginPwd =
(select LoginPwd from student  where LoginPwd='123456')


-----------------------------------------------------------------------------

--查詢  最近一次 參加‘opp’ 考試的   最高分 and  最低分

select max([StudentResult])as 最高分,min([StudentResult]) AS 最低分
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 studentName ,studentNo 
  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”課程最近一次考試。--如果有分以上的成績,則每人提分;
	--否則,每人提分。最終的成績不得大於95分
	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
	   --有,每人提分 99
	   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
	   --沒有,整體+5
	   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

---------------------------------------------------------------------------------------------

---分頁:雙Top 雙Order by  每頁顯示3條記錄,我想要第二頁資料 4-6條
select top 3 * from Student
where StudentNo not in
(
   select top 0 StudentNo from Student
)


----------------------------------------------------------------------------------------------
          上機練習:
--------------------------------------
上機練習一:

--查詢  最近一次 參加‘opp’ 考試的   最高分 and  最低分

select max([StudentResult])as 最高分,min([StudentResult]) AS 最低分
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')

-------------------------------------------------------------------------
上機練習二:

--使用 in  關鍵字  查詢S1 學期開設的課程

select SubjectName   from  subject 
where gradeid in
(
  select gradeid from grade 
  where Gradeid='1'
)

--------------------------------------------------------------------------
上機練習三:

--查詢某課程  最近一次考試 缺考的 學生名單

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'
	)
  )
) 

---------------------------------------------------------------------------
上機練習四:

--如果有 S1 的學生 就將 年級更新為 S2 

if exists (
select * from  student
where gradeid in
     (
         select gradeid from student 
		 where gradeid='1'
     )	
 )
 begin 
   update student set Gradeid='2'
   where Gradeid in
   (
      select gradeid from student 
		 where gradeid='1'
   )
 end 
 Go

-----------------------------------------------------------------------------
DECLARE @subjectName varchar(50)
DECLARE @date datetime  --最近考試時間
DECLARE @subjectNo int  --科目編號
SET  @subjectName='java logic'
SELECT  @date=max(ExamDate) FROM Result INNER JOIN  Subject
ON Result.SubjectNo=Subject.SubjectNo
WHERE SubjectName= @subjectName
SELECT @subjectNo=subjectNo 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 
[email protected]
AND [email protected] ), 缺考人數=( SELECT COUNT(*) FROM Student INNER JOIN Subject ON Subject.GradeId=Student.GradeId WHERE SubjectName= @subjectName ) - ( SELECT COUNT(*) FROM Result WHERE
[email protected]
AND [email protected] ) /*---------統計考試通過情況,並將統計結果存放在新表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 [email protected] AND [email protected] ) 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 IF (@avg<60) --判斷平均分是否低於60分。如果低於60分,設定平均分為60分 SET @avg=60 WHILE (1=1) --迴圈加分,最高分不能超過97分 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--檢視更新IsPass列後的成績和通過情況,可用於除錯 /*--------------顯示考試最終通過情況--------------*/ 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
----------------------------------------------------------------------------------------
--關鍵字 " in "  返回多條記錄

select StudentName from student where LoginPwd in
(select LoginPwd from student  where LoginPwd='111111')

--關鍵字 " = "  返回單條記錄
select StudentName from student where LoginPwd =
(select LoginPwd from student  where LoginPwd='123456')


-----------------------------------------------------------------------------

--查詢  最近一次 參加‘opp’ 考試的   最高分 and  最低分

select max([StudentResult])as 最高分,min([StudentResult]) AS 最低分
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 studentName ,studentNo 
  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
	   --有,每人提分 99
	   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
	   --沒有,整體+5
	   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

---------------------------------------------------------------------------------------------

---分頁:雙Top 雙Order by  每頁顯示3條記錄,我想要第二頁資料 4-6條
select top 3 * from Student
   where StudentNo not in
(
   select top 3 StudentNo from Student
)

--01.分頁的第二種方式:  row_number() over(order by xxx) 分頁

select * from 
(
 select *,row_number() over(order by studentno) as myid
 from Student
)as temp
where myid between 4 and 6

--------------------------------------------------------------------------------------------- 

--02.go關鍵字2
select * from student
 go

create table s2226goodperson
(
  sid int identity(1,1) primary key not null,
  sname nvarchar(32)
)
go

--DDL(Data Definition Language) 資料定義語言    建庫 ,建表,建約束  go必須另起一行
--DML(Data Manipulation Language) 資料操作語言   Update,insert 。delete
--DQL(Data query language)資料查詢語言       select 

---------------------------------------------------------------------------------------------

--03.第三正規化
--如果一個關係滿足2NF,並且除了主鍵以外的其他列都不傳遞依賴於主鍵列,則滿足第三正規化(3NF) 

---------------------------------------------------------------------------------------------

--04.convert(引數1,引數2,引數3) 針對日期型別設定格式
--SQL 獲取系統時間
select GETDATE()
select CONVERT(nvarchar(32),GETDATE(),21)



相關推薦

SQL高階 高階查詢

作業:------------------------------------------------------------------------ --關鍵字 " in " 返回多條記錄 select StudentName from student where L

高階查詢--上機題和經典案例

--上機題1 --參加oop最近一次考試時間的最高分數和最低分數 select MAX(studentresult), MIN(studentresult) from Result where ExamDate= ( select MAX(ExamDate) from Re

——資料查詢基礎

第九章——資料查詢基礎 ********查詢******** select 列名1,列名2....from 表名 where 條件   ********別名******** 1)別名 = 列名 2)列名 as 別名 3)列名 別名 ******

SQL Server.

/*----------------------------------------索  引-----------------------------------------------------*/     /*--聚集索引--*/         --主鍵會自動生成同名

javascript高階程式設計學習筆記(

-基本型別和引用型別的值 ECMAScript變數可能包含兩種資料型別的值:基本型別值指簡單的資料段,引用型別值指可能由多個值構成的物件。對於5種基本型別值,可以直接操作儲存在變數中的值;而javascript不允許直接訪問物件的記憶體空間,只能通過操作物件的

Nginx伺服器的高階配置

概述:工作過程關鍵引數配置來提供Nginx伺服器效能 本章涉及內容: 針對IPv4的核心引數優化針對處理器的指令配置針對網路連線的指令配置與事件驅動相關的指令配置 4.1、針對Ipv4的核心7個引數的配置優化 將涉及Ipv4引數追加到Linux系統的/etc/sysctl

UNIX環境高階程式設計——-檔案和目錄

4.2 函式stat、fstat、lstat 1、函式原型: #include <sys/stat.h> int stat(const char *restrict pathname, struct stat *restrict buf);

高階查詢

1,查詢沒有借閱資訊的讀者編號和讀者姓名 SELECT rid'讀者編號',rname'讀者姓名' FROM reader r WHERE NOT EXISTS(SELECT nif FROM borrow WHERE r.rid=borrow.rid); 2,查詢未還書

《JavaScript高階程式設計》學習筆記(2)—— 變數、作用域和記憶體問題

基本型別和引用型別的值基本型別值指的是簡單的資料段,而引用型別值指那些可能由多個值構成的物件。區域性物件會在函式執行完畢後立即被銷燬。 檢測型別:instanceof操作符result = variable instanceof constructor如果變數是給定引用型別(

PL/SQL塊 動態查詢語句和異常處理 練習題答案

動態執行SQL語句: 1、用PLSQL給emp新增dname列,然後更新這個列的資料; 異常和動態執行SQL部分: declare sql_stmt1 varchar2(200); –動態SQL語句 sql_stmt2 varchar2(200);

高階程式設計技術課後作業 練習

4-2 動物程式碼:animals = ['dog', 'cat', 'squirrel'] for animal in animals: print("A " + animal + " would make a great pet.") print("Any of

高階查詢

第九章 巢狀子查詢:可以理解為一個虛擬的表 在通常的子查詢中,子查詢是以巢狀的方式寫在      父查詢的WHERE、HAVING、FROM子句中,所以被      稱為巢狀子查詢。   • 巢狀子查詢的執行過程:        –1.子查詢首先執行一次;        –2.用來自子查詢的值確認或取消父查

C#高階程式設計學習筆記-繼承

1.實現繼承:表示一個型別派生於另一個基型別,他擁有基型別的所有成員變數和方法,因此在需要給現有的型別增肌新的功能後者寫一些共享性的程式碼時很有用。介面繼承:只繼承了函式的簽名沒有整合其他的方法的實現2.C#不支援多重繼承,但是允許派生自多個介面3,把一個基類函式宣告為vir

Java高階技術——Java容器類Queue之體驗雙端佇列ArrayQueue設計之妙

前言 ArrayDeque ArrayDeque的資料結構要比PriorityQueue要簡單得多,是通過陣列來實現的。但是,ArrayDeque的特點是一個雙端佇列,既可以實現FIFO的Queue,也可以實現LIFO的Stack. ArrayDequ

高級查詢

子句 temp 進行 註意 select emp ble sele 指定表 EXLSTS 子查詢 OROP TABLE IF EXISTS temp; 註意 【必須指定表名。一般返回多行多列數據記錄, 可以當做一張零時表】 多層嵌套子查詢的最終數據集只包含父查詢【即最外

SQL入門經典》筆記(:建立資料庫之去規格化資料庫)

1. 什麼是去規格化? 去規格化是通過修改規格化資料庫的表的構成,在允許一定程度的資料冗餘的情況下,提高資料庫庫效能。   2. 為什麼要去規格化? 嘗試提高效能是進行去規格化資料庫的唯一原因(規格化的資料庫需要頻繁地進行表的結合,效能會降低)。   3.

SQL入門經典》筆記(:建立資料庫之規格化資料庫)

1. 原始資料庫: 在未規格化之前,一些資料可能會在多個表中出現,這被稱作資料冗餘。資料冗餘對安全、磁碟利用、查詢速度和資料庫更新都有壞處。尤其是資料完整性會受到影響。   2. 什麼是規格化? 規格化是把原始資料庫分解為表,去除資料庫裡冗餘資料的過程。資料庫開發人員利用規

《UML面向物件建模與設計》 6——高階狀態建模

雖然寫這個部落格主要目的是為了給我自己做一個思路記憶錄,但是如果你恰好點了進來,那麼先對你說一聲歡迎。我並不是什麼大觸,只是一個菜菜的學生,如果您發現了什麼錯誤或者您對於某些地方有更好的意見,非常歡迎您的斧正! 目錄 6.1巢狀狀態圖 6.1.1平面狀態圖的問題:包含大量的冗餘 6.

高階裝配

在3.1版本中,Spring引入了bean profile功能。要使用profile,首先要將所有的bean定義整理到一個或多個profile中,在應用部署到每個環境時,要確保對應的profile處於啟用狀態。 但@Profile("dev")註解用在類上時,該類中的bean只有在dev環境中才會建立。

[Ext JS 6 By Example 翻譯] 6 - 高階元件

轉載自:http://www.jeeboot.com/archives/1227.html   本章涵蓋了高階元件,比如 tree 和 data view。它將為讀者呈現一個示例專案為 圖片瀏覽器,它使用 tree 和 data view 元件。以下是本章將要討論的主題: