獨立子查詢
每個子查詢都有它所屬于的外部查詢。
獨立子查詢是獨立于其外部查詢的子查詢,可以選中子查詢部分的代碼獨立運作。
在邏輯處理過程中,子查詢的位置決定了他被執行的順序
SELECT a.employee_name, b.salary_type ,
(b.salary-(SELECT AVG(salary) FROM salary where salary_type ='崗位工資')) AS '差距'
FROM employee a
INNER JOIN salary b
ON a.employee_id = b.employee_id
WHERE b.salary_type ='崗位工資'
SELECT AVG(salary) FROM salary where salary_type ='崗位工資'
上述語句是獨立子查詢,可以獨立運作且不依賴外部查詢的傳回的結果
獨立标量子查詢
标量子查詢是傳回單個值的子查詢
SELECT a.employee_name, SUM(b.salary)
FROM employee a
INNER JOIN salary b
ON a.employee_id = b.employee_id
WHERE b.salary_type ='崗位工資' and
b.salary <(SELECT AVG(salary) FROM salary where salary_type ='崗位工資')
group by a.employee_name
獨立多值子查詢
執行下列語句,更新試驗環境
ALTER TABLE employee
ADD age int
GO
UPDATE employee SET AGE = 26 WHERE employee_id =1
UPDATE employee SET AGE = 33 WHERE employee_id =2
UPDATE employee SET AGE = 45 WHERE employee_id =3
UPDATE employee SET AGE = 67 WHERE employee_id =4
UPDATE employee SET AGE = 54 WHERE employee_id =5
UPDATE employee SET AGE = 18 WHERE employee_id =6
SELECT * FROM employee
where age > (SELECT age FROM employee where age>30)
如果使用單值比較運算符和子查詢進行比較,子查詢如果傳回多個值或多個列會報錯
可以使用IN、EXISTS、 ALL、ANY或SOME關鍵字,其中SOME是和ANY等效的ISO标準。
- ALL要求比較時要滿足子查詢得到的每個值
- ANY要求比較時至少要滿足子查詢得到的任一值
SELECT age FROM employee where age>30
執行上述語句結果
SELECT * FROM employee
where age > ANY(SELECT age FROM employee where age>30)
上述語句ANY 隻要大于 子查詢中任一一個年齡的員工資訊都會顯示(大于33歲)
SELECT * FROM employee
where age >= ALL(SELECT age FROM employee where age>30)
上述語句ALL 隻要大于或等于 子查詢中所有年齡的員工資訊都會顯示(大于67歲)
當子查詢中包含 NULL 時,使用ALL、ANY 時不傳回任何值,因為ALL和ANY 實際上等價于使用了 AND 或者OR連接配接了條件,與NULL 進行比較的本質并沒有改變。
學習參考資料:《跟韓老師學 SQL Server 資料庫設計與開發》