2021-07-27

下面就T-SQL的几个方面来分别讲解一下。

1、变量

 要动态sql教程的写sql语句,就不能没有变量。

声明变量并赋值:

1 declare @i as int;--定义一个 int 类型的 变量 (as可以省略)
2 print @i;--这注意:没有赋值之前,程序不会报错,而且输出一个 空
3 set @i=3;
4 print @i;

在sql server 2008之后就可以对变量 在声明的同时java基础教程进行赋值

1 declare @a int=3;
2 print @a;

在变量的使python基础教程用过程中,一定要注意nvarcahr 和nchar的区别。

复制代码

1 declare @s nvarchar(20);
2 set @s='Hello';
3 set @s=@s+' World!';
4 print @s;--输出的是 Hello  World!
5 
6 declare @s2 nchar(20);
7 set @s2='Hello';
8 set @s2=@s2+' World!';
9 print @s2;--输出的是 Hello。

复制代码

为什么使用nchar却是输出的 Hello,因为:nchar是固定c#教程长度,即使长度没有达到最大,但是其余长度用 空来代替了,所以 相当于是满的,所以在进行字符串的相加 是不会起作用的。

在查询中赋值:

1 declare @now datetime;
2 select @now=GETDATE();
3 print @now;
4 declare @orderNum int;
5 select @orderNum = COUNT(1) from [Sales.Orders];--这条查询语句只是用来 对 变量进行赋值的,不会返回查询结果的.
6 print @orderNum; 

主要作用:是将查询结果保存在 变量里,为了下面的使用。

其实也可以使用 set 赋值的方式 实现 上面的作用

1 set @orderNum =(select COUNT(1) from [Sales.Orders])
2 print @orderNum

2、批处理

 使用“go”,go前面的 所有的 语句处于在一个 批里面。不同批 的变量vb.net教程是不能互相调用。

3、流程控制

1)条件控制

复制代码

1 declare @minute int ;
2 set @minute =DATEPART(minute,getdate());
3 if @minute>20
4    begin--一条语句可以将  begin end 省略
5       print '马上睡觉';
6    end
7 else
8    print '继续快乐玩耍';

复制代码

2)循环控制

复制代码

 1 --高斯问题
 2 declare @sum int,@i int;
 3 set @sum=0;
 4 set @i=0;
 5 while @i<100
 6    begin
 7    set @i=@i+1;
 8    set @sum=@sum+@i;
 9    end
10 print @sum;

复制代码

 在sql server 里面的 continue 和 break 和c#里面的 使用是相同的。

4、游标

什么是游标:

 不是基于集合的操作,而是将集合中的数据逐条取出来,逐条进行操作。

什么时候使用游标:

 默认的情况下是使用集合的方式 查询,如果要使用 游标  必须是在 能有让人信服的 理由下才考虑使用。

一般不使用游标的原因:

 1、使用游标,严重违背了关系模型,关系模型是基于集合考虑的。

2、逐条对记录进行操作会带来性能上的开销。给定一个集合,对集合进行一系列的游标代码的操作,一定会带来性能上的开销,并且这种使用游标的 方式 性能比 集合 慢了好几倍。
3、使用游标 要写很多代码。但是使用集合的,就只 把需要的数据查询出来,不描述怎么获取他们。游标写很多代码,可读性差,维护差。

存在的意义:

 说了这么多的 弊端,那是游标还有存在的意义吗?当然:当需要对查询出来的数据  逐条进行 处理的 时候就要使用游标.

使用游标的步骤:

1、在查询中声明游标

2、打开游标

3、从第一个值开始将值赋值到对应的变量里面。

4、循环遍历游标,将赋值变量拿过来进行操作。

5、关闭游标

6、释放游标

复制代码

 1 --1、首先在查询基础上声明游标
 2 declare c cursor
 3    for
 4    select shipperid,companyname 
 5    from [Sales.Shippers];
 6 
 7 --2、打开游标
 8 open c;
 9 
