数据库游标

数据库游标,第1张

游标包含两方面的内容:

游标结果集:执行其中的Select语句所得到的结果集;

●游标位置:一个指向游标结果集内的某一条记录的指针

利用游标可以单独 *** 纵结果集中的每一行。游标在定义以后存在两种状态:关闭和打开。当游标关闭时,其查询结果集不存在;只有当游标打开时,才能按行读取或修改结果集中的数据

使用游标

一个应用程序可以使用两种类型的游标:前端(客户)游标和后端(服务器)游标,它们是两个不同的概念。

无论使用哪一种游标,都需要经过如下几个步骤:

●定义游标

●打开游标

●从游标中 *** 作数据

●关闭游标

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

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

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

它将冗余数据选择到一个游标中 并根据(LastName FirstName)来分组(在我们这个方案中) 然后打开游标然后循环地取出每一行 然后用与先前的取出的键值进行比较 如果这是第一次取出这个值 或者这个值不是冗余键 那么跳过这个记录然后取下一个 不然的话 这就是这个组中的冗余记录 所以删掉它.

让我们运行一下这个存储过程

BEGIN

DeleteDuplicates;

END;

/

SELECT LastName FirstName COUNT()

FROM Customers

GROUP BY LastName FirstName

HAVING COUNT() > ;

最后一个查询语句没有返回值 所以冗余数据没有了从表中取冗余数据的过程完全是由定义在csr_Duplicates 这个游标中的SQL语句来实现的 PL/SQl只是用来实现删除冗余数 那么能不能完全用SQL语句来实现呢?

二.SQL解决方案 使用RANK()删除冗余数据Oracle i分析函数RANK()来枚举每一个组中的元素 在我们的方案中我们应用这个方案 我们使用这个函数动态的把冗余数据连续的排列起来加上编号 组由Partintion by 这个语句来分开 然后用Order by 进行分组SELECT ID LastName FirstName RANK() OVER (PARTITION BY LastName

FirstName ORDER BY ID) SeqNumber

FROM Customers

ORDER BY LastName FirstName;

SQL

Listing Output of single SQL statement that uses RANK()

显示的是根据记录的条数的个数来显示尤其对于冗余数据

ID LASTNAME FIRSTNAME SEQNUMBER

Blake Becky

Blue Don

Bradley Tom

Chang Jim

Griffith David

Hill Larry

King Chuck

Krieger Jeff

Krieger Jeff

Krieger Jeff

Loney Julie

Lord Don

Mason Paul

Monroe John

Simon Michael

Simon Michael

Stone Tony

Stone Tony

Stone Tony

Stone Tony

Stone Tony

我们可以看一到 SeqNumber这一列中的数值 冗余数据是根据ID号由小到大进行的排序 所有的冗余数据的SqlNumber都大于一 所有的非冗余数据都等于一 所以我们取自己所需 删除那么没用的SELECT ID LastName FirstName

FROM

(SELECT ID LastName FirstName RANK() OVER (PARTITION BY LastName

FirstName ORDER BY ID) AS SeqNumber

FROM Customers)

WHERE SeqNumber > ;

SQL

Listing 冗余键的键值

有七行必须被删除

ID LASTNAME FIRSTNAME

Krieger Jeff

Krieger Jeff

Simon Michael

Stone Tony

Stone Tony

Stone Tony

Stone Tony

rows selected 这显示有七行需要删除 还是用上一个表我测试了一下这个代码 它用了77秒种就删除了所有的数据准备好了用Sql语句来删除冗余数据 版本一它执行了 秒

DELETE

FROM CUSTOMERS

WHERE ID IN

(SELECT ID

FROM

(SELECT ID LastName FirstName RANK() OVER (PARTITION BY LastName

FirstName ORDER BY ID) AS SeqNumber

FROM Customers)

WHERE SeqNumber > );

我们可以看到最后的两行语句对表中的数据进行了排序 这不是有效的 所以我们来优化一下最后一个查询语句 把Rank()函数应用到只含有冗余数据的组 而不是所有的列下面这个语句是比较有效率的 虽然它不像上一个查询那样精简SELECT ID LastName FirstName

FROM

(SELECT ID LastName FirstName RANK() OVER (PARTITION BY LastName

FirstName ORDER BY ID) AS SeqNumber

FROM

(SELECT ID LastName FirstName

FROM Customers

WHERE (LastName FirstName) IN (SELECT LastName FirstName

FROM Customers

GROUP BY LastName FirstName

HAVING COUNT() > )))

WHERE SeqNumber > ;

