有一個(gè)查詢(xún)?nèi)缦拢?
復(fù)制代碼 代碼如下:
SELECT c.CustomerId, CompanyName
FROM Customers c
WHERE EXISTS(
SELECT OrderID FROM Orders o
WHERE o.CustomerID = cu.CustomerID)
這里面的EXISTS是如何運(yùn)作呢?子查詢(xún)返回的是OrderId字段,可是外面的查詢(xún)要找的是CustomerID和CompanyName字段,這兩個(gè)字段肯定不在OrderID里面啊,這是如何匹配的呢?
EXISTS用于檢查子查詢(xún)是否至少會(huì)返回一行數(shù)據(jù),該子查詢(xún)實(shí)際上并不返回任何數(shù)據(jù),而是返回值True或False。
EXISTS 指定一個(gè)子查詢(xún),檢測(cè)行的存在。語(yǔ)法:EXISTS subquery。參數(shù) subquery 是一個(gè)受限的 SELECT 語(yǔ)句 (不允許有 COMPUTE 子句和 INTO 關(guān)鍵字)。結(jié)果類(lèi)型為 Boolean,如果子查詢(xún)包含行,則返回 TRUE。
在子查詢(xún)中使用 NULL 仍然返回結(jié)果集
這個(gè)例子在子查詢(xún)中指定 NULL,并返回結(jié)果集,通過(guò)使用 EXISTS 仍取值為 TRUE。
復(fù)制代碼 代碼如下:
SELECT CategoryName
FROM Categories
WHERE EXISTS (SELECT NULL)
ORDER BY CategoryName ASC
比較使用 EXISTS 和 IN 的查詢(xún)
這個(gè)例子比較了兩個(gè)語(yǔ)義類(lèi)似的查詢(xún)。第一個(gè)查詢(xún)使用 EXISTS 而第二個(gè)查詢(xún)使用 IN。注意兩個(gè)查詢(xún)返回相同的信息。
復(fù)制代碼 代碼如下:
SELECT DISTINCT pub_name
FROM publishers
WHERE EXISTS
(SELECT *
FROM titles
WHERE pub_id = publishers.pub_id
AND type = \'business')
復(fù)制代碼 代碼如下:
SELECT distinct pub_name
FROM publishers
WHERE pub_id IN
(SELECT pub_id
FROM titles
WHERE type = \'business')
比較使用 EXISTS 和 = ANY 的查詢(xún)
本示例顯示查找與出版商住在同一城市中的作者的兩種查詢(xún)方法:第一種方法使用 = ANY,第二種方法使用 EXISTS。注意這兩種方法返回相同的信息。
復(fù)制代碼 代碼如下:
SELECT au_lname, au_fname
FROM authors
WHERE exists
(SELECT *
FROM publishers
WHERE authors.city = publishers.city)
復(fù)制代碼 代碼如下:
SELECT au_lname, au_fname
FROM authors
WHERE city = ANY
(SELECT city
FROM publishers)
比較使用 EXISTS 和 IN 的查詢(xún)
本示例所示查詢(xún)查找由位于以字母 B 開(kāi)頭的城市中的任一出版商出版的書(shū)名:
復(fù)制代碼 代碼如下:
SELECT title
FROM titles
WHERE EXISTS
(SELECT *
FROM publishers
WHERE pub_id = titles.pub_id
AND city LIKE \'B%')
復(fù)制代碼 代碼如下:
SELECT title
FROM titles
WHERE pub_id IN
(SELECT pub_id
FROM publishers
WHERE city LIKE \'B%')
使用 NOT EXISTS
NOT EXISTS 的作用與 EXISTS 正相反。如果子查詢(xún)沒(méi)有返回行,則滿(mǎn)足 NOT EXISTS 中的 WHERE 子句。本示例查找不出版商業(yè)書(shū)籍的出版商的名稱(chēng):
復(fù)制代碼 代碼如下:
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 語(yǔ)句:
復(fù)制代碼 代碼如下:
select distinct 姓名 from xs
where not exists (
select * from kc
where not exists (
select * from xs_kc
where 學(xué)號(hào)=xs.學(xué)號(hào) and 課程號(hào)=kc.課程號(hào)
)
把最外層的查詢(xún)xs里的數(shù)據(jù)一行一行的做里層的子查詢(xún)。
中間的 exists 語(yǔ)句只做出對(duì)上一層的返回 true 或 false,因?yàn)椴樵?xún)的條件都在 where 學(xué)號(hào)=xs.學(xué)號(hào) and 課程號(hào)=kc.課程號(hào)這句話里。每一個(gè) exists 都會(huì)有一行值。它只是告訴一層,最外層的查詢(xún)條件在這里成立或都不成立,返回的時(shí)候值也一樣回返回上去。直到最高層的時(shí)候如果是 true(真)就返回到結(jié)果集。為 false(假)丟棄。
復(fù)制代碼 代碼如下:
where not exists
select * from xs_kc
where 學(xué)號(hào)=xs.學(xué)號(hào) and 課程號(hào)=kc.課程號(hào)
這個(gè) exists 就是告訴上一層,這一行語(yǔ)句在我這里不成立。因?yàn)樗皇亲罡邔?,所以還要繼續(xù)向上返回。
select distinct 姓名 from xs where not exists (這里的 exists 語(yǔ)句收到上一個(gè)為 false 的值。他在判斷一下,結(jié)果就是為 true(成立),由于是最高層所以就會(huì)把這行的結(jié)果(這里指的是查詢(xún)條件)返回到結(jié)果集。
幾個(gè)重要的點(diǎn):
最里層要用到的醒詢(xún)條件的表比如:xs.學(xué)號(hào)、kc.課程號(hào)等都要在前面的時(shí)候說(shuō)明一下select * from kc,select distinct 姓名 from xs
不要在太注意中間的exists語(yǔ)句.
把exists和not exists嵌套時(shí)的返回值弄明白
您可能感興趣的文章:- MySQL中in與exists的使用及區(qū)別介紹
- 對(duì)比分析MySQL語(yǔ)句中的IN 和Exists
- mysql exists與not exists實(shí)例詳解
- 安裝mysql出錯(cuò)”A Windows service with the name MySQL already exists.“如何解決
- MySQL的子查詢(xún)中FROM和EXISTS子句的使用教程
- MYSQL IN 與 EXISTS 的優(yōu)化示例介紹
- mssql和sqlite中關(guān)于if not exists 的寫(xiě)法
- mysql not in、left join、IS NULL、NOT EXISTS 效率問(wèn)題記錄
- UCenter info: MySQL Query Error SQL:SELECT value FROM [Table]vars WHERE noteexists
- mysql insert if not exists防止插入重復(fù)記錄的方法
- 詳解SQL EXISTS 運(yùn)算符