IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置:首頁數(shù)據(jù)庫MSSQL → 如何巧妙利用SQL Server的EXISTS結(jié)構(gòu)

如何巧妙利用SQL Server的EXISTS結(jié)構(gòu)

時間:2015/6/28來源:IT貓撲網(wǎng)作者:網(wǎng)管聯(lián)盟我要評論(0)

有件東西我觀察了很多年,那就是很少有開發(fā)者會去使用sql server中的一個非常有用的東西——EXISTS結(jié)構(gòu)。你可以在各種情況中用到EXISTS結(jié)構(gòu),在這篇文章中我會向大家介紹其中的一些。

EXISTS結(jié)構(gòu)

EXISTS結(jié)構(gòu)是一個TSQL函數(shù),這個函數(shù)會就圓括號中的子查詢返回一個布爾變量。如果子查詢返回了任意行的話,這個結(jié)構(gòu)就返回真;否則,它就返回假。這個結(jié)構(gòu)特別適用于查詢表中是否存在某些記錄。它也非常適合來決定是否在表中運(yùn)行更新或者插入語句(在這篇文章中,隨后我將向大家介紹)。

Listing A中創(chuàng)建了一個表并插入了一些數(shù)據(jù),這樣你就可以利用這張表來看看EXISTS結(jié)構(gòu)是如何工作的了。Listing B中的腳本使用EXISTS結(jié)構(gòu)在SalesHistory表中檢查每一行,并根據(jù)已存在的行得到一個變量。這個腳本將返回1(真),這意味著SalesHistory表包含你所要查詢的行。

在這種情況下,一旦在SalesHistory表中找到了一條記錄,EXISTS結(jié)構(gòu)就不會繼續(xù)查找,并馬上返回1。使用EXISTS結(jié)構(gòu)額外的好處就是,一旦它找到滿足條件的記錄,就會立即返回。

Listing C與上面的腳本類似,但是它的返回值是0,因?yàn)樵谶@個條件下,EXISTS條件不滿足。

由于EXISTS結(jié)構(gòu)的工作原理,所以下面的語句所實(shí)現(xiàn)的功能是一樣的。


SELECT * FROM SalesHistory

WHERE EXISTS(SELECT NULL)

SELECT * FROM SalesHistory

WHERE 1 = 1

SELECT * FROM SalesHistory

WHERE EXISTS(SELECT 1)

在剛才的腳本中,你可能會對下面的語句感到迷惑:

SELECT * FROM SalesHistory

WHERE EXISTS(SELECT NULL)
 

因?yàn)镹ULL在數(shù)據(jù)庫中是一個值(它是一個未知的值),在出現(xiàn)NULL值的地方EXISTS結(jié)構(gòu)都將返回真。

開發(fā)者很少使用EXISTS對子查詢進(jìn)行操作。下面的查詢將返回同樣的結(jié)果集,雖然它們的結(jié)構(gòu)不同。第一個查詢使用了EXISTS的相關(guān)子查詢,第二查詢在SalesHistory表中,將SalePrice字段與該字段的總平均值進(jìn)行比較。


SELECT * FROM SalesHistory sh

WHERE EXISTS

(
      SELECT avg(SalePrice)

      FROM SalesHistory shi

      HAVING AVG(SalePrice) > sh.SalePrice
)
SELECT * FROM SalesHistory sh

WHERE SalePrice <

(
      SELECT AVG(SalePrice)

      FROM SalesHistory shi
)

你可以使用EXISTS操作來決定,是否對某一個單獨(dú)的記錄使用UPDATE或者INSERT語句,就像下面的例子一樣:


IF EXISTS

(

      SELECT * FROM SalesHistory

      WHERE SaleDate = '1/1/2001' AND

      Product = 'Computer' AND

      SalePrice = 1000

)

      UPDATE TOP(1) SalesHistory

      SET SalePrice = 1100

      WHERE SaleDate = '1/1/2001' AND

      Product = 'Computer' AND

      SalePrice = 1000
ELSE
      INSERT INTO SalesHistory

      (Product, SaleDate, SalePrice)

      VALUES

      ('Computer', '1/1/2001', 1100)
 

雖然在實(shí)際的環(huán)境中,你可能不會用到這里所介紹的例子,但是它們給你演示了如何利用EXISTS結(jié)構(gòu)來決定使用哪種DML類型。


給它一個機(jī)會

下次,當(dāng)你寫查詢語句的時候,請記住要使用EXISTS結(jié)構(gòu)。它很容易掌握,使用也很方便,并且能在程序中給你提供很多便利。

關(guān)鍵詞標(biāo)簽:SQL Server,EXISTS結(jié)構(gòu)

相關(guān)閱讀

文章評論
發(fā)表評論

熱門文章 SqlServer2005對現(xiàn)有數(shù)據(jù)進(jìn)行分區(qū)具體步驟SqlServer2005對現(xiàn)有數(shù)據(jù)進(jìn)行分區(qū)具體步驟sql server系統(tǒng)表損壞的解決方法sql server系統(tǒng)表損壞的解決方法MS-SQL2005服務(wù)器登錄名、角色、數(shù)據(jù)庫用戶MS-SQL2005服務(wù)器登錄名、角色、數(shù)據(jù)庫用戶Access、SQL Server、Oracle常見應(yīng)用的區(qū)別Access、SQL Server、Oracle常見應(yīng)用的區(qū)別

相關(guān)下載

人氣排行 如何遠(yuǎn)程備份(還原)SQL2000數(shù)據(jù)庫SQL2000數(shù)據(jù)庫遠(yuǎn)程導(dǎo)入(導(dǎo)出)數(shù)據(jù)配置和注冊O(shè)DBC數(shù)據(jù)源-odbc數(shù)據(jù)源配置教程SQL2000和SQL2005數(shù)據(jù)庫服務(wù)端口查看或修改SQL Server 2005降級到2000的正確操作步驟修改Sql Server唯一約束教程淺談JSP JDBC來連接SQL Server 2005的方法SQL Server創(chuàng)建表語句介紹