SQL——子查询
子查詢
一般而言在一個查詢中,可以嵌套另一個查詢,即在一個SELECT查詢內(nèi)在嵌入另一個SELECT查詢 ,外層的SELECT語句較外部查詢,內(nèi)層的SELECT語句叫子查詢,子查詢可以嵌套多層,但每層需要用“()”括起來,子查詢可以用在SELECT語句中,還可以用在INSERT,UPDATE,DELETE語句中 .子查詢是一個完整的的SELECT語句,是其他SOL語句的一部分,大部分子查詢是在SELECT語句的WHERE字句中實現(xiàn)的,也可以放在FROM字句中當虛擬表。
示例數(shù)據(jù)表如圖:
departments表:
employees表:
1.單行子查詢
指子查詢單列單行數(shù)據(jù),即只返回一個值,也可以成為單值子查詢。可以使用運算符=,>,<,<=,>=,<>,經(jīng)常用在SELECT,UPDATE,DELETE語句的WHERE字句中充當條件。
eg:查詢在銷售部工作的員工信息。
eg2:查詢工資低于平均工資的雇員信息。
? ??
?2.多行子查詢
指子查詢返回單列多行查詢,即一組數(shù)據(jù)。當子查詢是單列多行子查詢時,必須使用多行比較運算符,包括IN,NOT IN ,ANY,ALL,SOME.IN 和NOT IN 可以獨立使用,但ANY,和ALL必須與單行運算符組合起來使用:
<ANY:表示小于任何一個,即小于最大值即可。
=ANY:表示等于任何一個,與IN相似。
>ANY:表示大于任何一個,即大于最小值即可。
<ALL:表示小于所有值,即小于最小值。
>ALL:表示大于所有值,即大于最大值。
3.多列子查詢
多列子查詢獲得的是多列任意行數(shù)據(jù),當多列子查詢返回當行數(shù)據(jù)時相當于單行子查詢使用單行運算符(>,<,=等),返回多行數(shù)據(jù)時,在WHERE子句必須使用多行比較符(IN,NOT IN,ALL,ANY等)
eg:利用emp表查詢編號為7369的雇員的部門和工作崗位完全相同的所有雇員。(成對比較)
使用子查詢比較多列時,既可以使用成對比較也可以使用非成對比較?。成對比較要求多個列的數(shù)據(jù)必須同時匹配,非成對比較則不要求多個列的數(shù)據(jù)同時匹配,此時是單獨寫得查詢條件,各個條件之間是必須獨立的。
eg:利用emp表查詢編號為7369的雇員的部門和工作崗位完全相同的所有雇員。(非成對比較)
4.相關子查詢
內(nèi)部查詢的執(zhí)行依賴于外部查詢的數(shù)據(jù),外部查詢每執(zhí)行一次,內(nèi)部查詢也會執(zhí)行一次。
執(zhí)行過程:
- 從外部查詢中取出一個元組,將元組相關列的值傳給內(nèi)層查詢。
- 執(zhí)行內(nèi)層查詢,得到子查詢操作的值
- 外查詢根據(jù)子查詢返回的結果或結果集得到滿足的條件的行。
- 然后外層查詢?nèi)∠乱粋€元組重復上述步驟,直到外層的元組全部處理完畢。
eg1:查詢所有部門人數(shù)
語句1:連接查詢
eg2:相關子查詢
?
eg2:查詢各部門的部門號,部門名和平均工資。
語句1:連接查詢
語句2:相關查詢
:?
?eg3:查詢在北京工作的員工信息
語句1:連接查詢
?
語句2:IN
eg4:帶EXISTS的相關子查詢
是通過EXISTS運算符實現(xiàn)的查詢,EXISTS用于測試子查詢的結果是否為空,如果子查詢的結果不為空,則EXISTS發(fā)揮TRUE,否則返回false,與EXSITS相對應的有EXISTS.
?
?
?
?
總結
- 上一篇: 如何将多个PDF合并且页面顺序交叉重排
- 下一篇: 数据分析师要掌握SQL到什么程度?