SQL?Server數(shù)據(jù)庫(kù)之表的高級(jí)查詢(xún)
前言
高級(jí)子查詢(xún)是對(duì)查詢(xún)更靈活的運(yùn)用,學(xué)會(huì)了高級(jí)查詢(xún)將對(duì)數(shù)據(jù)庫(kù)使用有很大的幫助。
一、子查詢(xún)
1、子查詢(xún)簡(jiǎn)介
在SQL語(yǔ)言中,一個(gè)select-from-where語(yǔ)句稱(chēng)為一個(gè)查詢(xún)塊。如果一個(gè)select語(yǔ)句嵌套在另一個(gè)select、insert、update或delete語(yǔ)句中,則稱(chēng)之為子查詢(xún)或內(nèi)層查詢(xún)。
包含子查詢(xún)的語(yǔ)句則稱(chēng)為主查詢(xún)或父查詢(xún),一個(gè)子查詢(xún)可以嵌套在另一個(gè)子查詢(xún)中,這樣就可以形成:父查詢(xún)->子查詢(xún)->子查詢(xún)......
where子句中的子查詢(xún)通常有如下幾種形式:
where <列名> (not) in (子查詢(xún))
where <列名> (>=) <= (子查詢(xún))
where <列名> exists (子查詢(xún))
下面分別介紹上述幾種形式的子查詢(xún)。
2、嵌套子查詢(xún)
嵌套子查詢(xún)指在內(nèi)層查詢(xún)中不關(guān)聯(lián)外層查詢(xún)的子查詢(xún),在where下面的這種子查詢(xún),要么返回一個(gè)單值,要么返回一個(gè)值的列表,嵌套子查詢(xún)的信息傳遞是單項(xiàng)的,子查詢(xún)只向外傳遞信息。
形式如下:
select *from 表
where 列名 (not) in
( select * from ...)
例如:select *from 表
where sno in(子查詢(xún))
子查詢(xún) 求sno 張三、sno李四...
現(xiàn)在有學(xué)生表如下:

查詢(xún)與李晨是同一個(gè)系的學(xué)生
基本思路:查找結(jié)果是學(xué)生信息,條件是在where中尋找相同的系,子查詢(xún)條件是和李晨相同的系,則在子查詢(xún)中查詢(xún)所有和李晨相同系的系名即可
select * from student where dept in (select dept from student where sname = '李晨' )

查找考試成績(jī)大于等于90歲的學(xué)生的學(xué)號(hào)和姓名
基本思路:
方法1:首先應(yīng)從sc表中找出所有成績(jī)大于等于90的學(xué)生學(xué)號(hào),然后再根據(jù)這些學(xué)號(hào)在student表中查找出對(duì)應(yīng)的學(xué)生學(xué)號(hào)和姓名,此方法不連接表
方法2:直接連接sc表 設(shè)置條件為grade>=90
select sno ,sname from student where sno in (select sno from sc where grade>=90 )

3、相關(guān)子查詢(xún)
相關(guān)子查詢(xún)與嵌套子查詢(xún)的主要區(qū)別在于信息傳遞,嵌套子查詢(xún)的信息傳遞是單向的,子查詢(xún)向外傳遞信息。相關(guān)子查詢(xún)的信息傳遞是雙向的,子查詢(xún)給外層查詢(xún)傳遞信息,外層查詢(xún)也向子查詢(xún)傳遞信息。
相關(guān)子查詢(xún)的執(zhí)行過(guò)程可分為3個(gè)步驟:
1、從外層查詢(xún)獲取一條記錄,并將該記錄信息傳遞給內(nèi)層查詢(xún)
2、內(nèi)層查詢(xún)根據(jù)外層查詢(xún)傳遞的值執(zhí)行查詢(xún)操作
3、內(nèi)層查詢(xún)將執(zhí)行結(jié)果傳回給外層查詢(xún),外層查詢(xún)利用返回值完成對(duì)當(dāng)前記錄的處理
SC表如下:

由于內(nèi)層查詢(xún)和外層查詢(xún)使用的是同一張表,而且內(nèi)、外層查詢(xún)都需要從對(duì)方處獲取信息,因此需要為表取別名以區(qū)分是外層查詢(xún)的表還是內(nèi)層查詢(xún)的表
查詢(xún)每門(mén)課程中考試成績(jī)低于該門(mén)課程的平均成績(jī)的學(xué)生的課程號(hào)、學(xué)號(hào)和成績(jī)
分析:要的東西是:課程號(hào)、學(xué)號(hào)和成績(jī),條件是考試成績(jī)低于--課程平均成績(jī)
則子查詢(xún)?yōu)椋赫n程平均成績(jī)
select cno,sno,grade from sc sc1 where grade < ( select avg(grade) from sc sc2 where sc1.cno = sc2.cno )