10 --3、从第一个游标开始把 值 赋值到 对应的变量里面
11 declare @id int,@name nvarchar(20);
12 
13 --每次取出来一条数据,  添加到指定的 变量。
14 fetch next from c into @id,@name;
15 
16 --4、循环遍历 游标,将赋值的变量 拿过来进行相应的操作
17 while @@FETCH_STATUS=0--等于0代表  游标没有超过最后一行
18     begin
19        --相应的操作处理
20        print @name;
21        
22        --尝试 读取下一条 数据
23        fetch next from c into @id,@name;
24     end
25 
26 --5、关闭游标
27 close c;
28 
29 --6、释放游标
30 deallocate c;

复制代码

总结:

1、使用游标,要非常谨慎,因为性能消耗很大,不确定的时候绝对不能使用

2、游标的唯一 好处:就是可以对查询数据,进行 逐条操作。这也正是它适应的场合。

5、临时表

使用场景:

当要将一些 数据 放到表里面 保存,但是又不想 创建一张数据表(因为一般 公司只有DBA 才有权限创建表),  或者我指向让当前 数据 只有当前 会话可见 ,甚至 只要当前 批 可见。

临时表的种类:

sql server三种临时表:局部临时表、全局临时表、表变量

下面对三种临时表进行分别讲解:

局部临时表:

1、创建过程和使用方式 都普通表是 一样,加上“#” 就代表是临时表.

2、只对 创建 他的 会话 是可见的,并且存储 在 系统数据库的 tempdb 数据的 临时表 里面。当前会话(进程)结束后,临时表会自动被删除

3、在 sql server 里 系统创建的临时表 都会加 后缀名,就是为了防止 不同进程之间 创建相同的表名的 表名,保证唯一性。

普通创建临时表的方法:

复制代码

1 create table #partTable
2 (
3   num int
4 );
5 
6 insert into #partTable (num) values (1),(2),(3);
7 go;--不再 一个 批 里面 也能使用 ,只要是在同一个 进程里面
8 select * from #partTable;

复制代码

在查询过程中创建临时表,并将查询出的数据插入到临时表里面

1 select * into #table from [Sales.Shippers]
2 select * from #table;  

全局临时表:

1、在 表名 前面 添加两个 “#” 代表是 全局临时表

 2、注意:对所有的 会话(进程) 都是可见的, 但是 当前进程 如果关闭或者  全局临时表 长时间没有被使用,那么就会被删除

1 create table ##allTable
2 (
3   num int
4 );
5 insert into ##allTable (num) values(1),(2),(3),(4);
6 select * from ##allTable

表变量:

注意:它也会在  tempdb数据库 里面创建一个 对应物理 临时表,只不过,他只对当前操作他的"批"可见,而且 当前 批 执行完成 之后就会 删除 临时表.(所以一定要注意:表 变量 并不是 存在内存中,他也会 创建一张物理数据表)

性能考虑:当 只有几行数据的时候,当然是 表变量 性能好;;但是如果是大量数据,应该使用临时表

复制代码

 1 declare @tableVariable table
 2 (
 3   num int
 4 ) 
 5 
 6 insert into @tableVariable (num) values (1),(2),(3);
 7 select * from @tableVariable;
 8 go;
 9 --不再同一 批 里面是不能访问到  表 变量
10 select * from @tableVariable;

复制代码

最重要的一点:表变量同变量一样,当事务回滚之后,变量的值不会回滚。同理表变量也不会回滚。

复制代码

 1 --回滚中 变量的不会回滚的  特殊情况
 2 declare @num int;
 3 set @num =1;
 4 begin transaction;
 5 set @num=12;
 6 print @num;
 7 rollback;
 8 --注意:事务回滚,如果变量在 事务里面 改变,回滚的时候 变量是不会回滚的.
 9 print @num;
10 
11 --同理:表变量也是如此的
12 declare @tableVariable2 table
13 (
14   num int
15 );
16 insert into @tableVariable2 (num) values(1),(2),(3);
17 begin transaction;
18 delete from @tableVariable2 where num =1;
19 rollback;
20 --表变量是不会 回滚的
21 select * from @tableVariable2;

复制代码

6、动态sql

什么是动态sql

首先静态sql就是普通的静态查询语句。

