SQL中EXISTS的使用
阿新 • • 發佈:2018-12-09
exists : 強調的是是否返回結果集
- 不相關子查詢:子查詢的查詢條件不依賴於父查詢的稱為不相關子查詢。
- 相關子查詢:子查詢的查詢條件依賴於外層父查詢的某個屬性值的稱為相關子查詢,帶EXISTS 的子查詢就是相關子查詢
關鍵詞 | 意思 | 返回結果判斷 |
---|---|---|
EXISTS | 若子查詢的結果集非空時,返回“True” | 當為ture時,主查詢返回結果 |
NOT EXISTS | 若子查詢結果為空,返回“True” | 當為ture時,主查詢返回結果 |
Exists執行的流程
Exists首先執行外層查詢,再執行記憶體查詢,與IN相反。 流程為首先取出外層中的第 一元組, 再執行內層查詢,將外層表的第一元組代入,若內層查詢為真,即有結果時。返回外層表中的第一元組,接著取出第二元組,執行相同的演算法。一直到掃描完外層整表
類似java:
for(int i =0; i<>EOFout;i++) {
for (int j = 0 ; j<EOFint,j++) {
}
}
IN 查詢和 EXISTS 查詢,返回結果相同
in查詢,先執行內層查詢
SELECT 姓名
FROM 學生表
WHERE 學號 IN (SELECT 學號 FROM 選課表 WHERE 課程號 = 'C1');
等價於 下面EXISTS 查詢(先執行外層查詢)
SELECT 姓名
FROM 學生表
WHERE EXISTS
(
SELECT *
FROM 選課表
WHERE 學生表.學號 = 選課表.學號 AND 課程號 = 'C1'
);
在子查詢中使用 NULL 仍然返回結果集
select * from table where exists(select null)
等同於: select * from table
EXISTS 和 = ANY 的查詢,返回結果相同
select * from 學生表 where exists(select 選課表.學號 from 選課表 where 選課表.學號=學生表.學號)
select * from 學生表 where 學生表.學號=ANY(select 選課表.學號 from 選課表)
查詢年齡最大的學生
SELECT *
FROM 學生表 user1
WHERE not EXISTS (
SELECT 1
FROM 學生表 user2
WHERE
user1.age < user2.age
)
查詢選修了所有課程的學生的姓名
SELECT 姓名
FROM 學生表
WHERE NOT EXISTS (
SELECT *
FROM 課程表
WHERE NOT EXISTS (
SELECT *
FROM 選課表
WHERE 學生表.學號 = 選課表.學號 AND 課程表.課程號 = 選課表.課程號
)
);
查詢至少選修了S1所選的全部課程的學生名
SELECT 姓名
FROM 學生表
WHERE NOT EXISTS (
SELECT *
FROM 選課表 AS 選課表X
WHERE 選課表X.學號='s1' AND NOT EXISTS (
SELECT *
FROM 選課表 AS 選課表Y
WHERE 學生表.學號 = 選課表Y.學號 AND 選課表X.課程號 = 選課表Y.課程號
)
);
在FROM語句中使用子查詢,對查詢結果定義表名及列名
SELECT 學號, AVG_G
FROM (
SELECT 學號, AVG(Grade)
FROM 選課表
GROUP BY 學號
) AS RA(學號, AVG_G)
WHERE AVG_G > 80