二、查詢(xún)運(yùn)算
SQL支持對(duì)查詢(xún)結(jié)果再進(jìn)行并、交、差運(yùn)算。每個(gè)運(yùn)算都有屬于自己的關(guān)鍵字。
1、并運(yùn)算
并運(yùn)算可將兩個(gè)或多個(gè)查詢(xún)語(yǔ)句的結(jié)果集 合并為一個(gè)結(jié)果集,并運(yùn)算關(guān)鍵字為:union,可以讓兩個(gè)表或多個(gè)表以行的形式合并,之前的join on是以列的形式合并。
如示意圖所示:

并運(yùn)算的語(yǔ)法格式如下:
select 語(yǔ)句1
union
select 語(yǔ)句2
......
規(guī)定:兩個(gè)語(yǔ)句的列數(shù)必須相同,列數(shù)的數(shù)據(jù)類(lèi)型必須相同或兼容
union all 保留重復(fù)的數(shù)據(jù)行,union 不保留重復(fù)數(shù)據(jù)行
course表和course2表如下:


合并course表和course2表
select *from course union select *from course2

由于限定列數(shù)和類(lèi)型相同,所以對(duì)表的要求很高
2、交運(yùn)算
交運(yùn)算是返回同時(shí)在兩個(gè)集合中出現(xiàn)的記錄,即返回兩個(gè)查詢(xún)結(jié)果列值相同的記錄,其關(guān)鍵詞為:intersect
course表和course2表如下:


查詢(xún)同時(shí)出現(xiàn)在course表和course2表中的記錄
select *from course intersect select *from course2

3、差運(yùn)算
差運(yùn)算是返回一個(gè)表中有但另一個(gè)表中沒(méi)有的記錄,實(shí)現(xiàn)差運(yùn)算的關(guān)鍵詞為:except
course表和course2表如下:


查詢(xún)?cè)赾ourse1表中有但在course2表中沒(méi)有的記錄
select *from course except select *from course2

查詢(xún)?cè)赾ourse2表中有但在course1表中沒(méi)有的記錄
select *from course2 except select *from course

三、函數(shù)的使用
在使用SQL語(yǔ)句編程時(shí),經(jīng)常需要按照指定的條件進(jìn)行控制轉(zhuǎn)移或重復(fù)執(zhí)行某些操作,這個(gè)過(guò)程可以通過(guò)流程控制語(yǔ)句來(lái)實(shí)現(xiàn)!
流程控制語(yǔ)句用于控制程序的流程,一般分為三類(lèi):順序,分支和循環(huán)。SQL Server也提供了對(duì)這三種流程控制的支持?。?!
1、if分支語(yǔ)句
if~else語(yǔ)句用于構(gòu)造分支選擇結(jié)構(gòu),是最基本的選擇結(jié)構(gòu),可以利用if~else語(yǔ)句對(duì)一個(gè)條件進(jìn)行測(cè)試,并根據(jù)測(cè)試結(jié)果執(zhí)行相應(yīng)的操作!??!
聲明一個(gè)整形變量@grade,給該變量賦值為88,并判斷如果@grade大于等于90,則顯示“優(yōu)”,如果@grade在80~89之間則顯示“良”,如果小于80則顯示其他
declare @grade int
set @grade = 88
if @grade>=90
print '優(yōu)'
else if @grade between 80 and 89
print '良'
else
print '其他'2、while語(yǔ)句
while語(yǔ)句用于設(shè)置重復(fù)執(zhí)行的語(yǔ)句塊,例如遍歷某個(gè)重復(fù)代碼。如果嵌套了兩個(gè)或多個(gè)while循環(huán),則內(nèi)層的break將會(huì)退出到下一個(gè)外層循環(huán)。
用while循環(huán)實(shí)現(xiàn)計(jì)算5000減1、減2、減3、......一直減到50的結(jié)果,并顯示最終結(jié)果
declare @i int,@sum int set @i=1 set @sum=5000 while @i<=50 begin set @sum = @sum-@i set @i = @i+1 end print @sum
3、case語(yǔ)句
case表達(dá)式是一種多分支表達(dá)式,它可以根據(jù)條件列表的值返回多個(gè)可能的結(jié)果表達(dá)式中的一個(gè)。
case表達(dá)式可用在任何允許使用表達(dá)式的地方,但它不是一個(gè)完整的SQL語(yǔ)句,因此不能單獨(dú)執(zhí)行,只能作為可以單獨(dú)執(zhí)行的語(yǔ)句的一部分來(lái)使用。
學(xué)生表如下:

查詢(xún)學(xué)生表的考試情況,列出學(xué)號(hào)、姓名和成績(jī),同時(shí)對(duì)成績(jī)進(jìn)行如下處理:
如果成績(jī)大于等于90分,則在查詢(xún)結(jié)果中顯示“優(yōu)”;
如果成績(jī)?cè)?0到89分之間,則在查詢(xún)結(jié)果中顯示“良”;
如果成績(jī)?cè)?0到79分之間,則在查詢(xún)結(jié)果中顯示“中”;
如果成績(jī)?cè)?0到69分之間,則在查詢(xún)結(jié)果中顯示“及格”;
如果成績(jī)?cè)?0分以下,則查詢(xún)結(jié)果中顯示“不及格。
select id,name,grade, case when grade >=90 then '優(yōu)' when grade between 80 and 89 then '良' when grade between 70 and 79 then '中' when grade between 60 and 69 then '及格' when grade <60 then '不及格' end as 成績(jī) from student

四、總結(jié)
本章主要介紹了SQK Server 查詢(xún)語(yǔ)句的高級(jí)使用,以及一系列輔助查詢(xún)的小知識(shí)點(diǎn)。首先介紹了子查詢(xún)的嵌套子查詢(xún),只返回一個(gè)值或一個(gè)列表,并且傳遞由內(nèi)到外是單項(xiàng)的,相關(guān)子查詢(xún)是內(nèi)外相互影響,是雙向的。子查詢(xún)大概有三種形式,要么in ,要么比值符號(hào),要么exists存在的意思。
往后介紹了并運(yùn)算union:兩個(gè)表合在一起去掉重復(fù)的,交運(yùn)算intersect:兩張表重復(fù)的部分,差運(yùn)算except:一張表有另一張表沒(méi)有的部分。最后介紹了幾種函數(shù)語(yǔ)句的使用。
總體只介紹了這些東西的基本語(yǔ)法,并沒(méi)有很深入的探討,先打好基礎(chǔ)了解大概,以后遇到真正的問(wèn)題能夠更快更好的學(xué)習(xí),慢慢加深數(shù)據(jù)庫(kù)的知識(shí),可以積少成多,一步一步的走下去!??!
到此這篇關(guān)于SQL Server數(shù)據(jù)庫(kù)之表的高級(jí)查詢(xún)的文章就介紹到這了,更多相關(guān)SQLServer表高級(jí)查詢(xún)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
公網(wǎng)遠(yuǎn)程訪問(wèn)局域網(wǎng)SQL Server數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)的重要性相信大家都有所了解,在某些場(chǎng)景下,數(shù)據(jù)庫(kù)已經(jīng)成為企業(yè)正常運(yùn)行必不可少的條件之一。與企業(yè)的其他工作一樣,數(shù)據(jù)庫(kù)也需要進(jìn)行必要的維護(hù),想詳細(xì)了解的同學(xué)可以參考這篇文章2023-04-04
擴(kuò)展性很好的一個(gè)分頁(yè)存儲(chǔ)過(guò)程分享
擴(kuò)展性很好的一個(gè)分頁(yè)存儲(chǔ)過(guò)程分享,需要的朋友可以參考下。2011-11-11
SQL?Server表空間碎片化回收的實(shí)現(xiàn)
本文主要介紹了SQL?Server表空間碎片化回收的實(shí)現(xiàn),文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
SqlServer查詢(xún)和Kill進(jìn)程死鎖的語(yǔ)句
這篇文章主要介紹了SqlServer查詢(xún)和Kill進(jìn)程死鎖的語(yǔ)句,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08
眾所周知,在M$sql中有個(gè)絕對(duì)是網(wǎng)絡(luò)安全中的隱患的帳號(hào)sa,系統(tǒng)管理員 (sa),默認(rèn)情況下,它指派給固定服務(wù)器角色 sysadmin,并不能進(jìn)行更改。這個(gè)sa一般情況下是既不可以更改名稱(chēng),也不可以刪除,呵呵,有點(diǎn)雞肋的味道,棄置可惜,食之無(wú)味。裝上sql2000之后,感覺(jué)怪怪的,放著這個(gè)后門(mén)在,始終都不放心,擔(dān)心有一天被人破出密碼,那偶的電腦不就完拉。可能你回說(shuō)設(shè)個(gè)強(qiáng)壯點(diǎn)的密碼,這個(gè)辦法是可行,可不是長(zhǎng)久之記,所謂斬草要除根,要是把sa給刪拉就不用擔(dān)心那些"黑客"暴力破解拉。2008-04-04
SQL 重復(fù)記錄問(wèn)題的處理方法小結(jié)
SQL 重復(fù)記錄問(wèn)題的處理方法小結(jié),需要的朋友可以參考下。2010-05-05
將所有符合條件的結(jié)果拼接成一列并用逗號(hào)隔開(kāi)的一個(gè)sql語(yǔ)句
把所有符合條件的結(jié)果拼接成一列,用逗號(hào)隔開(kāi)的一個(gè)sql語(yǔ)句。2010-06-06