动态sql:就是使用 exec来执行字符串sql语句。

1 declare @sql nvarchar(100);
2 set @sql ='select * from [Sales.Shippers]';
3 exec(@sql)

缺点:不能防止sql注入漏洞攻击。(什么是sql注入漏洞大家应该都懂的吧。就不做介绍了)

为解决 上面的 sql注入漏洞攻击 所以又出现了 第二种动态sql :sp_executesql存储过程:

1、安全,因为他 支持 输入和输出参数的设置

2、性能比 exec 要好:因为它的 参数化 有助于 重用 缓存过 的执行计划. 执行计划:就是sql server 处理 sql 语句时 生成的指令.  如果 要想要 复用  缓存 中执行计划.必须保证 sql 字符串语句 相同.所以要 因为 使用  参数化 的sql语句 只要替换 参数就可以,所以 sql语句 不变化 可以复用.

复制代码

 1 declare @sql nvarchar(100);
 2 set @sql='select * from [Sales.Shippers] where companyname=@name';
 3 declare @name nvarchar(20);
 4 --set @name='顺丰';
 5 set @name='顺丰;select * from [Sales.Shippers]';--即使这样,想要进行sql 注入漏洞攻击,不可能,因为 在sql 语句 把整个 @name里面的 值  作为一个 字符串 来使用的,就是执行 companyname 和 整个字符串的对比
 6 
 7 exec sp_executesql 
 8   --下面两个是非常重要的
 9   @stmt=@sql,--动态执行的 sql语句
10   @params=N'@name as nvarchar(20)',--参数的类型
11   @name=@name;--参数赋值

复制代码

7、例程

例程是什么:

为了 计算结果 或者 执行任务 而 封装的代码 的一种编程现象.提到例程,大家可能不知道,但是提到下面的他的三个种类,就全都知道了。

例程的种类:

用户自定义函数、存储过程、触发器

最常用的是存储过程,下面先对存储过程进行介绍。

存储过程:

创建存储过程:

复制代码

1 --存储过程:最常用的方法
2 create procedure MyDemoPro
3 (
4    --存储过程中 要使用到 的参数
5    @orderid int
6 )
7 as
8 --下面是执行的 sql 语句
9 select * from [Sales.Orders] where orderid=@orderid;

复制代码

执行存储过程:

exec MyDemoPro @orderid=10;
--可以简写成:exec MyDemoPro 10;

要搞懂存储过程,就必须搞懂他的三个参数类型:

传入参数、传出参数、return参数。

传入参数:

就是普通的参数;上面使用的那中就是 参入参数

传出参数:

output 定义的参数:可以  传出 供用户使用的

复制代码

 1 create procedure OrderCount
 2 (
 3    @count int output
 4 )
 5 as
 6 select @count=COUNT(*) from [Sales.Orders];
 7 go;
 8 
 9 --执行 ,一定以声明一个变量 ,赋值给  传出参数
10 declare @outCount int ;
11 exec OrderCount  @count=@outCount output;
12 print @outCount;

复制代码

return参数:

特殊的参数:和 c#里面的不一样,这里只用来,表示 操作结果的正确或错误,只能返回数字

复制代码

 1 alter procedure ReturnProc
 2 (
 3    @username nvarchar(100)
 4 )
 5 as
 6   declare @usernameLen int;
 7   set @usernameLen=LEN(@username);
 8   
 9   if @usernameLen>=5
10   return '1';
11   else
12   return '0';
13 
14 
15 declare @result int;
16 --如何为 return 参数 赋值
17 exec  @result = ReturnProc @username='wanglihong';
18 print @result;

复制代码

如果将一个返回参数设置成'asd',就会报错如下:

自定义函数:

1、可以直接返回一个值  

2、分两种:

标量函数(返回值为一个 值)

表函数(返回值是一张表)(存在与 可编程性 里面的函数里面)

3、实际开发中很少使用。

复制代码

 1 create function GetMinute
 2 (
 3    @date datetime
 4 )
 5 --设置返回值:
 6 returns int
 7 as
 8   begin
 9      declare @minute int;
