SQL中exists的使用方法
SELECT c.CustomerId, CompanyName
FROM Customers c
WHERE EXISTS(
SELECT OrderID FROM Orders o
WHERE o.CustomerID = cu.CustomerID)
這里面的EXISTS是如何運(yùn)作呢?子查詢返回的是OrderId字段,可是外面的查詢要找的是CustomerID和CompanyName字段,這兩個(gè)字段肯定不在OrderID里面啊,這是如何匹配的呢?
EXISTS用于檢查子查詢是否至少會(huì)返回一行數(shù)據(jù),該子查詢實(shí)際上并不返回任何數(shù)據(jù),而是返回值True或False。
EXISTS 指定一個(gè)子查詢,檢測行的存在。語法:EXISTS subquery。參數(shù) subquery 是一個(gè)受限的 SELECT 語句 (不允許有 COMPUTE 子句和 INTO 關(guān)鍵字)。結(jié)果類型為 Boolean,如果子查詢包含行,則返回 TRUE。
在子查詢中使用 NULL 仍然返回結(jié)果集
這個(gè)例子在子查詢中指定 NULL,并返回結(jié)果集,通過使用 EXISTS 仍取值為 TRUE。
SELECT CategoryName
FROM Categories
WHERE EXISTS (SELECT NULL)
ORDER BY CategoryName ASC
比較使用 EXISTS 和 IN 的查詢
這個(gè)例子比較了兩個(gè)語義類似的查詢。第一個(gè)查詢使用 EXISTS 而第二個(gè)查詢使用 IN。注意兩個(gè)查詢返回相同的信息。
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 子句。本示例查找不出版商業(yè)書籍的出版商的名稱:
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 學(xué)號=xs.學(xué)號 and 課程號=kc.課程號
)
把最外層的查詢xs里的數(shù)據(jù)一行一行的做里層的子查詢。
中間的 exists 語句只做出對上一層的返回 true 或 false,因?yàn)椴樵兊臈l件都在 where 學(xué)號=xs.學(xué)號 and 課程號=kc.課程號這句話里。每一個(gè) exists 都會(huì)有一行值。它只是告訴一層,最外層的查詢條件在這里成立或都不成立,返回的時(shí)候值也一樣回返回上去。直到最高層的時(shí)候如果是 true(真)就返回到結(jié)果集。為 false(假)丟棄。
where not exists
select * from xs_kc
where 學(xué)號=xs.學(xué)號 and 課程號=kc.課程號
這個(gè) exists 就是告訴上一層,這一行語句在我這里不成立。因?yàn)樗皇亲罡邔?,所以還要繼續(xù)向上返回。
select distinct 姓名 from xs where not exists (這里的 exists 語句收到上一個(gè)為 false 的值。他在判斷一下,結(jié)果就是為 true(成立),由于是最高層所以就會(huì)把這行的結(jié)果(這里指的是查詢條件)返回到結(jié)果集。
幾個(gè)重要的點(diǎn):
最里層要用到的醒詢條件的表比如:xs.學(xué)號、kc.課程號等都要在前面的時(shí)候說明一下select * from kc,select distinct 姓名 from xs
不要在太注意中間的exists語句.
把exists和not exists嵌套時(shí)的返回值弄明白
相關(guān)文章
sqlserver 統(tǒng)計(jì)sql語句大全收藏
SQL統(tǒng)計(jì)大全收藏,主要是一些實(shí)現(xiàn)統(tǒng)計(jì)功能常用的代碼,希望對需要的朋友有所幫助.2010-05-05SQLServer中用T—SQL命令查詢一個(gè)數(shù)據(jù)庫中有哪些表的sql語句
SQLServer如何用T—SQL命令查詢一個(gè)數(shù)據(jù)庫中有哪些表,方便進(jìn)行表操作,需要的朋友可以參考下2012-06-06調(diào)整SQLServer2000運(yùn)行中數(shù)據(jù)庫結(jié)構(gòu)
這篇文章主要介紹了調(diào)整SQLServer2000運(yùn)行中數(shù)據(jù)庫結(jié)構(gòu),十分實(shí)用的一個(gè)功能,這里推薦給大家,有需要的小伙伴可以參考下。2015-04-04SQL Server數(shù)據(jù)表字段自定義自增數(shù)據(jù)格式的方法
這篇文章主要介紹了SQL Server數(shù)據(jù)表字段自定義自增數(shù)據(jù)格式的方法,結(jié)合實(shí)例形式分析了SQL Server自增數(shù)據(jù)格式的定義方法與具體實(shí)現(xiàn)步驟,需要的朋友可以參考下2016-08-08由于系統(tǒng)錯(cuò)誤 126 (SQL Server),指定驅(qū)動(dòng)程序無法加載
今天下午在給客戶安裝用友T3標(biāo)準(zhǔn)版時(shí)碰到一個(gè)非常棘手的問題,MSDE2000數(shù)據(jù)庫和用友T3軟件都安裝好了,但是打開系統(tǒng)管理的時(shí)候提示:AUTOMATION錯(cuò)誤,然后將數(shù)據(jù)庫徹底卸載干凈,用友通T3軟件也徹底卸載干凈,重新安裝了一下,仍然是這個(gè)情況2021-03-03SQL Server中參數(shù)化SQL寫法遇到parameter sniff ,導(dǎo)致不合理執(zhí)行計(jì)劃重用的快速解決方法
這篇文章主要介紹了SQL Server中參數(shù)化SQL寫法遇到parameter sniff ,導(dǎo)致不合理執(zhí)行計(jì)劃重用的快速解決方法的相關(guān)資料,需要的朋友可以參考下2016-07-07教你輕松學(xué)會(huì)SQL Server記錄輪班的技巧
員工使用電子時(shí)鐘進(jìn)行簽名,這種電子簽名可以自動(dòng)將記錄添加到SQL Server數(shù)據(jù)庫中。但是,有時(shí)候,需要增加一個(gè)夜班;即使這個(gè)輪班發(fā)生在第二天,它仍然會(huì)被認(rèn)為是第三班2013-11-11我也有微信朋友圈了 Android實(shí)現(xiàn)
最近寫了一個(gè)簡單的朋友圈程序,包含了朋友圈的列表實(shí)現(xiàn),視頻的錄制、預(yù)覽與上傳,圖片可選擇拍照或者從相冊選取,從相冊選取可以一次選擇多張照片,并且限制照片的張數(shù),想擁有真正屬于自己的朋友圈嗎?快來圍觀2016-05-05