欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SqlServer中Exists的使用小結(jié)

 更新時(shí)間:2024年02月27日 09:49:17   作者:changuncle  
在SQLServer中,EXISTS是一種邏輯運(yùn)算符,用于檢查一個(gè)子查詢是否返回結(jié)果,本文主要介紹了SqlServer中Exists的使用小結(jié),具有一定的參考價(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)文章

最新評(píng)論