选择冗余数据只用了26秒钟 这样就提高了 %的性能 这样就提高了将这个作为子查询的删除查询的效率

DELETE

FROM Customers

WHERE ID IN

(SELECT ID

FROM

(SELECT ID LastName FirstName RANK() OVER (PARTITION BY LastName

FirstName ORDER BY ID) AS SeqNumber

FROM

(SELECT ID LastName FirstName

FROM Customers

WHERE (LastName FirstName) IN (SELECT LastName FirstName

FROM Customers

GROUP BY LastName FirstName

HAVING COUNT() > )))

WHERE SeqNumber > );

现在只用了 秒钟的就完成的上面的任务 比起上一个 秒 这是一个很大的进步 相比之下 存储过程用了 秒 这样存储过程有些慢了使用PL/SQL语句我们和我们以上的代码 会得到更好的更精确的代码 和提高你代码的执行效率 虽然对于从数据库中枚举数据PL/SQL对于Sql两者没有什么差别 但是对于数据的比较上 PL/SQL就比SQL要快很多 但是如果冗余数据量比较小的话 我们尽量使用SQL而不使用PL/SQL如果你的数据表没有主键的话 那么你可以参考其它技术

Rank()其它的方法

使用Rank()函数你可以对选择你所保留的数据 (或者是小ID的或者是大ID 的 就由RECDate这个列来决定这种情况下 你可以把REcdate加入到(Orderby )子句中 倒序或者正序

这是一种保留最大Id的一种解决方案

DELETE

FROM Customers

WHERE ID IN

(SELECT ID

FROM

(SELECT ID LastName FirstName RANK() OVER (PARTITION BY LastName FirstName ORDER BY RecDate DESC ID) AS SeqNumber

FROM

(SELECT ID LastName FirstName RecDate

FROM Customers

WHERE (LastName FirstName) IN (SELECT LastName FirstName

FROM Customers

GROUP BY LastName FirstName

HAVING COUNT() > )))

WHERE SeqNumber > );

这种技术保证了你可以控制每一个表中的保留的组 假设你有一个数据库 有一个促销或者有一个折扣信息 比如一个团体可以使用这种促销5次 或者个人可以使用这个折扣三次 为了指出要保留的组的个数 你可以在where 和having子句中进行设置 那么你将删除所有大于你

设置有数的冗余组

DELETE

FROM Customers

WHERE ID IN

(SELECT ID

FROM

(SELECT ID LastName FirstName RANK() OVER (PARTITION BY LastName

FirstName ORDER BY ID) AS SeqNumber

FROM

(SELECT ID LastName FirstName

FROM Customers

WHERE (LastName FirstName) IN (SELECT LastName FirstName

FROM Customers

GROUP BY LastName FirstName

HAVING COUNT() > )))

WHERE SeqNumber > );

As you can see using the RANK() function allows you to eliminate duplicates in a

single SQL statement and gives you more capabilities by extending the power of

your

queries

lishixinzhi/Article/program/Oracle/201311/18979

delete A WHERE department <> '总部'

看看delete语法:

DELETE

从表中删除行。

语法

DELETE

[ FROM ]

{ table_name WITH ( < table_hint_limited > [ n ] )

| view_name

| rowset_function_limited

}

[ FROM { < table_source > } [ ,n ] ]

[ WHERE

{ < search_condition >

| { [ CURRENT OF

{ { [ GLOBAL ] cursor_name }

| cursor_variable_name

}

] }

}

]

[ OPTION ( < query_hint > [ ,n ] ) ]

< table_source > ::=

table_name [ [ AS ] table_alias ] [ WITH ( < table_hint > [ ,n ] ) ]

| view_name [ [ AS ] table_alias ]

| rowset_function [ [ AS ] table_alias ]

| derived_table [ AS ] table_alias [ ( column_alias [ ,n ] ) ]

| < joined_table >

< joined_table > ::=

< table_source > < join_type > < table_source > ON < search_condition >

| < table_source > CROSS JOIN < table_source >

| < joined_table >

< join_type > ::=

[ INNER | { { LEFT | RIGHT | FULL } [OUTER] } ]

[ < join_hint > ]

JOIN

< table_hint_limited > ::=

{ FASTFIRSTROW

| HOLDLOCK

| PAGLOCK

| READCOMMITTED

| REPEATABLEREAD

| ROWLOCK

| SERIALIZABLE

| TABLOCK

| TABLOCKX

| UPDLOCK

}

< table_hint > ::=

{ INDEX ( index_val [ ,n ] )

| FASTFIRSTROW

| HOLDLOCK

| NOLOCK

| PAGLOCK

| READCOMMITTED

| READPAST

| READUNCOMMITTED

| REPEATABLEREAD

| ROWLOCK

| SERIALIZABLE

| TABLOCK

| TABLOCKX

| UPDLOCK

}

< query_hint > ::=

{ { HASH | ORDER } GROUP

| { CONCAT | HASH | MERGE } UNION

| FAST number_rows

| FORCE ORDER

| MAXDOP

| ROBUST PLAN

| KEEP PLAN

}

参数

FROM

是可选的关键字,可用在 DELETE 关键字与目标 table_name、view_name 或 rowset_function_limited 之间。

table_name

是要从其中删除行的表的名称。

在其作用域内的 table 变量、或是将 OPENDATASOURCE 函数作为服务器名称的由四部分组成的表名(或视图名称)还可以在 DELETE 语句中作为表源使用。

WITH (<table_hint_limited> [n])

指定目标表所允许的一个或多个表提示。需要有 WITH 关键字和圆括号。不允许有 READPAST、NOLOCK 和 READUNCOMMITTED。有关表提示的更多信息,请参见 FROM。

view_name

是视图名称。在视图的 FROM 子句中,view_name 引用的视图必须可更新且正确引用一个基表。有关可更新视图的更多信息,请参见 CREATE VIEW。

说明 如果表或视图存在于另一个数据库内或有一个不同于当前用户的所有者,则使用格式为 server_namedatabase[owner]object_name 的由四部分组成的合法名称。有关更多信息,请参见 Transact-SQL 语法规则。

rowset_function_limited

OPENQUERY 或 OPENROWSET 函数,视提供程序功能而定。有关提供程序所需功能的更多信息,请参见 OLE DB 提供程序的 UPDATE 和 DELETE 语句要求。有关行集函数的更多信息,请参见 OPENQUERY 和 OPENROWSET。

FROM < table_source >

指定附加的 FROM 子句。这个对 DELETE 的 Transact-SQL 扩展使您得以从 <table_sources> 指定数据,并从第一个 FROM 子句内的表中删除相应的行。

这个扩展指定联接,可在 WHERE 子句中取代子查询来标识要删除的行。

table_name [[AS] table_alias ]

是为删除 *** 作提供标准值的表名。

view_name [ [ AS ] table_alias ]

是为删除 *** 作提供标准值的视图名称。带 INSTEAD OF UPDATE 触发器的视图不能是含有 FROM 子句的 UPDATE 的目标。

WITH (<table_hint>

指定一个或更多表提示。有关表提示的更多信息,请参见 FROM。

rowset_function [ [AS] table_alias ]

是行集函数名和可选别名。有关行集函数列表的更多信息,请参见行集函数。

derived_table [AS] table_alias

是从数据库中检索行的子查询。derived_table 用作对外部查询的输入。

column_alias

替换结果集内列名的可选别名。在选择列表中放入每个列的一个别名,并将整个列别名列表用圆括号括起来。

<joined_table>

由两个或更多表的积组成的结果集,例如:

SELECT

FROM tab1 LEFT OUTER JOIN tab2 ON tab1c3 = tab2c3

RIGHT OUTER JOIN tab3 LEFT OUTER JOIN tab4

ON tab3c1 = tab4c1

ON tab2c3 = tab4c3

对于多个 CROSS 联接,请使用圆括号来更改联接的自然顺序。

<join_type>

指定联接 *** 作的类型。

INNER

指定返回每对匹配的行。废弃两个表中不匹配的行。如果未指定联接类型,则这是默认设置。

LEFT [OUTER]

指定在结果集内包含左表中所有不满足指定条件的行,并将右表中的输出列设置为 NULL 以作为对内联接所返回的所有行的补充。

RIGHT [OUTER]

指定在结果集内包含右表中所有不满足指定条件的行,并将左表中的输出列设置为 NULL 以作为对内联接所返回的所有行的补充。

FULL [OUTER]

如果来自左表或右表的某行与选择准则不匹配,则指定在结果集内包含该行,并且将与另一个表对应的输出列设置为 NULL。除此之外,结果集中还包含通常由内联接返回的所有行。

JOIN

是表示在删除 *** 作中使用 SQL-92 式联接的关键字。

ON <search_condition>

指定联接所基于的条件。尽管经常使用列和比较运算符,但此条件可指定任何谓词,例如:

FROM Suppliers JOIN Products

ON (SuppliersSupplierID = ProductsSupplierID)

当条件指定列时,列不必具有相同的名称或数据类型;但是,如果数据类型不一致,则这些列必须相互兼容或是 Microsoft® SQL Server™ 能够隐性转换的类型。如果数据类型不能隐性转换,则条件必须使用 CAST 函数显式转换数据类型。

有关搜索条件和谓词的更多信息,请参见搜索条件。

CROSS JOIN

指定两个表的矢量积。这将返回相同的行,就好像在旧式的非 SQL-92 式联接中并没有指定 WHERE 子句。

WHERE

指定用于限制删除行数的条件。如果没有提供 WHERE 子句,则 DELETE 删除表中的所有行。基于 WHERE 子句中所指定的条件,有两种形式的删除 *** 作。

搜索删除指定搜索条件限定删除的行。

定位删除使用 CURRENT OF 子句指定游标。删除 *** 作在游标的当前位置发生。这比使用 WHERE search_condition 子句限定删除的行的搜索 DELETE 精确。如果搜索条件不唯一标识单行,则搜索 DELETE 删除多行。

<search_condition>

指定删除行的限定条件。对搜索条件中可以包含的谓词数量没有限制。有关更多信息,请参见搜索条件。

CURRENT OF

指定在指定游标的当前位置完成 DELETE。

GLOBAL

指定 cursor_name 指的是全局游标。

cursor_name

是从其中进行提取的打开游标的名称。当全局和局部游标都以 cursor_name 作为它们的名称存在时,如果指定 GLOBAL,则 cursor_name 引用全局游标,如果未指定 GLOBAL,则 cursor_name 引用局部游标。游标必须允许更新。

cursor_variable_name

是游标变量的名称。游标变量必须引用允许更新的游标。

OPTION (<query_hint> [,n] )

是表示使用优化程序提示自定义 SQL Server 的语句处理的关键字。

{HASH | ORDER} GROUP

指定在查询的 GROUP BY 或 COMPUTE 子句中指定的聚合使用哈希或排列。

{MERGE | HASH | CONCAT} UNION

指定所有的 UNION *** 作通过合并、哈希或串联 UNION 集合来完成。如果指定了不止一个 UNION 提示,查询优化器就会从这些指定的提示中选择开销最少的策略。

说明 如果还为 FROM 子句中的某对链接表指定了 <joint_hint>,则这个提示优先于 OPTION 子句中所指定的任何 <join_hint>。

FAST number_rows

指定对查询进行优化,以便快速检索第一个 number_rows(非负整数)。在第一个 number_rows 返回后,查询继续进行并生成完整的结果集。

FORCE ORDER

指定在查询优化过程中保持由查询语法表示的联接顺序。

MAXDOP number

只对指定了 sp_configure 的 max degree of parallelism 配置选项的查询替代该选项。当使用 MAXDOP 查询提示时,所有和 max degree of parallelism 配置选项一起使用的语义规则均适用。有关更多信息,请参见 max degree of parallelism 选项。

ROBUST PLAN

强制查询优化器尝试执行一个计划,该计划以性能为代价获得最大可能的行大小。如果不能使用这样的计划,查询优化器将返回错误而不是延迟对查询执行的错误检测。行可以包含可变长度列;SQL Server 允许将行大小定义为超过 SQL Server 处理能力的最大可能的大小。通常,应用程序存储实际大小在 SQL Server 处理能力范围内的行,而不管最大可能大小。如果 SQL Server 遇到过长的行,则返回执行错误。

KEEP PLAN

强制查询优化器对查询放宽估计的重新编译阈值。当对表中索引列的更改(更新、删除或插入)达到估计数目时查询会自动重新编译,该估计数目即为重新编译阈值。指定 KEEP PLAN 将确保当表有多个更新时不会频繁地对查询进行重新编译。

注释

如果所修改的对象是 table 变量,则 DELETE 可用在用户定义函数的正文中。

对于由四部分组成的表名(或视图名称),若其中的服务器名称使用的是 OPENDATASOURCE 函数,则该表名可以在表名能够出现的任何位置作为表源使用。

如果 DELETE 语句违反了触发器,或试图删除另一个有 FOREIGN KEY 约束的表内的数据所引用的行,则可能会失败。如果 DELETE 删除了多行,而在删除的行中有任何一行违反触发器或约束,则将取消该语句,返回错误且不删除任何行。

如果在对表或视图的 DELETE *** 作上定义了 INSTEAD-OF 触发器,该触发器将执行 instead of DELETE 语句。SQL Server 的早期版本只支持 DELETE 上的 AFTER 触发器和其它修改语句。

当 DELETE 语句遇到在表达式评估过程中发生的算术错误(溢出、被零除或域错误)时,SQL Server 将处理这些错误,就好象 SET ARITHABORT 打开一样。将取消批处理中的其余部分并返回错误信息。

对远程表和本地及远程分区视图上的 DELETE 语句将忽略 SET ROWCOUNT 选项的设置。

如果要删除在表中的所有行,则 TRUNCATE TABLE 比 DELETE 快。DELETE 以物理方式一次删除一行,并在事务日志中记录每个删除的行。TRUNCATE TABLE 则释放所有与表关联的页。因此,TRUNCATE TABLE 比 DELETE 快且需要的事务日志空间更少。TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 相当,但是 TRUNCATE TABLE 不能用于由外键引用的表。DELETE 和 TRUNCATE TABLE 都使删除的行所占用的空间可用于存储新数据。

权限

默认情况下,将 DELETE 权限授予 sysadmin 固定服务器角色成员、db_owner 和 db_datawriter 固定数据库角色成员以及表所有者。sysadmin、db_owner 和 db_securityadmin 角色成员和表所有者可以将权限转让给其他用户。

如果语句包含 WHERE 子句,则还必须有 SELECT 权限。

示例

A 不带参数使用 DELETE

下例从 authors表中删除所有行。

USE pubs

DELETE authors

B 在行集上使用 DELETE

因为 au_lname 可能不是唯一的,下例删除其中的 au_lname 是 McBadden 的所有行。

USE pubs

DELETE FROM authors

WHERE au_lname = 'McBadden'

C 在游标的当前行上使用 DELETE

下例显示在名为 complex_join_cursor 的游标上所做的删除。它只影响当前从游标提取的单行。

USE pubs

DELETE FROM authors

WHERE CURRENT OF complex_join_cursor

D 基于子查询使用 DELETE 或使用 Transact-SQL 扩展

下例显示基于联接或相关子查询从基表中删除记录的 Transact-SQL 扩展。第一个 DELETE 显示与 SQL-92 兼容的子查询解决方法,第二个 DELETE 显示 Transact-SQL 扩展。两个查询都基于存储在 titles 表中的标题从 titleauthors 表中删除行。

/ SQL-92-Standard subquery /

USE pubs

DELETE FROM titleauthor

WHERE title_id IN

(SELECT title_id

FROM titles

WHERE title LIKE '%computers%')

/ Transact-SQL extension /

USE pubs

DELETE titleauthor

FROM titleauthor INNER JOIN titles

ON titleauthortitle_id = titlestitle_id

WHERE titlestitle LIKE '%computers%'

E 在 DELETE 和 SELECT 中使用 TOP 子句

由于可以在 DELETE 语句中指定 SELECT 语句,因此还可以在 SELECT 语句中使用 TOP 子句。例如,下例从 authors 表中删除前 10 个作者。

DELETE authors

FROM (SELECT TOP 10 FROM authors) AS t1

WHERE authorsau_id = t1au_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)

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

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

我取的数据库使用游标的记录。它的工作完美。但是,我在logcat中已经一些错误,而我使用这个code

公开光标使用fetchall()

{

SQLiteDatabase DB = thisgetReadableDatabase();

光标光标= dbquery(T1,新的String [] {“_id”,名称,日期,之前,时间,日期格式},NULL,NULL,NULL,NULL,之前);

返回游标;

}

在数据库中,游标提供了一种对从表中检索出的数据进行 *** 作的灵活手段。就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。

游标总是与一条SQL

选择语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。

游标关于数据库中的 *** 作会对整个行集产生影响。由SELECT语句返回的行集包括所有满足该语句WHERE子句中条件的行。由语句所返回的这一完整的行集被称为结果集。

应用程序,特别是交互式联机应用程序,并不总能将整个结果集作为一个单元来有效地处理。这些应用程序需要一种机制以便每次处理一行或一部分行。游标就是提供这种机制的结果集扩展。

扩展资料:

游标通过以下方式扩展结果处理:

1允许定位在结果集的特定行。

2从结果集的当前位置检索一行或多行。

3支持对结果集中当前位置的行进行数据修改。

4为由其他用户对显示在结果集中的数据库数据所做的更改提供不同级别的可见性支持。

5提供脚本、存储过程和触发器中使用的访问结果集中的数据的Transact-SQL语句。

以上就是关于数据库游标全部的内容,包括:数据库游标、数据库基础详解:存储过程、视图、游标、SQL语句优化以及索引、如何删除数据库中的冗余数据(2)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/sjk/10193800.html

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

发表评论

登录后才能评论

评论列表(0条)

保存