『壹』 sql中的游標是幹嘛的
游標(cursor)是結果集的邏輯擴展,可以看做指向結果集的一個指針,通過使用游標,應用程序可以逐行訪問並處理結果集。
ResultSet對象用於接收查詢結果,next()方法用於判斷結果集是否為空,相當於指針,指向結果集下一個數據。
(1)sql游標和select擴展閱讀:
游標的生命周期包含有五個階段:聲明游標、打開游標、讀取游標數據、關閉游標、釋放游標。
1、聲明游標語法
DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR UPDATE [ OF column_name [ ,...n ] ] ]
2、打開游標語法
open [ Global ] cursor_name | cursor_variable_name
3、讀取游標數據語法
Fetch[ [Next|prior|Frist|Last|Absoute n|Relative n ]from ][Global] cursor_name[into @variable_name[,....]]
4、關閉游標語法
close [ Global ] cursor_name | cursor_variable_name
5、釋放游標語法
deallocate cursor_name
『貳』 SQL中什麼時候需要使用游標使用游標的步驟
游標一般用於把通過腳本得到的結果集的內容在用於其它的SQL語句中。但是游標執行會影響腳本執行速度,所以使用時請慎重。 在存儲過程或觸發器中使用 SQL 游標的典型過程為: 聲明SQL 變數包含游標返回的數據。為每個結果集列聲明一個變數。聲明足夠大的變數來保存列返回的值,並聲明變數的類型為可從列數據類型隱式轉換得到的數據類型。
使用 DECLARE CURSOR 語句將 SQL 游標與 SELECT 語句相關聯。另外,DECLARE CURSOR 語句還定義游標的特性,例如游標名稱以及游標是只讀還是只進。
使用 OPEN 語句執行 SELECT 語句並填充游標。
使用 FETCH INTO 語句提取單個行,並將每列中的數據移至指定的變數中。然後,其他 SQL 語句可以引用那些變數來訪問提取的數據值。SQL 游標不支持提取行塊。
使用 CLOSE 語句結束游標的使用。關閉游標可以釋放某些資源,例如游標結果集及其對當前行的鎖定,但如果重新發出一個 OPEN 語句,則該游標結構仍可用於處理。由於游標仍然存在,此時還不能重新使用該游標的名稱。DEALLOCATE 語句則完全釋放分配給游標的資源,包括游標名稱。釋放游標後,必須使用 DECLARE 語句來重新生成游標。
『叄』 SQL中的指針和游標怎麼理解
windows或DOS的「游標」不同,MS-SQL的游標是一種臨時的資料庫對象,既對可用來旋轉儲存在系統永久表中的數據行的副本,也可以指向儲存在系統永久表中的數據行的指針。
游標為您提供了在逐行的基礎上而不是一次處理整個結果集為基礎的操作表中數據的方法。 1.如何使用游標 1)定義游標語句 Declare <游標名> Cursor For
2)創建游標語句 Open <游標名>
3)提取游標列值、移動記錄指針 Fetch <列名列表> From <游標名> [Into <變數列表>]
4)使用@@Fetch_Status利用While循環處理游標中的行
5)刪除游標並釋放語句 Close <游標名>/Deallocate <游標名>
6)游標應用實例 --定義游標
Declare cur_Depart Cursor
For Select cDeptID,cDeptName From Department into @DeptID,@DeptName
--創建游標
Open cur_Depart
--移動或提取列值
Fetch From cur_Depart into @DeptID,@DeptName
--利用循環處理游標中的列值
While @@Fetch_Status=0
Begin
Print @DeptID,@DeptName
Fetch From cur_Depart into @DeptID,@DeptName
End
--關閉/釋放游標
Close cur_Depart
Deallocate cur_Depart2.語句的詳細及注意 1)定義游標語句 Declare <游標名> [Insensitive] [Scroll] Cursor
For <Select 語句> [FOR {Read Only | Update [ OF <列名列表>]}] Insensitive DBMS創建查詢結果集數據的臨時副本(而不是使用直接引用資料庫表中的真實數據行中的列)。游標是Read Only,也就是說不能修改其內容或底層表的內容; Scroll 指定游標支持通過使用任意Fetch 選項(First Last Prior Next Relative Absolute)選取它的任意行作為當前行。如果此項省略,則游標將只支持向下移動單行(即只支持游標的Fetch Next); Select語句 定義游標結果集的標准 SELECT 語句。在游標聲明的 <Select語句>內不允許使用關鍵字 COMPUTE、COMPUTE BY、FOR BROWSE 和 INTO; Read Only 防止使用游標的用戶通過更新數據或刪除行改變游標的內容; Update 創建可更新游標且列出值能被更新的游標列。如果子句中列入了任意列,則只有被列入的列才能被更新。如果Declare Cursor語句中只指定的UPDATE(沒有列名列表),則游標將允許更新它的任何或所有列。
Declare cur_Depart Cursor
For Select * From Department For Update OF cDeptID,cDeptName 2)提取游標列值、移動記錄指針語句 Fetch [Next | Prior | First | Last | {Absolute <行號>} | {Relative <行號>}]
From <游標名> [Into <變數列表……>] 每次執行Fetch語句時,DBMS移到游標中的下一行並把游標中的列值獲取到Into中列出的變數中。因此Fetch語句的Into子句中列出的變數必須與游標定義中Select 語句中的列表的類型與個數相對應; 僅當定義游標時使用Scroll參數時,才能使用Fetch語句的行定位參數(First Last Prior Next Relative Absolute);如果Fetch語句中不包括參數Next | Prior | First | Last,DBMS將執行默認的Fetch Next; Next 向下、向後移動一行(記錄); Prior 向上、向前移動一行(記錄); First 移動至結果集的第一行(記錄); Last 移動至結果集的最後一行(記錄); Absolute n 移動到結果集中的第n行。如果n是正值,DBMS從結果集的首部向後或向下移動至第n行;如果n是負數,則DBMS從結果集的底部向前或向上移動n行;
Fetch Absolute 2 From cur_Depart Into @DeptID,@DeptName Relative n 從指針的當前位置移動n行。如果n是正值,DBMS將行指針向後或向下移動至第n行;如果n是負數,則DBMS將行指針向前或向上移動n行;
Fetch Relative 2 From cur_Depart Into @DeptID,@DeptName 3)基於游標的定位DELETE/UPDATE語句 如果游標是可更新的(也就是說,在定義游標語句中不包括Read Only 參數),就可以用游標從游標數據的源表中DELETE/UPDATE行,即DELETE/UPDATE基於游標指針的當前位置的操作;
舉例: --刪除當前行的記錄
Declare cur_Depart Cursor
For Select cDeptID,cDeptName From Department into @DeptID,@DeptName
Open cur_Depart
Fetch From cur_Depart into @DeptID,@DeptName
Delete From Department Where CURRENT OF cur_Depart --更新當前行的內容
Declare cur_Depart Cursor
For Select cDeptID,cDeptName From Department into @DeptID,@DeptName
Open cur_Depart
Fetch From cur_Depart into @DeptID,@DeptName
Update Department Set cDeptID=』2007』 + @DeptID Where CURRENT OF cur_Depart3.游標使用技巧及注意 1)利用Order By改變游標中行的順序。此處應該注意的是,只有在查詢的中Select 子句中出現的列才能作為Order by子句列,這一點與普通的Select語句不同;
2)當語句中使用了Order By子句後,將不能用游標來執行定位DELETE/UPDATE語句;如何解決這個問題,首先在原表上創建索引,在創建游標時指定使用此索引來實現;例如:
Declare cur_Depart Cursor
For Select cDeptID,cDeptName From Department With INDEX(idx_ID)
For Update Of cDeptID,cDeptName
通過在From子句中增加With Index來實現利用索引對表的排序;
3)在游標中可以包含計算好的值作為列;
4)利用@@Cursor_Rows確定游標中的行數;
『肆』 資料庫基礎詳解:存儲過程、視圖、游標、SQL語句優化以及索引
寫在文章前:本系列文章用於博主自己歸納復習一些基礎知識,同時也分享給可能需要的人,因為水平有限,肯定存在諸多不足以及技術性錯誤,請大佬們及時指正。
存儲過程 是事先經過編譯並存儲在資料庫中的一段SQL語句的集合。想要實現相應的功能時,只需要調用這個存儲過程就行了(類似於函數,輸入具有輸出參數)。
優點 :
缺點 :
Delete用來刪除表的全部或者部分數據,執行delete之後,用戶需要提交之後才會執行,會觸發表上的DELETE觸發器(包含一個OLD的虛擬表,可以只讀訪問被刪除的數據),DELETE之後表結構還在,刪除很慢,一行一行地刪,因為會記錄日誌,可以利用日誌還原數據;
Truncate刪除表中的所有數據,這個操作不能回滾,也不會觸發這個表上的觸發器。操作比DELETE快很多(直接把表drop掉,再創建一個新表,刪除的數據不能找回)。如果表中有自增(AUTO_INCREMENT)列,則重置為1。
Drop命令從資料庫中刪除表,所有的數據行,索引和約束都會被刪除。不能回滾,不會觸發觸發器。
觸發器(TRIGGER)是由事件(比如INSERT/UPDATE/DELETE)來觸發運行的操作(不能被直接調用,不能接收參數)。在資料庫里以獨立的對象存儲,用於保證數據完整性(比如可以檢驗或轉換數據)。
約束(Constraint)類型:
從資料庫的基本表中通過查詢選取出來的數據組成的虛擬表(資料庫中只存放視圖的定義,而不存放視圖的數據)。可以對其進行增/刪/改/查等操作。視圖是對若干張基本表的引用,一張虛表,查詢語句執行的結果,不存儲具體的數據(基本表數據發生了改變,視圖也會跟著改變)。
可以跟基本表一樣,進行增刪改查操作( 增刪改操作有條件限制,一般視圖只允許查詢操作 ),對視圖的增刪改也會影響原表的數據。 它就像一個窗口,透過它可以看到資料庫中自己感興趣的數據並且操作它們。 好處:
用於定位在查詢返回的結果集的特定行,以對特定行進行操作。使用游標可以方便地對結果集進行移動遍歷,根據需要滾動或對瀏覽/修改任意行中的數據。主要用於互動式應用。它是一段私有的SQL工作區,也就是一段內存區域,用於暫時存放受SQL語句影響的數據,簡單來說,就是將受影響的數據暫時放到了一個內存區域的虛表當中,這個虛表就是游標。
游標是一種能從包括多條數據記錄的結果集中每次提取一條記錄的機制。即游標用來逐行讀取結果集。游標充當指針的作用。盡管游標能遍歷結果中的所有行,但他一次只指向一行。
游標的一個常見用途就是保存查詢結果,以便以後使用。游標的結果集是由SELECT語句產生,如果處理過程需要重復使用一個記錄集,那麼創建一次游標而重復使用若干次,比重復查詢資料庫要快的多。通俗來說,游標就是能在sql的查詢結果中,顯示某一行(或某多行)數據,其查詢的結果不是數據表,而是已經查詢出來的結果集。
簡單來說:游標就是在查詢出的結果集中進行選擇性操作的工具。
讓緩存更高效。對於連接查詢,如果其中一個表發生變化,那麼整個查詢緩存就無法使用。而分解後的多個查詢,即使其中一個表發生變化,對其它表的查詢緩存依然可以使用。分解成多個單表查詢,這些單表查詢的緩存結果更可能被其它查詢使用到,從而減少冗餘的查詢。減少鎖競爭。
索引是對資料庫表中一列或多列的值進行排序的一種結構(說明是在列上建立的),使用索引可快速訪問資料庫表中的特定信息。如果想按特定職員的姓來查找他或她,則與在表中搜索所有的行相比,索引有助於更快地獲取信息。索引的一個主要目的就是加快檢索表中數據,亦即能協助信息搜索者盡快的找到符合限制條件的記錄ID的輔助數據結構。
當表中有大量記錄時,若要對表進行查詢,第一種搜索信息方式是全表搜索,是將所有記錄一一取出,和查詢條件進行一一對比,然後返回滿足條件的記錄,這樣做會消耗大量資料庫系統時間,並造成大量磁碟I/O操作。第二種就是在表中建立索引,然後在索引中找到符合查詢條件的索引值,最後通過保存在索引中的ROWID(相當於頁碼)快速找到表中對應的記錄。
例如這樣一個查詢:select * from table1 where id=10000。如果沒有索引,必須遍歷整個表,直到ID等於10000的這一行被找到為止。有了索引之後(必須是在ID這一列上建立的索引),即可在索引中查找。由於索引是經過某種演算法優化過的,因而查找次數要少的多。可見,索引是用來定位的。
從應用上分, 主鍵索引(聚集) , 唯一索引(聚集/非聚集) , 普通索引 , 組合索引 , 單列索引和全文索引
『伍』 sql 游標
CREATETABLExiaoshou(
saleyearintPRIMARYKEY,
nowsaledecimal(6,2),
totalsaledecimal(6,2)
);
GO
INSERTINTOxiaoshou(saleyear,nowsale)
SELECT2000,45.23UNIONALL
SELECT2001,56.98UNIONALL
SELECT2002,58.32UNIONALL
SELECT2003,40.67UNIONALL
SELECT2004,60.00UNIONALL
SELECT2005,45.05;
GO
BEGIN
declare@saleyearINT;
declare@uppersaledecimal(6,2);
declare@totalsaledecimal(6,2);
SET@totalsale=0;
--定義游標.(方向向前,可更新,按時間排序)
declarexiaoshou_cursorcursorfor
selectsaleyear,
FORUPDATE;
openxiaoshou_cursor;
fetchNEXTfromxiaoshou_cursorinto@saleyear,@uppersale;
while(@@FETCH_STATUS=0)
begin
--遞增總金額.
SET@totalsale=@totalsale+@uppersale;
--更新數據.
updatexiaoshousettotalsale=@totalsale
WHERE
CURRENTOFxiaoshou_cursor;
fetchnextfromxiaoshou_cursorinto@saleyear,@uppersale;
end
closexiaoshou_cursor
deallocatexiaoshou_cursor
END
GO
SELECT*FROMxiaoshou
GO
saleyearnowsale游核穗畝totalsale
-------------------神族掘---------
200045.2345.23
200156.98102.21
200258.32160.53
200340.67201.20
200460.00261.20
200545.05306.25
(6行受影響)