sql如何使用游标查询指定行记录

sql如何使用游标查询指定行记录,第1张

可以

不过不用游标也可以

select from (select ,row_number() over(order by 排序列) as rownum from table) a

where rownum>=n and rownum<=m

写在文章前:本系列文章用于博主自己归纳复习一些基础知识,同时也分享给可能需要的人,因为水平有限,肯定存在诸多不足以及技术性错误,请大佬们及时指正。

存储过程 是事先经过编译并存储在数据库中的一段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这一列上建立的索引),即可在索引中查找。由于索引是经过某种算法优化过的,因而查找次数要少的多。可见,索引是用来定位的。

从应用上分, 主键索引(聚集) 唯一索引(聚集/非聚集) 普通索引 组合索引 单列索引和全文索引

哥们儿,数据库不会这么用的,虽然能做到

如:

1、声明游标

//关键,查询表名,通过游标可以控制表名逐行筛选

select name from sysobjects

where type='U'

2、开始游标,得到表名@tablename

3、循环拼接sql语句并判断

@sql = 'select from ' + @tablename + ' where 1 = 1'

select @sql += ' or name = ' + 你的值 from syscolumns where id = object_id(@tablename)

exec(@sql) --得到的结果,最后你需要怎么处理就怎么处理,这里返回的是表

以上只是思路,我是没这么用过,你自己看着办

1为何使用游标:

使用游标(cursor)的一个主要的原因就是把集合 *** 作转换成单个记录处理方式。用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。游标机制允许用户在SQLserver内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录。

2如何使用游标:

一般地,使用游标都遵循下列的常规步骤:

(1)声明游标。把游标与T-SQL语句的结果集联系起来。(2)打开游标。(3)使用游标 *** 作数据。(4)关闭游标。

3下面是用法

DECLAREcursor1cursor/声明游标,默认为FORWARD_ONLY游标/

FORSELECTFROMbooks

OPENcursor1/打开游标/

FETCHNEXTfromcursor1/读取第1行数据/

WHILE@@FETCH_STATUS=0/用WHILE循环控制游标活动/

BEGIN

FETCHNEXTfromcursor1/在循环体内将读取其余行数据/

END

CLOSEcursor1/关闭游标/

DEALLOCATEcursor1

create proc spname

@pctable varchar(20),--表名

@pccol varchar(20)--列名

as

begin

exec('select ' + @pccol + ' from ' + @pctable) --演示根据参数查询

/游标演示

declare @ctemp int

declare cc cursor for select id from table --定义table的id列作为游标

open cc --打开游标

fetch next from cc into @ctemp --游标赋给变量

while @@fetch_status = 0 --如果游标存在

begin

print @ctemp

fetch next from cc into @ctemp --跳到下个游标

end

close cc --关闭游标

deallocate cc --释放游标

/

end

----------------------------

declare cc cursor for select id from table --定义table的id列作为游标

open cc --打开游标

fetch next from cc into @ctemp --游标赋给变量

对于上面三句话的举例:

假设有表table,内容如下:

id name

1 张三

2 李四

3 王五

4 赵六

那么:declare cc cursor for select id from table --把table的第一列id定义为游标(cc)

定义了以后,游标存在了,但是为空。所以把第一行的id赋给cc。

fetch next from cc into @ctemp 相当于 @ctemp = next from cc = 1

然后begin和end中间的fetch next from cc into @ctemp

是用于,我已经执行完对第一个游标的 *** 作了,接下来要跳转到下一个游标

fetch next from cc into @ctemp 相当于 @ctemp = next from cc = 2

你做过for循环吗做过就很容易理解了

int i; //这一句相当于declare cc cursor

for (i = 0; i < table行数; i++) //i++ 相当于begin和end中的fetch next from cc into @ctemp

{}

关闭游标的语句很简单:CLOSE CustomerCursor; 使用Where子句子 我们可以动态地定义游标中的Where子句的参数,例如在本例中我们是直接定义了查询省份是北京的记录,但也许在应用中我们要使用一个下拉式列表框,由用户来选择要查询的省份,我们该怎样做呢 我们在前面曾经提到过,DECLARE语句的作用只是定义一个游标,在OPEN语句中这个游标才会真正地被执行。了解了这些,我们就可以很方便地实现这样的功能,在DECLARE的Where子句中加入变量作参数,如下所示:DECLARE CustomerCursor CURSORFORSELCECT acct_no,name,balanceFROM customerWHERE province=:ls_province;∥定义ls_province的值OPEN CustomerCursor; 游标的类型 同其它变量一样,我们也可以定义游标的访问类型:全局、共享、实例或局部,游标变量的命名规范建议也同其它变量一样。--声明游标declare my_cursor cursor keyset forselectfrom 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 database1declare my_cursor cursor scroll dynamic///scroll表示可随意移动游标指 针(否则只能向前),dynamic表示可以读写游标(否则游标只读)/forselect productname from productopen my_cursordeclare@pname sysnamefetchnextfrom my_cursor into@pnamewhile(@@fetch_status=0)begin print'Product Name: '+@pname fetchnextfrom my_cursor into@pname endfetch first from my_cursor into@pnameprint@pname///update product set productname='zzg' where current of my_cursor ////delete from product where current of my_cursor /close my_cursordeallocate my_cursor 4游标的高级技巧 尽管目前基于SQL语句的后台数据库所支持的语言都大致相当,但对游标的支持却有着一些差异,例如对滚动游标支持。所谓滚动游标,就是程序员可以指定游标向前后任意一个方向滚动。如在Informix中,您甚至还可以将游标滚向结果集开头或末尾,使用的语句分别是FETCH FIRST,FETCH LAST、FETCH PRIOR和FETCH NEXT。当程序员用FETCH语句,其缺省是指FETCH NEXT。由于滚动是在数据库后台实现的,所以滚动游标为用户编程提供了极大的方便。 对游标支持的另一个不同是可修改游标。上述游标的使用都是指只读游标,而象Oracle、Sybase等数据库却另外支持可作修改的游标。使用这样的数据库,您可以修改或删除当前游标所在的行。例如修改当前游标所在行的用户的余额,我们可以如下 *** 作:UPDATE customerSET balance=1000WHERECURRENTof customerCursor;删除当前行的 *** 作如下:WHERECURRENTOF CustomerCursor; 但是如果您当前使用的数据库是Sybase,您需要修改数据库的参数,将游标可修改的值定为1,才能执行上述 *** 作。这一赋值在连接数据库的前后进行均可。

以上就是关于sql如何使用游标查询指定行记录全部的内容,包括:sql如何使用游标查询指定行记录、数据库基础详解:存储过程、视图、游标、SQL语句优化以及索引、sql 如何查询一个数值在数据库的哪个表中等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/10090152.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存