SqlServer中Exists的使用小結
1、簡介
- 不相關子查詢:子查詢的查詢條件不依賴于父查詢的稱為不相關子查詢
- 相關子查詢:子查詢的查詢條件依賴于外層父查詢的某個屬性值的稱為相關子查詢。帶Exists的子查詢就是相關子查詢
- Exists表示存在量詞:帶有Exists的子查詢不返回任何記錄的數(shù)據(jù),只返回邏輯值“True”或“False”
2、表結構
選課表:學號StudentNo、課程號CourseNo
學生表:學號StudentNo、姓名StudentName
課程表:課程號CourseNo、課程名CourseName
3、查詢所有選修了“C1”課程的學生名
In語句查詢:
select StudentName from 學生表 where StudentNo in (select StudentNo from 選課表 where CourseNo=‘C1')
Exists查詢:
select StudentName from 學生表 where exists (select 1 from 選課表 where 選課表.StudentNo=學生表.StudentNo and 選課表.CourseNo='C1')
相關子查詢執(zhí)行過程:先在外層查詢中取“學生表”的第一行記錄,利用該記錄的相關屬性值(在exists子查詢的where子句中用到的列)處理內層查詢,若外層的where子句返回“true”,則本條記錄放入結果表中。然后再取下一行記錄,重復上述過程直到外層表遍歷完畢。
Exists語句不關心子查詢返回的具體內容,因此用“exists(select 1 from)”來判斷子查詢是否返回記錄。
- Exists(select):若子查詢的結果集非空時,exists()表達式返回true;子查詢的結果集為空時,exists()表達式返回false。
- Not Exists(select):若子查詢的結果集非空時,not exists()表達式返回false;子查詢的結果集為空時,not exists()表達式返回true。
4、查詢沒所有選修“C1”課程的學生名
select StudentName from 學生表 where not exists (select 1 from 選課表 where 學生表.StudentNo=選課表.StudentNo and CourseNo=‘C1')
5、查詢選修了所有課程的學生名
--外層查詢、外層not exists select StudentName from 學生表 where not exists ( --內層查詢、內層not exists select 1 from 課程表 where not exists ( select 1 from 選課表 where 學生表.StudentNo=選課表.StudentNo and 課程表.CourseNo=選課表.CourseNo ) )
a、選一行學生信息S1、選一行課程信息C1
內層的not exists()值為true,說明選課表中找不到“S1.StudentNo + C1.CourseNo”這一記錄,說明學生S1沒有選課程C1,此時內層查詢的返回結果集會加上C1,當內層查詢的返回結果集不為空時,外層not exists()值為false,則外層where子句值為false,則S1被排除。
當內層查詢的返回結果集不為空時,說明S1至少有一門課程沒選 。
b、選一行學生信息S1、選一行課程信息C2
內層的not exists()值為false,說明選課表中有“S1.StudentNo + C2.CourseNo”這一記錄,說明學生S1選了課程C2,此時內層查詢的返回結果集不會加上C2,當內層查詢的返回結果集為空時,外層not exists()值為true,則外層where子句值為true,則S1被選中。
當內層查詢的返回結果集為空時,說明S1已經(jīng)選了所有課程。
c、結果
外層查詢最終返回的結果是選擇了所有課程的學生。
6、查詢選修了C1課程和C2課程的學生名
--外層查詢、外層not exists select StudentName from 學生表 where not exists ( --內層查詢、內層not exists select 1 from 課程表 where CourseNo in('C1','C2') and not exists ( select 1 from 選課表 where 學生表.StudentNo=選課表.StudentNo and 課程表.CourseNo=選課表.CourseNo ) )
第五條查詢的是選修了所有課程的學生,如果我們將所有課程限定為“C1、C2”,那查詢結果就變?yōu)檫x修了C1、C2的學生,該結果保證學生至少選修了C1、C2,但是選沒選其他課不清楚。
7、查詢至少選修了S1所選的全部課程的學生名
--外層查詢、外層not exists select StudentName from 學生表 where not exists ( --內層查詢、內層not exists select 1 from 選課表X where 選課表X.StudentNo='S1' and not exists ( select 1 from 選課表Y where 學生表.StudentNo=選課表Y.StudentNo and 選課表X.CourseNo=選課表Y.CourseNo ) )
第五條查詢的是選修了所有課程的學生,如果我們將所有課程限定為S1所選的全部課程,那查詢結果就變?yōu)檫x修了S1所選的全部課程的學生,該結果保證學生至少選修了S1所選的全部課程,但是選沒選其他課不清楚。
8、在from語句中使用子查詢,對查詢結果定義表名及列名
--定義表名可以用as也可以不用as select StudentName,avgScore,CreateDate from (select StudentName,CreateDate,AVG(Score) from StudentScores group by StudentName,CreateDate)as ta(StudentName,avgScore,CreateDate) where CreateDate>80 --定義表名可以用as也可以不用as select StudentName,avgScore,CreateDate from (select StudentName,CreateDate,AVG(Score) from StudentScores group by StudentName,CreateDate)ta(StudentName,avgScore,CreateDate) where CreateDate>80
到此這篇關于SqlServer中Exists的使用小結的文章就介紹到這了,更多相關SqlServer Exists內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SQL查詢數(shù)據(jù)是否存在的實現(xiàn)示例
在后端開發(fā)中,經(jīng)常需要使用數(shù)據(jù)庫來存儲和管理數(shù)據(jù),一個常見的任務是檢查數(shù)據(jù)庫中是否存在數(shù)據(jù),本文主要介紹了SQL查詢數(shù)據(jù)是否存在,感興趣的可以了解一下2024-02-02淺析SQL Server的嵌套存儲過程中使用同名的臨時表怪像
這篇文章主要介紹了淺析SQL Server的嵌套存儲過程中使用同名的臨時表怪像,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02SQL Server 數(shù)據(jù)庫備份和還原認識和總結(二)
本文將針對上文繼續(xù)進行數(shù)據(jù)備份和還原講解,主要講解備份和還原的一些關鍵選項2012-08-08SQL Server中實現(xiàn)數(shù)據(jù)庫的自定義視圖
在SQL Server的數(shù)據(jù)處理和分析中,視圖(View)是一種虛擬的表,其內容由SQL查詢定義,自定義視圖允許用戶根據(jù)需要創(chuàng)建個性化的數(shù)據(jù)展示,本文將詳細介紹如何在SQL Server中實現(xiàn)數(shù)據(jù)庫的自定義視圖,需要的朋友可以參考下2024-07-07