10      set @minute =datepart(minute,@date);
11      return @minute;
12   end
13 
14 --使用自定义函数
15 select dbo.GetMinute(GETDATE());

复制代码

触发器:

特殊的存储过程。主要作用:检索。注意:触发器必须依附于事件,只有当事件发生时候,出发触发器,运行触发器代码。(sql  server 中和 触发器相对应两个事件:数据操作事件和数据定义事件,从而对应下面的连个触发器)

种类分为两种:

  DML触发器(修改触发器:对表的数据修改:如:update等)

  DLL触发器(架构触发器:对数据库的架构进行修改:如创建表)

DML触发器:

分为两种:

  after触发器(对表操作)

  instead of 触发器(对视图进行操作)

注意:在触发器的代码里,只能访问到 inserted 和deleted 两张表.对数据进行更新的是 先删除然后在插入执行的。 inserted表包含 insert 和update操作 之后新数据的行。deleted表含有 delete和update 操作 之后旧数据的 行。

对于after触发器是经常使用,所以这里只对 after做介绍:

与之关联的事件执行完成之后才出发after触发器。

为shipper(货运公司)表创建一张日志表:

复制代码

1 create table Ship_Log
2 (
3    id int identity(1,1) primary key,
4    op_date datetime default getdate(),
5    op_uaer nvarchar(50),
6    op      nvarchar(50),
7    shipname nvarchar(50),
8    shipphone nvarchar(50)
9 )

复制代码

为表 dbo.Sales.Shipper创建触发器

复制代码

1 create trigger ship_log_trigger
2 on [Sales.Shippers] after insert
3 as
4    --当对上面的表进行 增删改的时候执行 触发器的下面的代码
5    insert into Ship_Log (op_uaer,op,shipname,shipphone)
6    select user_name()--返回当前操作的用户名
7    ,'insert',companyname,phone  from inserted;

复制代码

向表 dbo.Sales.Shipper 中插入数据触发触发器:

1 insert into [Sales.Shippers] (companyname,phone) values('shits','12345678')

查询日志表:

select * from Ship_Log;

查询结果:

已经将日志插入进去了。

DLL触发器

一般用不到。

分为两种:

对数据库的触发(例如:创建表)

对服务器的触发(例如:创建数据库)

8、标识

标识:就是有时我们会将主键设置为标识列(自动增加列),然后查询标识的时候就是查到最新增加的标识列的值。

分为两种:

1、全局范围的:@@identity

2、当前 表 范围的 :SCOPE_IDENTITY();最常用

注意:如果想一张表含有触发器的表中插入数据的话,查询到的结果就是不同(因为向表中插入数据之后,触发器还会再向日志表中插入数据,所以全局标识查到的是日志表中的标识,而 SCOPE_IDENTITY()查到的 插入数据表里的 标识)

1 insert into [Sales.Shippers] (companyname,phone) values('asd','12345');
2 select @@identity;--整个数据库中所有的  最新最新增加的 标识列
3 
4 select SCOPE_IDENTITY();--获得 当前操作的表的最新增加的 标识列的值

