MySQL exists的用法介紹

來源:互聯網
上載者:User

有一個查詢如下:

1 SELECT c.CustomerId, CompanyName  
2 FROM Customers c  
3 WHERE EXISTS(  
4     SELECT OrderID FROM Orders o  
5     WHERE o.CustomerID = cu.CustomerID)  

這裡面的EXISTS是如何運作呢?子查詢返回的是OrderId欄位,可是外面的查詢要找的是CustomerID和CompanyName欄位,這兩個欄位肯定不在OrderID裡面啊,這是如何匹配的呢?

EXISTS用於檢查子查詢是否至少會返回一行資料,該子查詢實際上並不返回任何資料,而是傳回值True或False。

EXISTS 指定一個子查詢,檢測行的存在。文法:EXISTS subquery。參數 subquery 是一個受限的 SELECT 語句 (不允許有 COMPUTE 子句和 INTO 關鍵字)。結果類型為 Boolean,如果子查詢包含行,則返回 TRUE。

    • 在子查詢中使用 NULL 仍然返回結果集

這個例子在子查詢中指定 NULL,並返回結果集,通過使用 EXISTS 仍取值為 TRUE。

1 SELECT CategoryName
2 FROM Categories
3 WHERE EXISTS (SELECT NULL)
4 ORDER BY CategoryName ASC
    • 比較使用 EXISTS 和 IN 的查詢

這個例子比較了兩個語義類似的查詢。第一個查詢使用 EXISTS 而第二個查詢使用 IN。注意兩個查詢返回相同的資訊。

1 SELECT DISTINCT pub_name
2 FROM publishers
3 WHERE EXISTS
4     (SELECT *
5     FROM titles
6     WHERE pub_id = publishers.pub_id
7     AND type = 'business')
1 SELECT distinct pub_name
2 FROM publishers
3 WHERE pub_id IN
4     (SELECT pub_id
5     FROM titles
6     WHERE type = 'business')
    • 比較使用 EXISTS 和 = ANY 的查詢

本樣本顯示尋找與出版商住在同一城市中的作者的兩種查詢方法:第一種方法使用 = ANY,第二種方法使用 EXISTS。注意這兩種方法返回相同的資訊。

1 SELECT au_lname, au_fname
2 FROM authors
3 WHERE exists
4     (SELECT *
5     FROM publishers
6     WHERE authors.city = publishers.city)
1 SELECT au_lname, au_fname
2 FROM authors
3 WHERE city = ANY
4     (SELECT city
5     FROM publishers)
    • 比較使用 EXISTS 和 IN 的查詢

本樣本所示查詢尋找由位於以字母 B 開頭的城市中的任一出版商出版的書名:

1 SELECT title
2 FROM titles
3 WHERE EXISTS
4     (SELECT *
5     FROM publishers
6     WHERE pub_id = titles.pub_id
7     AND city LIKE 'B%')
1 SELECT title
2 FROM titles
3 WHERE pub_id IN
4     (SELECT pub_id
5     FROM publishers
6     WHERE city LIKE 'B%')
    • 使用 NOT EXISTS

NOT EXISTS 的作用與 EXISTS 正相反。如果子查詢沒有返回行,則滿足 NOT EXISTS 中的 WHERE 子句。本樣本尋找不出版商業書籍的出版商的名稱:

1 SELECT pub_name
2 FROM publishers
3 WHERE NOT EXISTS
4     (SELECT *
5     FROM titles
6     WHERE pub_id = publishers.pub_id
7     AND type = 'business')
8 ORDER BY pub_name

又比如以下 SQL 陳述式:

1 select distinct 姓名 from xs
2 where not exists (
3 select from kc
4 where not exists (
5 select from xs_kc
6 where 學號=xs.學號 and 課程號=kc.課程號
7 )

把最外層的查詢xs裡的資料一行一行的做裡層的子查詢。

中間的 exists 語句只做出對上一層的返回 true 或 false,因為查詢的條件都在 where 學號=xs.學號 and 課程號=kc.課程號這句話裡。每一個 exists 都會有一行值。它只是告訴一層,最外層的查詢條件在這裡成立或都不成立,返回的時候值也一樣回返回上去。直到最高層的時候如果是 true(真)就返回到結果集。為 false(假)丟棄。

1 where not exists
2 select from xs_kc
3 where 學號=xs.學號 and 課程號=kc.課程號

這個 exists 就是告訴上一層,這一行語句在我這裡不成立。因為他不是最高層,所以還要繼續向上返回。

select distinct 姓名 from xs where not exists (這裡的 exists 語句收到上一個為 false 的值。他在判斷一下,結果就是為 true(成立),由於是最高層所以就會把這行的結果(這裡指的是查詢條件)返回到結果集。

幾個重要的點:

  • 最裡層要用到的醒詢條件的表比如:xs.學號、kc.課程號等都要在前面的時候說明一下select * from kc,select distinct 姓名 from xs
  • 不要在太注意中間的exists語句.
  • 把exists和not exists嵌套時的傳回值弄明白
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.