成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SQL Server數據庫中簡單的SELECT TOP

數據庫 SQL Server
我們今天要來談談SQL數據庫中"簡單的"SELECT TOP—可能有你從未注意到的細節,希望對大家有所幫助。

首先從博客園的Jerome Wong網友說起

他提出了一個這樣的問題

本人寫了好幾年SQL語句了,從來沒注意到這件事情。

例如:

數據表如下:

ID  EMPNO  NAME  AGE  

1   26929   Jerome   28
2   28394   Quince  27
3   20983   Green   30
4   27189   Mike     30
5   23167   Arishy   30
6   26371   Yager   29

我寫了SQL語句想取得第3、4筆數據,測試分頁玩的。

  1. select  top 2 * from (select top 4 * from Member ) m    
  2. order by m.RowID desc 

我執行中間那一段子查詢:select top 4 * from Member

取得的是:

1   26929   Jerome   28
2   28394   Quince  27
3   20983   Green   30
4   27189   Mike     30

但是整個SQL語句的結果卻是:

5   23167   Arishy   30
6   26371   Yager   29

真的不知道到底怎么會出現這種情況,請高手指教。

其實不管你是新手還是高手在寫程序當中經常會碰到類似這樣的細節問題

下面我就對Jerome Wong網友所提出的問題針對select top做出一系列的分析(在這里要感謝Jerome Wong網友提出的這個問題)

準備工作 

  1. if object_id('zhuisuo')is not null 
  2. drop table zhuisuo  
  3. go  
  4. create table zhuisuo  
  5. (  
  6. id int null,name varchar(20) null 
  7. )  
  8. insert into zhuisuo values(1,'追索1')  
  9. insert into zhuisuo values(2,'追索2')  
  10. insert into zhuisuo values(3,'追索3')  
  11. insert into zhuisuo values(4,'追索4')  
  12. insert into zhuisuo values(5,'追索5')  
  13. insert into zhuisuo values(6,'追索6')  
  14. insert into zhuisuo values(7,'追索7')  
  15. insert into zhuisuo values(8,'追索8')  
  16. insert into zhuisuo values(9,'追索9')  
  17. insert into zhuisuo values(10,'追索10')  
  18. go 

下面我們來簡單寫兩句Select語句

  1. select top 2 * from (select top 4 * from zhuisuo) m order by m.id desc 
  2. select top 2 * from (select top 4 * from zhuisuo order by id asc) m order by m.id desc 

執行結果大家會發現

平常很多人會認為這兩條語句執行的結果會一樣

怎么會這樣呢?

從這個查詢計劃中大家可以清楚的看到

***種掃描完zhuisuo表后先降序(top N Sort)然后在4行范圍中取前2行

第二種掃描完zhuisuo表后先升序取4行(top N Sort)然后再把這4行降序取2行(top N Sort)

在這里就不得不簡單的說說SQL語句中出現的表子查詢了

表子查詢,而出現在from子句中的表我們稱為派生表

派生表是虛擬的,未被物理具體化,也就是說當編譯的時候

如(select top 2 * from (select top 4 * from zhuisuo) m order by m.id desc )

外部查詢和內部查詢會被合并,并生成一個計劃

這時再看看上面的執行計劃就一目了然了

(注意事項:在派生表里面一般不允許使用order by除非指定了top

也就是說select top 2 * from (select * from zhuisuo order by id asc) m order by m.id desc這句語句是不能執行的)

派生表是個擬表要被外部引用,而order by返回的不是表而是游標.所以只用order by的話是被限制的

然而為什么使用top加order by又可以了

是因為top可以從order by返回的游標里選擇指定數量生成一個表并返回

接下來我再舉例關于top需要注意的細節

1、使用top返回隨機行,很多人會想到用RAND函數從而得到這樣一個語句

  1. select top 4 id,name from zhuisuo order by rand(); 

經過多次查詢后,你會失望的發現它沒有返回隨機行

這是因為每個查詢只調用它一次而不是每行調用它一次

這時我們可以把RAND改為Newid

  1. select top 4 id,name from zhuisuo order by newid(); 

這時就會得到你想要的結果了,在這里我們可以意識到NEWID具有更好的分布特性

2、注意insert中使用top

  1. insert top (4) into zhuisuo  
  2. select * from zhuisuo order by id desc 

