SQL中exists的使用方法
更新時(shí)間:2011年11月15日 23:20:20 作者:
EXISTS用于檢查子查詢是否至少會(huì)返回一行數(shù)據(jù),該子查詢實(shí)際上并不返回任何數(shù)據(jù),而是返回值True或False
有一個(gè)查詢?nèi)缦拢?
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è)子查詢,檢測(cè)行的存在。語法: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é)號(hào)=xs.學(xué)號(hào) and 課程號(hào)=kc.課程號(hào)
)
把最外層的查詢xs里的數(shù)據(jù)一行一行的做里層的子查詢。
中間的 exists 語句只做出對(duì)上一層的返回 true 或 false,因?yàn)椴樵兊臈l件都在 where 學(xué)號(hào)=xs.學(xué)號(hào) and 課程號(hào)=kc.課程號(hào)這句話里。每一個(gè) exists 都會(huì)有一行值。它只是告訴一層,最外層的查詢條件在這里成立或都不成立,返回的時(shí)候值也一樣回返回上去。直到最高層的時(shí)候如果是 true(真)就返回到結(jié)果集。為 false(假)丟棄。
where not exists
select * from xs_kc
where 學(xué)號(hào)=xs.學(xué)號(hào) and 課程號(hào)=kc.課程號(hào)
這個(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é)號(hào)、kc.課程號(hào)等都要在前面的時(shí)候說明一下select * from kc,select distinct 姓名 from xs
不要在太注意中間的exists語句.
把exists和not exists嵌套時(shí)的返回值弄明白
復(fù)制代碼 代碼如下:
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è)子查詢,檢測(cè)行的存在。語法:EXISTS subquery。參數(shù) subquery 是一個(gè)受限的 SELECT 語句 (不允許有 COMPUTE 子句和 INTO 關(guān)鍵字)。結(jié)果類型為 Boolean,如果子查詢包含行,則返回 TRUE。
在子查詢中使用 NULL 仍然返回結(jié)果集
這個(gè)例子在子查詢中指定 NULL,并返回結(jié)果集,通過使用 EXISTS 仍取值為 TRUE。
復(fù)制代碼 代碼如下:
SELECT CategoryName
FROM Categories
WHERE EXISTS (SELECT NULL)
ORDER BY CategoryName ASC
比較使用 EXISTS 和 IN 的查詢
這個(gè)例子比較了兩個(gè)語義類似的查詢。第一個(gè)查詢使用 EXISTS 而第二個(gè)查詢使用 IN。注意兩個(gè)查詢返回相同的信息。
復(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é)號(hào)=xs.學(xué)號(hào) and 課程號(hào)=kc.課程號(hào)
)
把最外層的查詢xs里的數(shù)據(jù)一行一行的做里層的子查詢。
中間的 exists 語句只做出對(duì)上一層的返回 true 或 false,因?yàn)椴樵兊臈l件都在 where 學(xué)號(hào)=xs.學(xué)號(hào) and 課程號(hào)=kc.課程號(hào)這句話里。每一個(gè) exists 都會(huì)有一行值。它只是告訴一層,最外層的查詢條件在這里成立或都不成立,返回的時(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àn)樗皇亲罡邔?,所以還要繼續(xù)向上返回。
select distinct 姓名 from xs where not exists (這里的 exists 語句收到上一個(gè)為 false 的值。他在判斷一下,結(jié)果就是為 true(成立),由于是最高層所以就會(huì)把這行的結(jié)果(這里指的是查詢條件)返回到結(jié)果集。
幾個(gè)重要的點(diǎn):
最里層要用到的醒詢條件的表比如:xs.學(xué)號(hào)、kc.課程號(hào)等都要在前面的時(shí)候說明一下select * from kc,select distinct 姓名 from xs
不要在太注意中間的exists語句.
把exists和not exists嵌套時(shí)的返回值弄明白
相關(guān)文章
SQL?Server實(shí)現(xiàn)group_concat函數(shù)的詳細(xì)舉例
這篇文章主要給大家介紹了關(guān)于SQL?Server實(shí)現(xiàn)group_concat函數(shù)的詳細(xì)舉例,GROUP_CONCAT函數(shù)可以拼接某個(gè)字段值成字符串,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
sql更新語句中update set from用法實(shí)現(xiàn)
本文主要介紹了sql更新語句中update set from用法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
淺析SQL Server中的執(zhí)行計(jì)劃緩存(上)
這篇文章主要介紹了淺析SQL Server中的執(zhí)行計(jì)劃緩存(上)的相關(guān)資料,需要的朋友可以參考下2015-12-12
jdbc連接sql server數(shù)據(jù)庫問題分析
SQL Server連接中問題還真多。不進(jìn)行設(shè)置還真連接不上,這里總結(jié)一下,需要的朋友可以參考2012-12-12
將Excel數(shù)據(jù)導(dǎo)入到SQL?Server數(shù)據(jù)庫的操作指南
這篇文章主要介紹了將Excel數(shù)據(jù)導(dǎo)入到SQL?Server數(shù)據(jù)庫的操作指南,文中通過圖文結(jié)合的方式給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-08-08

