SQL中exists的使用方法
更新時間:2011年11月15日 23:20:20 作者:
EXISTS用于檢查子查詢是否至少會返回一行數(shù)據(jù),該子查詢實際上并不返回任何數(shù)據(jù),而是返回值True或False
有一個查詢?nèi)缦拢?
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用于檢查子查詢是否至少會返回一行數(shù)據(jù),該子查詢實際上并不返回任何數(shù)據(jù),而是返回值True或False。
EXISTS 指定一個子查詢,檢測行的存在。語法:EXISTS subquery。參數(shù) subquery 是一個受限的 SELECT 語句 (不允許有 COMPUTE 子句和 INTO 關(guān)鍵字)。結(jié)果類型為 Boolean,如果子查詢包含行,則返回 TRUE。
在子查詢中使用 NULL 仍然返回結(jié)果集
這個例子在子查詢中指定 NULL,并返回結(jié)果集,通過使用 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 子句。本示例查找不出版商業(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,因為查詢的條件都在 where 學(xué)號=xs.學(xué)號 and 課程號=kc.課程號這句話里。每一個 exists 都會有一行值。它只是告訴一層,最外層的查詢條件在這里成立或都不成立,返回的時候值也一樣回返回上去。直到最高層的時候如果是 true(真)就返回到結(jié)果集。為 false(假)丟棄。
where not exists
select * from xs_kc
where 學(xué)號=xs.學(xué)號 and 課程號=kc.課程號
這個 exists 就是告訴上一層,這一行語句在我這里不成立。因為他不是最高層,所以還要繼續(xù)向上返回。
select distinct 姓名 from xs where not exists (這里的 exists 語句收到上一個為 false 的值。他在判斷一下,結(jié)果就是為 true(成立),由于是最高層所以就會把這行的結(jié)果(這里指的是查詢條件)返回到結(jié)果集。
幾個重要的點:
最里層要用到的醒詢條件的表比如:xs.學(xué)號、kc.課程號等都要在前面的時候說明一下select * from kc,select distinct 姓名 from xs
不要在太注意中間的exists語句.
把exists和not exists嵌套時的返回值弄明白
復(fù)制代碼 代碼如下:
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用于檢查子查詢是否至少會返回一行數(shù)據(jù),該子查詢實際上并不返回任何數(shù)據(jù),而是返回值True或False。
EXISTS 指定一個子查詢,檢測行的存在。語法:EXISTS subquery。參數(shù) subquery 是一個受限的 SELECT 語句 (不允許有 COMPUTE 子句和 INTO 關(guān)鍵字)。結(jié)果類型為 Boolean,如果子查詢包含行,則返回 TRUE。
在子查詢中使用 NULL 仍然返回結(jié)果集
這個例子在子查詢中指定 NULL,并返回結(jié)果集,通過使用 EXISTS 仍取值為 TRUE。
復(fù)制代碼 代碼如下:
SELECT CategoryName
FROM Categories
WHERE EXISTS (SELECT NULL)
ORDER BY CategoryName ASC
比較使用 EXISTS 和 IN 的查詢
這個例子比較了兩個語義類似的查詢。第一個查詢使用 EXISTS 而第二個查詢使用 IN。注意兩個查詢返回相同的信息。
復(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 的查詢
本示例顯示查找與出版商住在同一城市中的作者的兩種查詢方法:第一種方法使用 = 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 的查詢
本示例所示查詢查找由位于以字母 B 開頭的城市中的任一出版商出版的書名:
復(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 正相反。如果子查詢沒有返回行,則滿足 NOT EXISTS 中的 WHERE 子句。本示例查找不出版商業(yè)書籍的出版商的名稱:
復(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 語句:
復(fù)制代碼 代碼如下:
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,因為查詢的條件都在 where 學(xué)號=xs.學(xué)號 and 課程號=kc.課程號這句話里。每一個 exists 都會有一行值。它只是告訴一層,最外層的查詢條件在這里成立或都不成立,返回的時候值也一樣回返回上去。直到最高層的時候如果是 true(真)就返回到結(jié)果集。為 false(假)丟棄。
復(fù)制代碼 代碼如下:
where not exists
select * from xs_kc
where 學(xué)號=xs.學(xué)號 and 課程號=kc.課程號
這個 exists 就是告訴上一層,這一行語句在我這里不成立。因為他不是最高層,所以還要繼續(xù)向上返回。
select distinct 姓名 from xs where not exists (這里的 exists 語句收到上一個為 false 的值。他在判斷一下,結(jié)果就是為 true(成立),由于是最高層所以就會把這行的結(jié)果(這里指的是查詢條件)返回到結(jié)果集。
幾個重要的點:
最里層要用到的醒詢條件的表比如:xs.學(xué)號、kc.課程號等都要在前面的時候說明一下select * from kc,select distinct 姓名 from xs
不要在太注意中間的exists語句.
把exists和not exists嵌套時的返回值弄明白
相關(guān)文章
SQLServer中用T—SQL命令查詢一個數(shù)據(jù)庫中有哪些表的sql語句
SQLServer如何用T—SQL命令查詢一個數(shù)據(jù)庫中有哪些表,方便進行表操作,需要的朋友可以參考下2012-06-06調(diào)整SQLServer2000運行中數(shù)據(jù)庫結(jié)構(gòu)
這篇文章主要介紹了調(diào)整SQLServer2000運行中數(shù)據(jù)庫結(jié)構(gòu),十分實用的一個功能,這里推薦給大家,有需要的小伙伴可以參考下。2015-04-04SQL Server數(shù)據(jù)表字段自定義自增數(shù)據(jù)格式的方法
這篇文章主要介紹了SQL Server數(shù)據(jù)表字段自定義自增數(shù)據(jù)格式的方法,結(jié)合實例形式分析了SQL Server自增數(shù)據(jù)格式的定義方法與具體實現(xiàn)步驟,需要的朋友可以參考下2016-08-08由于系統(tǒng)錯誤 126 (SQL Server),指定驅(qū)動程序無法加載
今天下午在給客戶安裝用友T3標準版時碰到一個非常棘手的問題,MSDE2000數(shù)據(jù)庫和用友T3軟件都安裝好了,但是打開系統(tǒng)管理的時候提示:AUTOMATION錯誤,然后將數(shù)據(jù)庫徹底卸載干凈,用友通T3軟件也徹底卸載干凈,重新安裝了一下,仍然是這個情況2021-03-03SQL Server中參數(shù)化SQL寫法遇到parameter sniff ,導(dǎo)致不合理執(zhí)行計劃重用的快速解決方法
這篇文章主要介紹了SQL Server中參數(shù)化SQL寫法遇到parameter sniff ,導(dǎo)致不合理執(zhí)行計劃重用的快速解決方法的相關(guān)資料,需要的朋友可以參考下2016-07-07