❶ 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行受影響)
❷ sql的執行順序 與 游標
最近項目中使用了很多大sql,在編碼時sql經常出現執行錯誤,記錄下sql的執行順序,在編碼時就考慮全面,省的之後還要繼續花時間進行試驗調試。
(8)SELECT (9)DISTINCT (11)<Top Num> <select list>
(1)FROM [left_table]
(3)<join_type> JOIN <right_table>
(2)ON <join_condition>
(4)WHERE <where_condition>
(5)GROUP BY <group_by_list>
(6)WITH <CUBE | RollUP>
(7)HAVING <having_condition>
(10)ORDER BY <order_by_list>
1.FROM: 對FROM子句中的前兩個表執行笛卡爾積(Cartesian proct)(交叉聯接),生成虛擬表VT1
2.ON: 對VT1應用ON篩選器。只有那些使為真的行才被插入VT2。
3.OUTER(JOIN): 如 果指定了OUTER JOIN(相對於CROSS JOIN 或(INNER JOIN),保留表(preserved table:左外部聯接把左表標記為保留表,右外部聯接把右表標記為保留表,完全外部聯接把兩個表都標記為保留表)中未找到匹配的行將作為外部行添加到 VT2,生成VT3.如果FROM子句包含兩個以上的表,則對上一個聯接生成的結果表和下一個表重復執行步驟1到步驟3,直到處理完所有的表為止。
4.WHERE: 對VT3應用WHERE篩選器。只有使為true的行才被插入VT4.
5.GROUP BY: 按GROUP BY子句中的列列表對VT4中的行分組,生成VT5.
6.CUBE|ROLLUP: 把超組(Suppergroups)插入VT5,生成VT6.
7.HAVING: 對VT6應用HAVING篩選器。只有使為true的組才會被插入VT7.
8.SELECT: 處理SELECT列表,產生VT8.
9.DISTINCT: 將重復的行從VT8中移除,產生VT9.
10.ORDER BY: 將VT9中的行按ORDER BY 子句中的列列表排序,生成游標(VC10).
11.TOP: 從VC10的開始處選擇指定數量或比例的行,生成表VT11,並返回調用者。
註:步驟10,按ORDER BY子句中的列列表排序上步返回的行,返回遊標VC10.這一步是第一步也是唯一一步可以使用SELECT列表中的列別名的步驟。這一步不同於其它步驟的 是,它不返回有效的表,而是返回一個游標。SQL是基於集合理論的。集合不會預先對它的行排序,它只是成員的邏輯集合,成員的順序無關緊要。對表進行排序 的查詢可以返回一個對象,包含按特定物理順序組織的行。ANSI把這種對象稱為游標。理解這一步是正確理解SQL的基礎。
因為這一步不返回表(而是返回遊標),使用了ORDER BY子句的查詢不能用作表表達式。表表達式包括:視圖、內聯表值函數、子查詢、派生表和共用表達式。它的結果必須返回給期望得到物理記錄的客戶端應用程序。例如,下面的派生表查詢無效,並產生一個錯誤:select * from(select orderid,customerid from orders order by orderid) as d
在SQL中,表表達式中不允許使用帶有ORDER BY子句的查詢,而在T—SQL中卻有一個例外(應用TOP選項)。所以要記住,不要為表中的行假設任何特定的順序。換句話說,除非你確定要有序行,否則不要指定ORDER BY 子句。排序是需要成本的,SQL Server需要執行有序索引掃描或使用排序運行符。
參考:
https://www.cnblogs.com/knowledgesea/p/3699851.html
https://www.cnblogs.com/
❸ 如何使用SQL Server游標
關閉游標的語句很簡單:CLOSE CustomerCursor; 使用Where子句子 我們可以動態地定義游標中的Where子句的參數,例如在本例中我們是直接定義了查詢省份是北京的記錄,但也許在應用中我們要使用一個下拉式列表框,由用戶來選擇要查詢的省份,我們該怎樣做呢? 我們在前面曾經提到過,DECLARE語句的作用只是定義一個游標,在OPEN語句中這個游標才會真正地被執行。了解了這些,我們就可以很方便地實現這樣的功能,在DECLARE的Where子句中加入變數作參數,如下所示:DECLARE CustomerCursor CURSORFORSELCECT acct_no,name,balance FROM customer WHERE province=:ls_province; ∥定義ls_province的值 OPEN CustomerCursor; 游標的類型 同其它變數一樣,我們也可以定義游標的訪問類型:全局、共享、實例或局部,游標變數的命名規范建議也同其它變數一樣。--聲明游標declare my_cursor cursor keyset forselect*from info --刪除游標資源deallocate my_cursor --打開游標,在游標關閉或刪除前都有效open my_cursor --關閉游標close my_cursor --聲明局部變數declare@idint,@namevarchar(20),@addressvarchar(20) --定位到指定位置的記錄fetch absolute 56488from my_cursor into@id,@name,@addressselect@idas id,@nameas name,@addressas address --定位到當前記錄相對位置記錄fetch relative -88from my_cursor into@id,@name,@addressselect@idas id,@nameas name,@addressas address --定位到當前記錄前一條fetch prior from my_cursor into@id,@name,@addressselect@idas id,@nameas name,@addressas address --定位到當前記錄後一條fetchnextfrom my_cursor into@id,@name,@addressselect@idas id,@nameas name,@addressas address --定位到首記錄fetch first from my_cursor into@id,@name,@addressselect@idas id,@nameas name,@addressas address --定位到尾記錄fetch last from my_cursor into@id,@name,@addressselect@idas id,@nameas name,@addressas address 實例:use database1 declare my_cursor cursor scroll dynamic /**//*scroll表示可隨意移動游標指 針(否則只能向前),dynamic表示可以讀寫游標(否則游標只讀)*/forselect proctname from proct open my_cursor declare@pname sysname fetchnextfrom my_cursor into@pnamewhile(@@fetch_status=0) begin print'Proct Name: '+@pname fetchnextfrom my_cursor into@pname endfetch first from my_cursor into@pnameprint@pname/**//*update proct set proctname='zzg' where current of my_cursor *//**//*delete from proct where current of my_cursor */close my_cursor deallocate my_cursor 4.游標的高級技巧 盡管目前基於SQL語句的後台資料庫所支持的語言都大致相當,但對游標的支持卻有著一些差異,例如對滾動游標支持。所謂滾動游標,就是程序員可以指定游標向前後任意一個方向滾動。如在Informix中,您甚至還可以將游標滾向結果集開頭或末尾,使用的語句分別是FETCH FIRST,FETCH LAST、FETCH PRIOR和FETCH NEXT。當程序員用FETCH語句,其預設是指FETCH NEXT。由於滾動是在資料庫後台實現的,所以滾動游標為用戶編程提供了極大的方便。 對游標支持的另一個不同是可修改游標。上述游標的使用都是指只讀游標,而象Oracle、Sybase等資料庫卻另外支持可作修改的游標。使用這樣的資料庫,您可以修改或刪除當前游標所在的行。例如修改當前游標所在行的用戶的余額,我們可以如下操作:UPDATE customer SET balance=1000WHERECURRENTof customerCursor; 刪除當前行的操作如下: WHERECURRENTOF CustomerCursor; 但是如果您當前使用的資料庫是Sybase,您需要修改資料庫的參數,將游標可修改的值定為1,才能執行上述操作。這一賦值在連接資料庫的前後進行均可。
❹ SQL中什麼時候需要使用游標使用游標的步驟
游標一般用於把通過腳本得到的結果集的內容在用於其它的SQL語句中。但是游標執行會影響腳本執行速度,所以使用時請慎重。 在存儲過程或觸發器中使用 SQL 游標的典型過程為: 聲明SQL 變數包含游標返回的數據。為每個結果集列聲明一個變數。聲明足夠大的變數來保存列返回的值,並聲明變數的類型為可從列數據類型隱式轉換得到的數據類型。
使用 DECLARE CURSOR 語句將 SQL 游標與 SELECT 語句相關聯。另外,DECLARE CURSOR 語句還定義游標的特性,例如游標名稱以及游標是只讀還是只進。
使用 OPEN 語句執行 SELECT 語句並填充游標。
使用 FETCH INTO 語句提取單個行,並將每列中的數據移至指定的變數中。然後,其他 SQL 語句可以引用那些變數來訪問提取的數據值。SQL 游標不支持提取行塊。
使用 CLOSE 語句結束游標的使用。關閉游標可以釋放某些資源,例如游標結果集及其對當前行的鎖定,但如果重新發出一個 OPEN 語句,則該游標結構仍可用於處理。由於游標仍然存在,此時還不能重新使用該游標的名稱。DEALLOCATE 語句則完全釋放分配給游標的資源,包括游標名稱。釋放游標後,必須使用 DECLARE 語句來重新生成游標。
❺ sql游標實例!
表:
YB1
4
9
1
3
1
5
5
5
5
8
5
9
3
0
4
8
6
9
6
8
4
0
12
0
declare
mycur
cursor
for
select
DISTINCT
T1
from
YB1----
找出定義的欄位『這里以t1為條件』
declare
@T2
CHAR---------上面的select語句查詢幾個欄位定義幾個變數
declare
@t
table
(T3
CHAR
,T4
CHAR)-----------查詢的內容存放的表單
open
mycur
fetch
next
from
mycur
into
@T2
while
@@fetch_status=0
begin
insert
into
@t----將瞎襪根據條件查詢出的內容放入到表仿念@t中
select
TOP
1*
from
YB1----查詢磨大激出內容
where
T1=@T2----定義幾個變數這里就要等於幾個闡述
ORDER
BY
T2
fetch
next
from
mycur
into
@T2----根據定義的參數進行迴圈
end
---關閉游標
close
mycur
deallocate
mycur
select
*
from
@t
❻ 如何使用SQL Server游標(一)
但是我們常常會遇到這樣情況,即從某一結果集中逐一地讀取一條記錄。那麼如何解決這種問題呢?游標為我們提供了一種極為優秀的解決方案。 1.游沖運悉標和游標的優點 在資料庫中,游標是一個十分重要的概念。游標提供了一種對從表中檢索出的數據進行操作的靈活手段,就本質而言,游標實際上是一種能從包括多條數據記錄的結果集中每次提取一條記錄的機制。游標總是與一條T_SQL 選擇語句相關聯因為游標由結果集(可以是零條、一條或由相關的選擇語句檢索出的多條記錄)和結果集中指向特定記錄的游標位置組成。當決定對結果集進行處理時,必須聲明一個指向該結果集的游標。如果曾經用 C 語言寫過對文件進行處理的程序,那麼游標就像您打開文件所得到的文件句柄一樣,只要文件打開成功,該文件句柄就可代表該文件。對於游標而言,其道理是相同的。可見游標能夠實現按與傳統程序讀取平面文件類似的方式處理來自基礎表的結果集,從而把表中數據以平面文件的形式呈現給程序。 我們知道關系資料庫管理系統實質是面向集合的,在MS SQL SERVER 中並沒有一種描述表中單一記錄的表達形式,除非使用where 子句來限制只有一條記錄被選中。因此我們必須藉助於游標來進行面向單條記錄的數據處理。 由此可見,游標允許應用程序對查詢語句select 返回的行結果集中每一行進行相同或不同的操作,而不是一次對整個結果集進行同一種操作;它還提供對基於游標位置而對表中數據進行刪除或更新的能力;而且,正是游標把作為面向集合的資料庫管理系統和面向行的程序設計兩悄正者聯系起來,使兩個數據處理方式能夠進行溝通。 2.游標種類 MS SQL SERVER支持三種類型的游標:Transact_SQL 游標,API 伺服器游標和客戶游標。 (1)Transact_SQL游標 Transact_SQL游標是由DECLARE CURSOR語法定義、主要用在Transact_SQL 腳本、存儲過程和觸發器中。Transact_SQL 游標主要用在伺服器上,由從客戶端發送給伺服器的Transact_SQL 語句或是批處理、存儲過程、觸發器中的Transact_SQL 進行管理。 Transact_SQL 游標不支持提取數據塊或多行數據。 (2)API 游標 API 游標支持在OLE DB, ODBC 以及DB_library 中使用游標函數,主要用在伺服器上。每一次客戶端應用程序調用API 游標函數,MS SQL SEVER 的OLE DB 提供者、ODBC驅動器或DB_library 的動態鏈接庫(DLL) 都會將這些客戶請求傳送給伺服器以對API游標進行處理。 (3)客散乎戶游標 客戶游標主要是當在客戶機上緩存結果集時才使用。在客戶游標中,有一個預設的結果集被用來在客戶機上緩存整個結果集。客戶游標僅支持靜態游標而非動態游標。由於伺服器游標並不支持所有的Transact-SQL 語句或批處理,所以客戶游標常常僅被用作伺服器游標的輔助。因為在一般情況下,伺服器游標能支持絕大多數的游標操作。 由於API 游標和Transact-SQL 游標使用在伺服器端,所以被稱為伺服器游標,也被稱為後台游標,而客戶端游標被稱為前台游標。在本章中我們主要講述伺服器(後台)游標。select count(id) from info select * from info --清除所有記錄
❼ Oracle下如何用sql創建游標
For 循環游標
(1)定義游標
(2)定義游標變數
(3)使用for循環來使用這個游標
declare
--類型定義
cursorc_job
is
selectempno,ename,job,sal
fromemp
wherejob='MANAGER';
--定義一個游標變數v_cinfoc_emp%ROWTYPE,該類型為游標c_emp中的一行數據類型
c_rowc_job%rowtype;
begin
forc_rowinc_jobloop
dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
endloop;
end;
Fetch游標
使用的時候必須要明確的打開和關閉
declare
--類型定義
cursorc_job
is
selectempno,ename,job,sal
fromemp
wherejob='MANAGER';
--定義一個游標變數
c_rowc_job%rowtype;
begin
openc_job;
loop
--提取一行數據到c_row
fetchc_jobintoc_row;
--判讀是否提取到值,沒取到值就退出
--取到值c_job%notfound是false
--取不到值c_job%notfound是true
exitwhenc_job%notfound;
dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
endloop;
--關閉游標
closec_job;
end;
❽ SQL游標怎麼用
例子
table1結構如下
id
int
name
varchar(50)
declare
@id
int
declare
@name
varchar(50)
declare
cursor1
cursor
for
--定義游標cursor1
select
*
from
table1
--使用游標的對象(跟據需要填入select文)
open
cursor1
--打開游標
fetch
next
from
cursor1
into
@id,@name
--將游標向下移1行,獲取的數據放入之前定義的變數@id,@name中
while
@@fetch_status=0
--判斷是否成功獲取數據
begin
update
table1
set
name=name+'1'
where
id=@id
--進行相應處理(跟據需要填入SQL文)
fetch
next
from
cursor1
into
@id,@name
--將游標向下移1行
end
close
cursor1
--關閉游標
deallocate
cursor1
❾ sql sever怎麼創建游標
一、下面是一個使用游標的簡單例子,有SQL基本知識的朋友不難看懂:
--申明一個游標
DECLAREMyCursorCURSOR
FORSELECTTOP5FBookName,FBookCodingFROMTBookInfo
--打開一個游標
OPENMyCursor
--循環一個游標
DECLARE@BookNamenvarchar(2000),@BookCodingnvarchar(2000)
FETCHNEXTFROMMyCursorINTO@BookName,@BookCoding
WHILE@@FETCH_STATUS=0
BEGIN
print'name'+@BookName
FETCHNEXTFROMMyCursorINTO@BookName,@BookCoding
END
--關閉游標
CLOSEMyCursor
--釋放資源
DEALLOCATEMyCursor
二、提示的是,多數情況下,游標可以用臨時表代替,個人建議使用臨時表,因為游標對系統性能消耗要大。