如果想没有触发器的 表 插入数据,两个就查询的标识列的值相同

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、索引 ·什么是索引 ·索引的基本原理 ·索引的基本写法 ·索引的分类 ·索引的作用 ·索引的优缺点 ·索引的建立原则 2、存储过程 ·什么是存储过程 ·存储过程的基本写法 ·存储过程的作用 ·存储过程的优缺点 ·存储过程的应用场景 3、触发器 ·什么是触发器 ·触发器的的基本写法 ·触发器的功能 ·触发器的优缺点 ·触发器的两种形式 ·触发器的应用场景 4、视图 ·什么是视图 ·视图的基本写法 ·视图在哪些情况下不能被增、删、改 ·视图的作用 ·视图的优缺点 ·视图的应用场景 5、游标 ·什么是游标 ·游标的作用 ·游标的分类 ·游标的基本用法 ·使用游标的优缺点 ·什么时候选择使用游标 1、 (1)索引是对数据库表中一列或多列进行排序的一种结构。 (2)Mysql中搜索引擎Innodb(聚簇索引)和Mysiam(非聚簇索引)都采用B+,oracle也采用B+树实现 注:聚簇索引:一张表只能建立一个聚簇索引,以主键建立索引。聚簇索引包括主键索引和二级索引(二级索引是在对非主键字段建立索引后,通过索引找到对应这个非主键字段的主键,再进行主键索引,找到B+树中叶子结点);(聚簇索引B+树中叶子结点存放的是数据和指向下一条数据的指针) 非聚簇索引:对主键和非主键字段建立索引时,直接找到B+树中的叶子结点,B+树中叶子结点存放的是对应数据的地址,并通过地址找到数据。 (3)Create index 索引名 on 表名(字段名) (4)索引分为聚簇索引和非聚簇索引 (5)索引的作用 1.创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 2.可以加大数据的检索速度,这也是创建索引的主要原因。 3.可以加速表与表之间的连接效率。 4.在分组排序时使用索引,可以减少分组排序的时间。 (6)索引的优缺点 索引的优点既索引的作用。 索引的缺点:1.建立索引会产生占据一定的空间。2.对表中的数据进行增、删、改的时候,索引也要动态的维护,这就降低了整数的维护速度。 (7)索引的建立原则 1.主外键 2.经常被查询的列 3.用于连接的字段 4.排序分组的字段 2、存储过程 (1)什么是存储过程? 存储过程(Stored Procedure)是一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。 (2)存储过程的基本写法(oracle) Create or replace procedure 名称(参数) Is/as (变量的赋值例如:(a name%type)(a varchar(2))) Begin Sql语句以及判断条件 End 名称; (3)存储过程的作用 1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而 一般SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速 度。 2.当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来 与数据库提供的事务处理结合一起使用。 3.存储过程可以重复使用,可减少数据库开发人员的工作量。 4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权。 (4)存储过程的优缺点 优点: 作用的四条加上 1.分布式工作。 应用程序和数据库的编码工作可以分别独立进行,而不会相互影响。 缺点:1.如果更改范围大到需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则您仍需要更新程序集中的代码以添加参数、更新 GetValue() 调用,等等,这时候估计比较繁琐了。 2.可移植性差 由于存储过程将应用程序绑定到数据库,因此使用存储过程封装业务逻辑将限制应用程序的可移植性。 (5)存储过程的应用场景 1.通常,复杂的业务逻辑需要多条  SQL  语句。这些语句要分别地从客户机发送到服务器,当客户机和服务器之间的操作很多时,将产生大量的网络传输。如果将这些操作放在一个存储过程中,那么客户机和服务器之间的网络传输就会大大减少,降低了网络负载。 3、触发器 (1)什么是触发器 在Oracle中,触发器是一种特殊的存储过程,也是由一组sql语句以及一些业务逻辑代码组成的。数据库可以通过增、删、改来触发触发器。 (2)触发器的基本写法 create or replace trigger tri_adddept AFTER INSERT on dept For each row //表级不用加 declare begin dbms_output.put_line('插入了新部门'); end ; (3)触发器的功能 1.配合sequence实现自增(oracle) 2.提供审计和日志记录 3.写复杂的业务逻辑代码 (4)触发器的优缺点 优点: 1.实现级联更改 2.能过实现比check更严格的约束,与CHECK 约束不同,触发器可以引用其它表中的数据。通过其他表中的数据的变化来设置更加复杂的约束。 缺点:滥用触发器会造成数据库及应用程序的维护困难。 (5)触发器的两种形式(行级触发器,表级触发器) 1.在语法上,行级触发器就多了一句话:for each row 2.在表现上,行级触发器,在每一行的数据进行操作的时候都会触发。 语句级触发器,对表的一个完整操作才会触发一次。 简单的说:行级触发器,是对应行操作的;语句级触发器,是对应表操作的。 (6)应用场景 作用+优点 4、视图 (1)什么是视图? 视图(VIEW)也被称作虚表,即虚拟的表,是一组数据的逻辑表示,其本质是对应于一条SELECT语句,结果集被赋予一个名字,即视图名字。 视图本身并不包含任何数据,它只包含映射到基表的一个查询语句,当基表数据发生变化,视图数据也随之变化。 (2)视图的基本写法 Create view 视图名 as select * from emp; (3)视图在哪些情况下不能被增、删、改 (1)若视图的字段是来自字段表达式或常数,则不允许对此视图执行INSERT、UPDATE操作,允许执行DELETE操作; (2)若视图的字段是来自库函数,则此视图不允许更新; (3)若视图的定义中有GROUP BY子句或聚集函数时,则此视图不允许更新; (4)若视图的定义中有DISTINCT任选项,则此视图不允许更新; (5)若视图的定义中有嵌套查询,并且嵌套查询的FROM子句中涉及的表也是导出该视图的基表,则此视图不允许更新; (6)若视图是由两个以上的基表导出的,此视图不允许更新; (7)一个不允许更新的视图上定义的视图也不允许更新; 本表的行列子集视图一般是可更新的。若视图的属性来自集函数、表达式,则该视图肯定是不可以更新的。 (4)视图的作用 1、视图隐藏了底层的表结构,简化了数据访问操作,客户端不再需要知道底层表的结构及其之间的关系。 2、视图提供了一个统一访问数据的接口。(即可以允许用户通过视图访问数据的安全机制,而不授予用户直接访问底层表的权限) 3、从而加强了安全性,使用户只能看到视图所显示的数据。 4、视图还可以被嵌套,一个视图中可以嵌套另一个视图。 (5) 视图的优缺点 优点:1.简单性。视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使用户不必为以后的操作每次都指定全部的条件。 2.安全性。通过视图用户只能查询和修改他们所能见到的数据。数据库中的其他数据则既看不见也取不到。数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定行和特定的列上。通过视图,用户可以被限制在数据的不同子集上。 3. 逻辑数据独立性。视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。 缺点:1.如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,也要花费一定的时间。 2.修改限制:当用户试图修改视图的某些行时,数据库必须把它转化为对基本表的某些行的修改。对于简单视图来说,这是很方便的,但是,对于比较复杂的视图,可能是不可修改的。 (6)视图的应用场景 1.访问频繁,更新少的一组数据 2.需要对一些数据限制访问权限时 5、游标(cursor) (1)什么是游标 游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标充当指针的作用。尽管游标能遍历结果中的所有行,但他一次只指向一行。 (2)游标的作用 游标的一个常见用途就是保存查询结果,以便以后使用。 (3)游标的分类 游标分为显示游标和隐式游标 隐式游标:是用户操作SQL时自动生成的,而显式游标是在声明块中直接定义的游标。 (4)游标的基本用法 通过ROWCOUNT查看游标指向的行:(隐式游标实例) 例: DECLARE v_count NUMBER; BEGIN SELECT COUNT(*) INTO v_count from dept; --返回一个隐式游标 dbms_output.put_line('SQL%ROWCOUNT = '||SQL%COUNT); END; / 执行结果:SQL%ROWCOUNT = 1 (显式游标基本) DECLARE CURSOR mycur IS SELECT * FROM dept; deptinfo dept%ROWTYPE; BEGIN IF mycur%ISOPEN THEN NULL; ELSE OPEN mycur; END IF; LOOP FETCH mycur INTO deptinfo; EXIT WHEN mycur%NOTFOUND; dbms_output.put_line('部门名称:'||deptinfo.dname); END LOOP; END; (配合for) DECLARE CURSOR mycur IS SELECT * FROM dept; deptinfo dept%ROWTYPE; BEGIN For test in mycur loop EXIT WHEN mycur%NOTFOUND; dbms_output.put_line('部门名称:'||test.dname); END LOOP; END; (5)游标的优缺点 优点: 游标允许应用程序对查询语句select 返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作; 它还提供对基于游标位置而对表中数据进行删除或更新的能力 缺点: 处理大数据量时,效率低下,占用内存大 (6)什么时候选择使用游标? 一般是在循环处理的时候使用。 比如你判断一个班上的同学数学成绩怎么样,你就可能用游标,先把全部的成绩查询到游标中,之后再循环一条条进行判断处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值