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

