SQL中Exists的用法實例詳解
這篇文章主要介紹了SQL中Exists的用法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
比如在Northwind資料庫中有一個查詢為
SELECT c.CustomerId,CompanyName FROM Customers c WHERE EXISTS( SELECT OrderID FROM Orders o WHERE o.CustomerID=c.CustomerID)
這裡面的EXISTS是如何運作呢?子查詢回傳的是OrderId字段,可是外面的查詢要找的是CustomerID和CompanyName字段,這兩個字段肯定不在OrderID裡面啊,這是如何匹配的呢?
EXISTS用於檢查子查詢是否至少會傳回一行數據,該子查詢實際上並不會傳回任何數據,而是傳回值True或False
EXISTS 指定子查詢,偵測行的存在。
語法: EXISTS subquery
參數: subquery 是受限的 SELECT 語句 (不允許有 COMPUTE 子句和 INTO 關鍵字)。
結果類型: Boolean 如果子查詢包含行,則傳回 TRUE ,否則傳回 FLASE 。
範例表A:TableIn 範例表B:TableEx
#(一). 在子查詢中使用NULL 仍然傳回結果集
select * from TableIn where exists(select null)
等同於: select * from TableIn
(二). 比較使用EXISTS 和IN 的查詢。注意兩個查詢傳回相同的結果。
select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME) select * from TableIn where ANAME in(select BNAME from TableEx)
(三). 比較使用 EXISTS 和 = ANY 的查詢。注意兩個查詢傳回相同的結果。
select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME) select * from TableIn where ANAME=ANY(select BNAME from TableEx)
NOT EXISTS 的作用與 EXISTS 正好相反。如果子查詢沒有回傳行,則滿足了 NOT EXISTS 中的 WHERE 子句。
結論:
EXISTS(包括 NOT EXISTS )子句的回傳值是一個BOOL值。 EXISTS內部有一個子查詢語句(SELECT ... FROM...), 我稱之為EXIST的內查詢語句。其內查詢語句傳回一個結果集。 EXISTS子句根據其內查詢語句的結果集空或非空,傳回一個布林值。
一種通俗的可以理解為:將外查詢表的每一行,代入內查詢作為檢驗,如果內查詢傳回的結果取非空值,則EXISTS子句傳回TRUE,這一行可作為外查詢的結果行,否則不能作為結果。
分析器會先看語句的第一個字,當它發現第一個字是SELECT關鍵字的時候,它會跳到FROM關鍵字,然後透過FROM關鍵字找到表名並把錶裝入內存。接著是找WHERE關鍵字,如果找不到就回到SELECT找欄位解析,如果找到WHERE,則分析其中的條件,完成後再回到SELECT分析欄位。最後形成一張我們要的虛表。
WHERE關鍵字後面的是條件式。條件式計算完成後,會有一個回傳值,即非0或0,非0即為真(true),0即為假(false)。同理WHERE後面的條件也有一個回傳值,真或假,來確定接下來執不執行SELECT。
分析器先找到關鍵字SELECT,然後跳到FROM關鍵字將STUDENT表匯入內存,並透過指標找到第一筆記錄,接著找到WHERE關鍵字計算它的條件表達式,如果為真那麼把這條記錄裝到一個虛表當中,指標再指向下一筆記錄。如果為假那麼指標直接指向下一筆記錄,而不進行其它操作。一直檢索完整個表,並把檢索出來的虛擬表回傳給使用者。 EXISTS是條件表達式的一部分,它也有一個回傳值(true或false)。
在插入記錄前,需要檢查這條記錄是否已經存在,只有當記錄不存在時才執行插入操作,可以透過使用 EXISTS 條件句來防止插入重複記錄。
INSERT INTO TableIn (ANAME,ASEX) SELECT top 1 '张三', '男' FROM TableIn WHERE not exists (select * from TableIn where TableIn.AID = 7)
EXISTS與IN的使用效率的問題,通常情況下採用exists要比in效率高,因為IN不走索引,但要看實際情況具體使用:
IN適合於外表大而內表小的情況;EXISTS適合外表小而內表大的情況。
以上是SQL中Exists的用法實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

HQL和SQL在Hibernate框架中進行比較:HQL(1.物件導向語法,2.資料庫無關的查詢,3.類型安全),而SQL直接操作資料庫(1.與資料庫無關的標準,2.可執行複雜查詢和資料操作)。

《OracleSQL中除法運算的用法》在OracleSQL中,除法運算是常見的數學運算之一。在資料查詢和處理過程中,除法運算可以幫助我們計算欄位之間的比例或得出特定數值的邏輯關係。本文將介紹OracleSQL中除法運算的用法,並提供具體的程式碼範例。一、OracleSQL中除法運算的兩種方式在OracleSQL中,除法運算可以用兩種不同的方式來進行

Oracle和DB2是兩個常用的關聯式資料庫管理系統,它們都有自己獨特的SQL語法和特性。本文將針對Oracle和DB2的SQL語法進行比較與區別,並提供具體的程式碼範例。資料庫連接在Oracle中,使用以下語句連接資料庫:CONNECTusername/password@database而在DB2中,連接資料庫的語句如下:CONNECTTOdataba

MyBatis動態SQL標籤解讀:Set標籤用法詳解MyBatis是一個優秀的持久層框架,它提供了豐富的動態SQL標籤,可以靈活地建構資料庫操作語句。其中,Set標籤是用來產生UPDATE語句中SET子句的標籤,在更新作業中非常常用。本文將詳細解讀MyBatis中Set標籤的用法,以及透過具體的程式碼範例來示範其功能。什麼是Set標籤Set標籤用於MyBati

JSP註解的分類及用法解析JSP註解分為兩種:單行註解:以結尾,只能註解單行程式碼。多行註解:以/*開頭,以*/結尾,可以註解多行程式碼。單行註解範例多行註解範例/**這是一段多行註解*可以註解多行程式碼*/JSP註解的用法JSP註解可以用來註解JSP程式碼,使其更易於閱

SQL中的Identity是什麼,需要具體程式碼範例在SQL中,Identity是一種用於產生自增數字的特殊資料類型,它常用於唯一識別表中的每一行資料。 Identity欄位通常與主鍵列搭配使用,可確保每筆記錄都有獨一無二的識別碼。本文將詳細介紹Identity的使用方式以及一些實際的程式碼範例。 Identity的基本使用方式在建立表格時,可以使用Identit

解決方法:1、檢查登入使用者是否具有足夠的權限來存取或操作該資料庫,確保該使用者俱有正確的權限;2、檢查SQL Server服務的帳戶是否具有存取指定檔案或資料夾的權限,確保該帳戶具有足夠的權限來讀取和寫入該文件或資料夾;3、檢查指定的資料庫文件是否已被其他進程打開或鎖定,嘗試關閉或釋放該文件,並重新運行查詢;4、嘗試以管理員身份運行Management Studio等等。

WPS是一款常用的辦公室軟體套件,其中的WPS表格功能被廣泛用於資料處理和計算。在WPS表格中,有一個非常有用的函數,即DATEDIF函數,它用於計算兩個日期之間的時間差。 DATEDIF函數是英文單字DateDifference的縮寫,它的語法如下:DATEDIF(start_date,end_date,unit)其中,start_date表示起始日期
