SQL?Server數(shù)據(jù)庫之表的高級查詢
前言
高級子查詢是對查詢更靈活的運用,學(xué)會了高級查詢將對數(shù)據(jù)庫使用有很大的幫助。
一、子查詢
1、子查詢簡介
在SQL語言中,一個select-from-where語句稱為一個查詢塊。如果一個select語句嵌套在另一個select、insert、update或delete語句中,則稱之為子查詢或內(nèi)層查詢。
包含子查詢的語句則稱為主查詢或父查詢,一個子查詢可以嵌套在另一個子查詢中,這樣就可以形成:父查詢->子查詢->子查詢......
where子句中的子查詢通常有如下幾種形式:
where <列名> (not) in (子查詢)
where <列名> (>=) <= (子查詢)
where <列名> exists (子查詢)
下面分別介紹上述幾種形式的子查詢。
2、嵌套子查詢
嵌套子查詢指在內(nèi)層查詢中不關(guān)聯(lián)外層查詢的子查詢,在where下面的這種子查詢,要么返回一個單值,要么返回一個值的列表,嵌套子查詢的信息傳遞是單項的,子查詢只向外傳遞信息。
形式如下:
select *from 表
where 列名 (not) in
( select * from ...)
例如:select *from 表
where sno in(子查詢)
子查詢 求sno 張三、sno李四...
現(xiàn)在有學(xué)生表如下:
查詢與李晨是同一個系的學(xué)生
基本思路:查找結(jié)果是學(xué)生信息,條件是在where中尋找相同的系,子查詢條件是和李晨相同的系,則在子查詢中查詢所有和李晨相同系的系名即可
select * from student where dept in (select dept from student where sname = '李晨' )
查找考試成績大于等于90歲的學(xué)生的學(xué)號和姓名
基本思路:
方法1:首先應(yīng)從sc表中找出所有成績大于等于90的學(xué)生學(xué)號,然后再根據(jù)這些學(xué)號在student表中查找出對應(yīng)的學(xué)生學(xué)號和姓名,此方法不連接表
方法2:直接連接sc表 設(shè)置條件為grade>=90
select sno ,sname from student where sno in (select sno from sc where grade>=90 )
3、相關(guān)子查詢
相關(guān)子查詢與嵌套子查詢的主要區(qū)別在于信息傳遞,嵌套子查詢的信息傳遞是單向的,子查詢向外傳遞信息。相關(guān)子查詢的信息傳遞是雙向的,子查詢給外層查詢傳遞信息,外層查詢也向子查詢傳遞信息。
相關(guān)子查詢的執(zhí)行過程可分為3個步驟:
1、從外層查詢獲取一條記錄,并將該記錄信息傳遞給內(nèi)層查詢
2、內(nèi)層查詢根據(jù)外層查詢傳遞的值執(zhí)行查詢操作
3、內(nèi)層查詢將執(zhí)行結(jié)果傳回給外層查詢,外層查詢利用返回值完成對當(dāng)前記錄的處理
SC表如下:
由于內(nèi)層查詢和外層查詢使用的是同一張表,而且內(nèi)、外層查詢都需要從對方處獲取信息,因此需要為表取別名以區(qū)分是外層查詢的表還是內(nèi)層查詢的表
查詢每門課程中考試成績低于該門課程的平均成績的學(xué)生的課程號、學(xué)號和成績
分析:要的東西是:課程號、學(xué)號和成績,條件是考試成績低于--課程平均成績
則子查詢?yōu)椋赫n程平均成績
select cno,sno,grade from sc sc1 where grade < ( select avg(grade) from sc sc2 where sc1.cno = sc2.cno )
二、查詢運算
SQL支持對查詢結(jié)果再進(jìn)行并、交、差運算。每個運算都有屬于自己的關(guān)鍵字。
1、并運算
并運算可將兩個或多個查詢語句的結(jié)果集 合并為一個結(jié)果集,并運算關(guān)鍵字為:union,可以讓兩個表或多個表以行的形式合并,之前的join on是以列的形式合并。
如示意圖所示:
并運算的語法格式如下:
select 語句1
union
select 語句2
......
規(guī)定:兩個語句的列數(shù)必須相同,列數(shù)的數(shù)據(jù)類型必須相同或兼容
union all 保留重復(fù)的數(shù)據(jù)行,union 不保留重復(fù)數(shù)據(jù)行
course表和course2表如下:
合并course表和course2表
select *from course union select *from course2
由于限定列數(shù)和類型相同,所以對表的要求很高
2、交運算
交運算是返回同時在兩個集合中出現(xiàn)的記錄,即返回兩個查詢結(jié)果列值相同的記錄,其關(guān)鍵詞為:intersect
course表和course2表如下:
查詢同時出現(xiàn)在course表和course2表中的記錄
select *from course intersect select *from course2
3、差運算
差運算是返回一個表中有但另一個表中沒有的記錄,實現(xiàn)差運算的關(guān)鍵詞為:except
course表和course2表如下:
查詢在course1表中有但在course2表中沒有的記錄
select *from course except select *from course2
查詢在course2表中有但在course1表中沒有的記錄
select *from course2 except select *from course
三、函數(shù)的使用
在使用SQL語句編程時,經(jīng)常需要按照指定的條件進(jìn)行控制轉(zhuǎn)移或重復(fù)執(zhí)行某些操作,這個過程可以通過流程控制語句來實現(xiàn)!
流程控制語句用于控制程序的流程,一般分為三類:順序,分支和循環(huán)。SQL Server也提供了對這三種流程控制的支持?。?!
1、if分支語句
if~else語句用于構(gòu)造分支選擇結(jié)構(gòu),是最基本的選擇結(jié)構(gòu),可以利用if~else語句對一個條件進(jìn)行測試,并根據(jù)測試結(jié)果執(zhí)行相應(yīng)的操作?。?!
聲明一個整形變量@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語句
while語句用于設(shè)置重復(fù)執(zhí)行的語句塊,例如遍歷某個重復(fù)代碼。如果嵌套了兩個或多個while循環(huán),則內(nèi)層的break將會退出到下一個外層循環(huán)。
用while循環(huán)實現(xiàn)計算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語句
case表達(dá)式是一種多分支表達(dá)式,它可以根據(jù)條件列表的值返回多個可能的結(jié)果表達(dá)式中的一個。
case表達(dá)式可用在任何允許使用表達(dá)式的地方,但它不是一個完整的SQL語句,因此不能單獨執(zhí)行,只能作為可以單獨執(zhí)行的語句的一部分來使用。
學(xué)生表如下:
查詢學(xué)生表的考試情況,列出學(xué)號、姓名和成績,同時對成績進(jìn)行如下處理:
如果成績大于等于90分,則在查詢結(jié)果中顯示“優(yōu)”;
如果成績在80到89分之間,則在查詢結(jié)果中顯示“良”;
如果成績在70到79分之間,則在查詢結(jié)果中顯示“中”;
如果成績在60到69分之間,則在查詢結(jié)果中顯示“及格”;
如果成績在60分以下,則查詢結(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 成績 from student
四、總結(jié)
本章主要介紹了SQK Server 查詢語句的高級使用,以及一系列輔助查詢的小知識點。首先介紹了子查詢的嵌套子查詢,只返回一個值或一個列表,并且傳遞由內(nèi)到外是單項的,相關(guān)子查詢是內(nèi)外相互影響,是雙向的。子查詢大概有三種形式,要么in ,要么比值符號,要么exists存在的意思。
往后介紹了并運算union:兩個表合在一起去掉重復(fù)的,交運算intersect:兩張表重復(fù)的部分,差運算except:一張表有另一張表沒有的部分。最后介紹了幾種函數(shù)語句的使用。
總體只介紹了這些東西的基本語法,并沒有很深入的探討,先打好基礎(chǔ)了解大概,以后遇到真正的問題能夠更快更好的學(xué)習(xí),慢慢加深數(shù)據(jù)庫的知識,可以積少成多,一步一步的走下去?。?!
到此這篇關(guān)于SQL Server數(shù)據(jù)庫之表的高級查詢的文章就介紹到這了,更多相關(guān)SQLServer表高級查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SQLServer中防止并發(fā)插入重復(fù)數(shù)據(jù)的方法詳解
本文主要介紹了SQLServer中防止并發(fā)插入重復(fù)數(shù)據(jù)的方法,具有很好的參考價值。下面跟著小編一起來看下吧2017-03-03MyBatis MapperProvider MessageFormat拼接批量SQL語句執(zhí)行報錯的原因分析及解決辦法
這篇文章主要介紹了MyBatis MapperProvider MessageFormat拼接批量SQL語句執(zhí)行報錯的原因分析及解決辦法的相關(guān)資料,需要的朋友可以參考下2016-01-01hive中將string數(shù)據(jù)轉(zhuǎn)為bigint的操作
這篇文章主要介紹了hive中將string數(shù)據(jù)轉(zhuǎn)為bigint的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09