MySQL exists的用法介紹

最外層的查詢里的數據一行一行的做里層的子查詢
服務器君一共花費了162.583 ms進行了5次數據庫查詢,努力地為您提供了這個頁面。
試試閱讀模式?希望聽取您的建議

有一個查詢如下:

SELECT c.CustomerId, CompanyName   
FROM Customers c   
WHERE EXISTS(   
	SELECT OrderID FROM Orders o   
	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。

    SELECT CategoryName
    FROM Categories
    WHERE EXISTS (SELECT NULL)
    ORDER BY CategoryName ASC
    
  • 比較使用 EXISTS 和 IN 的查詢
  • 這個例子比較了兩個語義類似的查詢。第一個查詢使用 EXISTS 而第二個查詢使用 IN。注意兩個查詢返回相同的信息。

    SELECT DISTINCT pub_name
    FROM publishers
    WHERE EXISTS
        (SELECT *
        FROM titles
        WHERE pub_id = publishers.pub_id
        AND type = 'business')
    
    SELECT distinct pub_name
    FROM publishers
    WHERE pub_id IN
        (SELECT pub_id
        FROM titles
        WHERE type = 'business')
    
  • 比較使用 EXISTS 和 = ANY 的查詢
  • 本示例顯示查找與出版商住在同一城市中的作者的兩種查詢方法:第一種方法使用 = ANY,第二種方法使用 EXISTS。注意這兩種方法返回相同的信息。

    SELECT au_lname, au_fname
    FROM authors
    WHERE exists
        (SELECT *
        FROM publishers
        WHERE authors.city = publishers.city)
    
    SELECT au_lname, au_fname
    FROM authors
    WHERE city = ANY
        (SELECT city
        FROM publishers)
    
  • 比較使用 EXISTS 和 IN 的查詢
  • 本示例所示查詢查找由位于以字母 B 開頭的城市中的任一出版商出版的書名:

    SELECT title
    FROM titles
    WHERE EXISTS
        (SELECT *
        FROM publishers
        WHERE pub_id = titles.pub_id
        AND city LIKE 'B%')
    
    SELECT title
    FROM titles
    WHERE pub_id IN
        (SELECT pub_id
        FROM publishers
        WHERE city LIKE 'B%')
    
  • 使用 NOT EXISTS
  • NOT EXISTS 的作用與 EXISTS 正相反。如果子查詢沒有返回行,則滿足 NOT EXISTS 中的 WHERE 子句。本示例查找不出版商業書籍的出版商的名稱:

    SELECT pub_name
    FROM publishers
    WHERE NOT EXISTS
        (SELECT *
        FROM titles
        WHERE pub_id = publishers.pub_id
        AND type = 'business')
    ORDER BY pub_name
    

又比如以下 SQL 語句:

select distinct 姓名 from xs
where not exists (
select * from kc
where not exists (
select * from xs_kc
where 學號=xs.學號 and 課程號=kc.課程號
)

把最外層的查詢xs里的數據一行一行的做里層的子查詢。

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

where not exists
select * from xs_kc
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嵌套時的返回值弄明白

本文地址:http://www.824886.live/librarys/veda/detail/639,歡迎訪問原出處。

不打個分嗎?

轉載隨意,但請帶上本文地址:

http://www.824886.live/librarys/veda/detail/639

如果你認為這篇文章值得更多人閱讀,歡迎使用下面的分享功能。
小提示:您可以按快捷鍵 Ctrl + D,或點此 加入收藏。

閱讀一百本計算機著作吧,少年

很多人覺得自己技術進步很慢,學習效率低,我覺得一個重要原因是看的書少了。多少是多呢?起碼得看3、4、5、6米吧。給個具體的數量,那就100本書吧。很多人知識結構不好而且不系統,因為在特定領域有一個足夠量的知識量+足夠良好的知識結構,系統化以后就足以應對大量未曾遇到過的問題。

奉勸自學者:構建特定領域的知識結構體系的路徑中再也沒有比學習該專業的專業課程更好的了。如果我的知識結構體系足以囊括面試官的大部分甚至吞并他的知識結構體系的話,讀到他言語中的一個詞我們就已經知道他要表達什么,我們可以讓他坐“上位”畢竟他是面試官,但是在知識結構體系以及心理上我們就居高臨下。

所以,閱讀一百本計算機著作吧,少年!

《致加西亞的信》 阿爾伯特·哈伯德(Hubbard.E.) (作者), 趙立光 (譯者), 艾柯 (譯者)

《致加西亞的信(經典盒裝版)》內容簡介:美西戰爭爆發以后,美國必須立即與古巴起義軍首領加西亞取得聯系,并獲得他的合作。但當時,加西亞身在古巴的深山里——沒有人知道他的確切地點,所以沒法與他取得聯系。這時,有人向總統推薦一個名叫羅文的人,說他有辦法找到加西亞,而且也只有他才能找得到。他們找來羅文,交給他一封寫給加西亞的信。三周后,羅文徒步走過一個危機四伏的國家,最終把那封信交給了加西亞。 此后,羅文的事跡被傳為佳話,“送信”成為了敬業、忠誠、勤奮的象征,羅文便成了每個領導都想找到的人和每個員工都應該學習和效仿的榜樣。

更多計算機寶庫...

云南快乐十分走势一定牛 七星体育直播手机版 手机股票网上开户 幸运赛车基本走势图 加拿大快乐8开奖三位数 福彩开奖查询 网上购彩票正规app下载 新疆11选5遗漏 三个半波中特论坛 最好的股票分析软件排行榜 陕西快乐10平台