很多網友會解釋為把zhuisuo表中***4條插入表

但執行完畢后又會讓你失望了,插入的是最前面的4條

正確的倒敘插入top方法應該是

  1. insert into zhuisuo  
  2. select  top (4) * from zhuisuo order by id desc 

這兩條語句又有什么區別

其實第上面那條語句更本就沒有排序(Top N Sort)

3、有時我想刪除數據表里面時間最近的5條數據怎么辦

delete 和update使用top的時候不能使用order by

現在我們可以這樣來解決

  1. delete zhuisuo  
  2. where id in (select top(5) id from zhuisuo order by id desc)   
  3. update zhuisuo  
  4. set name='追索'+namewhere id in (select top(5) id from zhuisuo order by id desc

這是變相實現Top N sort更新或刪除數據 但這不是***的方法因為這還要根具id去匹配

這時我們可以使用這種方法

  1. with cte_del as(select top(5) *   
  2. from zhuisuo order by id desc)  
  3. delete from cte_del  
  4. with cte_del as 
  5. (select top(5) * from zhuisuo order by id desc)  
  6. update  cte_del set name='追索'+name 

4、top除了這些還有更多的用處,就比如之前我使用Top N sort 加 apply回答過一個網友的問題

如何查詢某用戶近一個月內正確率大于60%的閱讀記錄,每天只顯示符合條件正確率***的那個

在這里我只稍微提一下關于apply 也有很多有意思的細節 今后有時間我會用隨筆形式寫出來

***附上一張關于我用序號表示邏輯查詢處理的步驟 

原文鏈接:http://www.cnblogs.com/zhuisuo/archive/2010/12/23/1914790.html

【編輯推薦】

  1. SQL Server 2000刪除實戰演習
  2. SQL Server存儲過程的命名標準如何進行?
  3. 卸載SQL Server 2005組件的正確順序
  4. 對SQL Server字符串數據類型的具體描述
  5. SQL Server數據類型的種類與應用
責任編輯:彭凡 來源: 博客園
相關推薦

2010-07-06 14:12:58

SQL Server數

2011-08-15 15:40:57

SQL Server 系統數據庫

2010-07-15 17:28:50

SQL Server

2010-06-28 10:06:09

SQL Server數

2010-07-15 15:37:13

SQL Server數

2010-07-08 11:05:14

SQL Server數

2010-07-08 15:55:25

SQL Server

2010-11-10 15:23:55

SQL SERVER

2011-08-25 16:13:31

SQL Server批量替換數據

2010-06-17 13:34:47

SQL Server數

2010-07-08 17:33:21

SQL Server數

2010-07-06 14:40:15

解決SQL Serve

2011-03-24 09:07:11

SQL Server數備份

2011-03-24 09:24:08

SQL Server數還原

2011-03-24 09:45:34

SQL Server數恢復

2010-07-06 15:22:00

SQL Server

2010-07-01 14:18:09

SQL Server數

2010-07-06 09:44:51

SQL Server數

2010-07-09 11:28:12

SQL Server數

2009-06-03 10:51:59

連接SQL數據庫Adobe Dream
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产免费看 | 97超碰免费 | 欧美成人a| 91精品国产日韩91久久久久久 | 久久88 | 一级一级毛片免费看 | 亚洲在线一区二区 | 日韩一二区 | 天堂一区二区三区 | 亚洲专区在线 | 久久国产精品免费一区二区三区 | 九九综合九九 | 视频一区二区中文字幕 | 亚洲福利 | 国产91成人 | 午夜男人天堂 | 欧美一区二区三区久久精品 | 免费午夜视频 | 欧美aⅴ片 | 国产分类视频 | 久久精品国产一区老色匹 | 天天综合久久 | 国产色网| 黄网站免费在线看 | 国产欧美一区二区三区久久人妖 | 久久99精品久久久久久琪琪 | 日本中文字幕视频 | 一级全黄视频 | 97超碰在线免费 | 国产精品久久久久久久久久久免费看 | 国产欧美一区二区久久性色99 | 成人深夜福利 | 亚洲电影一级片 | 一区二区在线不卡 | 日本激情一区二区 | 日本精品视频 | 日韩高清一区 | 伊人在线 | 91操操操| 黄色毛片一级 | 日本在线精品视频 |