1. 程式人生 > >SQL中EXISTS的使用

SQL中EXISTS的使用

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