国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQL Server > 正文

SQL中exists的使用方法

2024-08-31 00:58:00
字體:
來源:轉載
供稿:網友
有一個查詢如下:

復制代碼 代碼如下:


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嵌套時的返回值弄明白
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 客服| 唐山市| 赫章县| 洛扎县| 中山市| 正蓝旗| 盈江县| 屯门区| 淮南市| 府谷县| 临漳县| 章丘市| 广河县| 砚山县| 丹巴县| 潮安县| 安西县| 茂名市| 应城市| 区。| 洞口县| 鄂托克旗| 阿坝| 宿松县| 广昌县| 四会市| 蕉岭县| 罗城| 石河子市| 台前县| 海林市| 巴彦淖尔市| 开原市| 卢龙县| 涟源市| 土默特左旗| 治县。| 江山市| 蒙城县| 元江| 青海省|