❶ 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
二、提示的是,多数情况下,游标可以用临时表代替,个人建议使用临时表,因为游标对系统性能消耗要大。