【Java面试】2024年3月最新面试题系列 之 MySQL

A、mysql事务
事务:Transaction 1、一个最小的不可再分的单元;
                 2、一个完成的业务需要批量的DML(insert、update、delete)语句共同联合完成;
                 3、事务只和DML语句相关,或者说DML语句才有事务。这个和业务逻辑相关,业务逻辑不同,DML语句的个数也不同

1、事物的原理

  这个问题就是问 mysql事务的特性 + 事务的隔离级别
1、任何一条DML语句(insert、update、delete)执行,标志事务的开启
2、结束的标志(提交/回滚)
  提交:成功的结束,将所有的DML语句操作历史记录和底层硬盘数据来一次同步
	回滚:失败的结束,将所有的DML语句操作历史记录全部清空

2、事物的分类

1、扁平事务
2、带有保存点的扁平事务
3、链事务
4、嵌套事务
5、分布式事务

3、事物的特性(ACID)

1、原子性(A):事务是最小单位,不可再分
2、一致性(C):事务要求所有的DML语句操作的时候,必须保证同时成功或者同时失败
3、隔离性(I):事务A和事务B之间具有隔离性
4、持久性(D):是事务的保证,事务终结的标志(内存的数据持久到硬盘文件中)

4、mysql事务的隔离级别

读未提交:read uncommitted 可以脏读、幻读、不可重复读
读已提交:read committed 可以换读、不可重复读,不可脏读
可重复读:repeatable read 只允许幻读,而且在mysql中只支持InnoDB
串行化:serializable 不可脏读、幻读、不可重复读
  
脏读:一个事务读到另外一个事务还没有提交的数据
幻读:一个事务先后读取一个范围的记录,但两次读取的纪录数不同
不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同
B、索引

1、索引的分类

1、普通索引:仅加速查询
2、唯一索引:加速查询 + 列值唯一(可以有null3、主键索引:加速查询 + 列值唯一(不可以有null+ 表中只有一个
4、组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
5、全文索引:对文本的内容进行分词,进行搜索
  
  mysql索引的类型:FULLTEXTHASHBTREERTREE1FULLTEXT:即为全文索引,目前只有MyISAM引擎支持;
  2HASH索引:由于可以一次定位,所以在“=”和“in”条件下效率极高,对于范围查询、排序及组合索引仍然效率不高;
  3BTree索引:是MySQL默认的和最常用的索引类型。
  4RTREE:在MySQL很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAMBDbInnoDbNDbArchive几种。
     相对于BTreeRTree的优势在于范围查找。
  
  
  创建索引的方式:
  1ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL2ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
  3ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现多次。
  4ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。

  每一张表都有一个主键索引

2、为什么索引会快一些?

在存储引擎innoDB中,每一个索引都是一个B+tree,将主键索引称之为聚簇索引,其他非主键索引称为二级索引。表中的每一行的记录值都保存在主键索引 的叶子结点上,二级索引的叶子结点保存的是主键的值。
  
1、如果没有建立索引,就会走全表扫描,即把主键索引上的叶子结点都扫描一遍,然后每扫描一行,就把对应的字段拿出来对比,筛选出满足条件的记录,从而非常低效。
2、如果建立了索引,默认就会走索引字段,然后在索引字段的B+tree上,快速找到满足要求的叶子结点,而这个叶子结点上只保存了主键的值,所以还需要通过获取主键的id值再回到主键索引上查出所有字段的值,这个过程称为回表。但我们可以使用 “覆盖索引” 优化这个过程,就是利用一个包含了所有想要查询的字段的索引,就能减少回表过程,能有效提高查询效率。
  
  即:(在 InnoDB 中数据都是保存在 B+ 树上,主键索引保存了整行记录,二级索引保存了主键的值。一次查询操作,要么是遍历主键索引,要么是遍历二级索引,要么就是先遍历二级索引得到主键 id 的值,然后再到主键索引上通过主键 id 查找满足要求的记录。如果只遍历一次 B+ 树就能获取到我们要的数据,即没有回表过程,这个效率显然是不错的,这就是覆盖索引的优势)

3、主键索引和唯一索引的区别?

1、唯一索引允许有null,而主键索引不允许有null2、主键创建后一定包含一个唯一性索引,唯一性索引并不一定是主键;
3、主键可以被其他表引用为外键,但唯一索引不可以;
4、一张表最多只能有一个主键,但可以有多个唯一索引;
5、主键是逻辑键,唯一索引是物理键,即主键不实际存在,而唯一索引真实存在。

4、如何实现索引优化

1、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的字段上建立索引;
2、尽量避免在 where 子句中对字段进行 null 判断和使用函数操作、对字段进行表达式操作等操作;
3、如果使用的是复合索引,尽量按照创建索引的顺序使用索引,并且尽可能让字段顺序与索引顺序保持一致;
4、尽量避免在拥有大量重复值的字段上建立索引,会导致索引失效;
  
  //sql查询速度慢的原因:
  1、没有索引或者没有用到索引(这是查询慢最常见的问题)
  2I/O吞吐量小,形成了瓶颈效应
  3、没有创建计算列导致查询不优化
  4、内存不足
  5、网络速度慢
  6、查询数据量过大(可以采用多此查询,分库分表)
  7、出现锁或者死锁(也是常见的问题,设计的缺陷)
  8、返回了不必要的行和列
  
  //如何实现sql优化
  1、将数据、日志、索引放在不同的IO设备上,增加读取速度
  2、纵向横向分割表,减少表的尺寸
  3、根据查询条件建立索引,优化索引、优化访问方式,限制结果集的数据量。索引应该尽量小,使用字节数小的咧建索引较好。
  4、提高网速
  5、扩大服务器内存,增加CPU个数
  6、服务器调优及各个参数设置 :调整my.cnf文件

5、索引失效的几种情况

1、索引字段使用了MySQL函数,导致索引失效而进行全表扫描
2、对索引列运算导致索引列失效(+、—、*/<>%%like、or、in、esist)
3、索引列使用了 is null 和 is  not null 导致索引失效
4、没有按照创建顺序查找会导致部分失效
5、or语句前后没有同时使用索引
6、字符串不加单引号导致的索引失效
7、模糊查找的前模糊或全模糊导致的索引失效
8、对单字段建了索引,但where条件多字段
9、建立联合索引,但where条件单字段
10、类型错误,如字段类型时varchar,where条件时number
11、查询表的效率要比应用索引查询快,导致的索引失效

6、联合索引

1、定义:联合索引又叫复合索引,即一个覆盖表中两列或两列以上的索引;
2、创建方式:1、执行alter table语句时创建
              alter table 表名 ADD index 索引名(字段名集合)2、执行create index语句时创建
              create index 索引名 on 表名(字段名集合)3、联合索引遵循最左侧原则,即当创建索引时的第一个字段存在where子句中时,联合索引才有效。
  (如果我们创建了(a,b,c)的复合索引,那么其实相当于创建了(a)(a,b)(a,b,c)三个索引,这被称为最佳左前缀特性。)
4、如果列中包含的有null值,将不会被包含在索引中;
5、复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的,所以我们在数据库设计时尽可能不要让字段的默认值为NULL

7、mysql的聚集索引与非聚集索引有什么区别?

1、聚集索引:数据行的物理顺序和列值(一般是主键列)的逻辑顺序相同,一个表中只能有一个聚集索引。
2、非聚集索引:索引中索引的逻辑顺和磁盘上行的物理存储顺序不同,一个表中可以有多个非聚集索引。

3、区别:
  A、聚集索引中索引的顺序和数据行的物理顺序一致,而非聚集索引中的索引的逻辑顺序和磁盘上行的物理存储顺序不一致;
  B、聚集索引在同一张表中只允许存储一个,非聚集索引可以有多个。

8、Select * from 表名 where a=1&b=2;可以创建索引吗 索引能用吗

创建的是联合索引,并且创建了两个索引索引{a},{a,b},只有当使用这两个索引时才有效。

9、一个表里是不是索引搞的越多越好?

1、表索引的特点:在一个索引B+树中,数据页/索引页里面的记录都是组成一个单向链表的,而且是按照数据大小有序排列的;然后数据页/索引页互相之间都是组成双向链表的,而且也都是按照数据大小有序排列的,所以其实B+树索引是一个完全有序的数据结构,无论是页内还是页之间。
2、索引的缺点:1、空间上而言,要是给很多字段创建很多的索引,那必须会有很多棵索引B+树,每一棵B+树都要占用很多的磁盘空间啊!所以要是搞的索引太多了,是很耗费磁盘空间的;
  					 2、时间层面上,在进行增删改查的时候,每次都需要维护各个索引的数据有序性,因为每个索引B+树都要求页内是按照值大小排序的,页之间也是有序的,下一个页的所有值必须大于上一个页的所有值!所以不停的增删改查,必然会导致各个数据页之间的值大小可能会没有顺序,比如下一个数据页里插入了一个比较小的值,居然比上一个数据页的值要小!此时就没办法了,只能进行数据页的挪动,维护页之间的顺序。或者是不停的插入数据,各个索引的数据页就要不停的分裂,不停的增加新的索引页,这个过程都是耗费时间的。所以要是一个表里搞的索引太多了,很可能就会导致增删改的速度就比较差了,也许查询速度确实是可以提高,但是增删改就会受到影响,因此通常来说,是不建议一个表里搞的索引太多的!
C、SQl调优

1、怎么优化SQL

1、将数据、日志、索引放在不同的IO设备上,增加读取速度
2、纵向横向分割表,减少表的尺寸
3、根据查询条件建立索引,优化索引、优化访问方式,限制结果集的数据量。索引应该尽量小,使用字节数小的列建索引较好。
4、提高网速
5、扩大服务器内存,增加CPU个数
6、服务器调优及各个参数设置 :调整my.cnf文件

//开启慢日志查询,设置sql语句的执行时间,查看具体语句
D、主键

1、主键生成的策略

通过JPA@GeneratedValue 注解生成,有 strategy,generator 两个参数
generator:定义了主键生成器的名称,默认是空字符串;
strategy:表示主键生成器的类型,有四种:TABLE, SEQUENCE, IDENTITYAUTO。定义在 GenerationType 枚举类中

2、主键策略都有什么

JPA为开发人员提供了四种逐渐生成策略,被定义在GenerationType枚举类中。
1TABLE:持久化引擎使用一个特定的数据库表格来保存主键,好处是不依赖于外部环境和数据库的具体实现,在不同的数据库间很容易进行数据移植,但由于不能充分利用数据库的特性,所以不会优先使用。常和@TableGenerator注解一起使用。
2SEQUENCE:对于一些不支持主键自增长的数据库,提供了“序列(Sequence)”的机制生成主键。只支持部分数据库(oracle、DB2)。常和@SequebceGenerator注解一起使用。
3IDENTITY:主键自增长生成策略
4AUTO:是JPA默认的生成策略,是把主键生成策略交给持久化引擎,持久化引擎根据上面的三种主键生成策略选择其中一种。
E、MyCat

1、分库分表怎么使用

A、常用策略 之 连续分片:
  1、按照日期范围分片  2、按照自然月分片  3、按照自定义数字范围分片
B、常用策略 之 离散分片:
  1、枚举分片:通过在配置文件中配置的枚举ID,自己配置分片;
  2、数字取模分片:根据数据表的某一字段,通常是某一整数字段,对其进行十进制的求模运算,将运算结果作为Mycat的路由结果;
  3、字符串Hash解析分片;
  4、一致性Hash分片;
  5、程序指定分区分片
   
//分片后可能出现的问题:
  问题1、跨库JOIN的问题:由于两个表的数据分库,相关联的数据可能分布在不同的DB节点上,导致查询失败;
  	解决方案:1、设计时考虑应用层的JOIN问题
            2、在服务层调用,不要在for循环中调用,可以传一个list
            3、利用好全局表、ER关系表
            4、做好字段冗余,利用空间换时间
 
  问题2、跨分片数据库排序分页问题:在mycat执行分页操作时,必须要加上排序条件才能保证结果的正确性,从而导致最终需要查询更多的结果集,消耗了更多的资源。
  	解决方案:1、向多台数据库sever均发送一个查询请求,然后对所有的查询结果进行汇总,在处理逻辑分页;
            2、建立一个总数据库,只维护主键和必要的索引,供分页查询;
            3、使用redis维护一个主键序列。分页操作就是截取该序列的一部分,其结果就是主键id的结果集。拿到id以后便可以映射到多台mysql服务器中查询数据了。由于数据被分布式系统存储,所以获取完整的结果集必须多次、多台数据哭的访问。
  
  问题3、全局序列问题:如果主键是自增长类型,分库分表以后,在分布式系统下,每一个库下的增长都各自分离,从而导致不同数据库下的id可能重复,从而无法保证自增主键的全剧唯一。
  解决方案:mycat提供了全局sequence,并提供了包含本地配置和数据库配置等多种实现方式
  				1、本地文件:本地加载,读取速度快。但会造成mycat重启后,配置文件中的sequence恢复初始值,下次操作序列重复
  				2、数据库:mycat重启,sequence不会被初始化,但是当存储sequence的数据库挂了,会出现单点障碍
  				3、时间:不会出现上面的问题,但数据类型太长了,建议采用bigint
   
  扩展方式:1、雪花算法:时间序列+机器编码+技术顺序号
  				2UUID:由于值比较大,索引比较大,所以性能较低
  				3、数据库表:专门一个表存储id
  				4、zookeeper:递增id
  
  问题4、分布式事务问题:无法保证事务的一致性。
  解决方案:设计使用Mycat时,如果有分布式事务,需要先确认是否需要保证事务的强一致性。如果需要,就考虑放弃使用Mycat

2、分库分表的水平拆分与垂直拆分

1、垂直拆分:解决单表列过多的问题(例如 订单系统表 --> 用户表 + 支付系统表)
  A、垂直切分的优点:
		1、解决业务系统层面的耦合,业务清晰
		2、与微服务的治理类似,也能对不同业务的数据进行分级管理,维护,监控,扩展等。
		3、高并发场景下,垂直切分一定程度的提升IO,数据库连接数,单机硬件资源的瓶颈。
	B、垂直切分的缺点
		1、部分表无法join,只能通过接口聚合方式解决,提升了开发的复杂度。
		2、分布式事处理复杂
		3、依然存在单表数据量过大的问题。

2、水平拆分:解决单表数据量过大的问题,拥有相同的列
  A、水平切分优点
		1、不存在单库数据量过大、高并发的性能瓶颈,提升系统稳定性和负载能力。
		2、应用端改造较小,不需要拆分业务模块。
	B、水平切分缺点
		1、跨分片的事务一致性难以保证
		2、跨库的join关联查询性能较差
		3、数据多次扩展维度和维护量极大。
F、Join

1、left join后面的on与where有什么区别

on后面直接加条件的话,不会对左边的表产生影响,on条件是在左关联时候的条件,不管如何都会返回左边表中的记录;
where加条件,才会对左边的表产生影响,where条件是关联查询之后的条件。

2、left join给你2张表,select * 问最后查询到的数据是什么?

left join 关联查询,最终结果是左边表的全部数据,右表只选择跟左表相同的数据

3、mysql中 join连接查询 和 union联合查询 的区别

join连接查询:是将两个查询的每一行,以“两两横向对接”的方式进行查询,所得到的是所有行的结果,得到一个新行。
union联合查询:是将2个或2个以上的字段数量相同的查询结果,纵向堆叠并合并成一个新的结果
G、mysql

1、回表

就是mysql内部需要进行两次查询。mysql中的每个节点都是以B+tree存在,查询时先通过索引键,得到的索引下的B+tree的叶子结点的值是主键索引的向,然后在映射查询主键索引对应的id,然后再通过主键索引的id查询索引键没有查询到的内容,得到对应索引全部的字段,这个过程称为回表。

2、mysql查询的过程

1、客户端发送一条查询给服务器
2、服务器先检查缓存,如果命中缓存,则返回数据
3、如果在缓存中没有命中数据,服务器进行sql解析预处理,再有优化器生成对应的执行计划;
4、mysql根据优化器生成的执行计划,调用存储引擎的API来执行查询;
5、将查询的结果返回给客户端。
  
  查询缓存:在解析一个查询语句前,如果缓存是打开的,那么mysql会优先检查这个查询是否命中查询缓存中的数据,如果没有命中,则进入下一阶段处理。如果命中,则会检查用户的权限,如果权限满足,mysql会跳过其他阶段,直接拿数据返回给客户端。

3、innoDB与myISAM区别

1InnoDB支持事物,而MyISAM不支持事物,不具有原子性
2InnoDB支持行级锁,而MyISAM支持表级锁
3InnoDB支持外键,而MyISAM不支持
4InnoDB不支持全文索引(5.5以前),而MyISAM支持
5InnoDB删除表时一行一行的删除,而MyISAM删除表时,是先drop表,再重建表
6InnoDB表格很难被压缩,而MyISAM表格可以被压缩

4、一张表有订单号,日期,名称,查出大于100条数据的订单日期

  select count(订单日期) from 表名 group by 订单日期 having count(订单日期) > 100;

5、知道引用类型和值型吗

1、值类型:就是基本数据类型  byteshortintcharlongfloatdoubleboolean
	 引用类型:就是基本数据类型意外的其他类型 数组、字符串、接口、类等
2、值传递:属于数据类型的赋值,是传递原参数的备份,值传递后,实参传递给行参的值,行参发生改变实参不变;
   引用类型传递:传递的是地址,行参改变会改变实参变量的值
3、内存分配:
  值类型:值类型的数据存放在栈中,由栈分配内存空间,其值代表的是数据本身。值类型的数据有较快的存取速度
  引用类型:一个引用类型的数据的值会存放在堆中,变量名会存放在栈中,变量名在栈中的内容是值在堆中的地址。变量赋值或者传递的时候,是复制栈中的内容,也就是复制对应变量在堆中的地址

6、mysql的分组函数

功能:用作统计使用,又称为聚合函数
分类:求和(sum)、求平均值(avg)、求最大值(max)、求最小值(min)、计算个数(count)
特点:1、sum、avg一般用于处理数值型,max、min、count可以处理任何类型
		 2、所有的分组函数都忽略null值(null和任何数相加都为null3、分组函数可以喝distinct()搭配实现去重的运算
     4、和分组函数一同查询的字段要求是group by后的字段

7、mysql死锁问题,如何避免?

1、产生原因:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。
  产生死锁的原因主要是:1、系统资源不足。 
                    2、进程运行推进的顺序不合适。 
                    3、资源分配不当等。 
  
  产生死锁的四个必要条件:1、互斥条件:一个资源每次只能被一个进程使用。 
                      2、请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 
                      3、不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。 
                      4、循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。 
2、如何避免:1、按同一顺序访问对象。 
           2、避免事务中的用户交互。 
           3、保持事务简短并在一个批处理中。 
           4、使用低隔离级别。 
           5、使用绑定连接。 

8、mysql的存储过程

1、存储过程:是在大型数据库系统中,一组为了完成特定功能的sql语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户可以通过指定存储过程的名字并给出参数(如果有参数)来执行。存储过程是数据库中的一个重要的对象。
2、存储过程的特点:1、能完成较复杂的判断和运算
                2、可编程行强,灵活
                3SQL编程的代码可重复使用
                4、执行的速度相对快一些
                5、减少网络之间的数据传输,节省开销 
3、创建一个简单的存储过程:1、create procedure 名称() begin...end;
                       2、调用 call 名称;

9、MySQL悲观锁和乐观锁的实现方式

乐观锁:更新时带上版本号,使用的是 CAS比较加交换 的方式
悲观锁:mysql使用共享锁和排他锁来实现悲观锁
       select…lock in share mode(共享锁)
       select…for update(排他锁)

10、数据库的时间精度

数据库的时间精度由datetime、timestamp来决定,精确度都是秒。
datetime与时区无关,存储的范围广(1001-9999),
timestamp与时区有关,存储的范围小(1970-2038)
H、锁

1、行锁、表锁

mysql的锁中行锁:共享锁、排他锁
mysql的锁中表锁:意向共享锁、意向排他锁

2、mysql数据库的锁

1、共享锁(行):可以让多个事务同时对数据进行访问,但不能修改;
  select语句 + LOCK IN SHARE MOD2、排他锁(行):当一个事务持有一行数据的排他锁时,其他事务不能访问和修改这一行数据;
  select语句 + FOR update(innoDB默认update、delete、insert拥有排他锁)
3、意向共享锁(表):在事务对某一行加共享锁时,要先给该表加上意向共享锁;
4、意向排它锁(表):在事务对某一行数据加排它锁时,必须要先给该表加上意向排它锁;
	作用:当某一个事务需要去锁表时,不用判断每一行上是否有不兼容的锁,只需要判断有没有意向锁。如写操作锁表,判断某行数据是否存在共享锁,如果拿不到意向锁就可直接阻塞操作。
5、自增锁:针对自增列自增长的一个特殊的表级别锁。

//行锁实现有三种算法  
临键锁next-key、间隙所gap 和 记录锁record。不可重复读使用的是临健锁作为行锁的实现算法。
  InnoDB的行锁是通过给索引上的索引项加锁来实现的。只有通过索引条件进行数据检索,InnoDB才使用行级锁,否则InnoDB将使用表锁(锁住全部索引)。

1、临键锁next-key:当sql语句按照范围查询,并且有数据命中的时候会给索引加上临键锁,锁住命中索引项的前一个索引到命中索引项的后一个索引之间的一个左开右闭区间。因为锁住区间,所以避免了幻读。
2、间隙锁gap:当sql语句查找未命中时,会锁住查询条件值附近的间隙。
3、记录锁record:使用唯一索引查询并精准匹配到数据,则只会锁住该索引项。
这三种算法锁的原理基于b+tree索引。

3、mysql中的死锁是如何产生的?如何解决、那些指令会造成死锁

1、产生条件:事务并发时,每个事务都持有锁或者已经在等待锁,每个事务都需要再继续持有锁,然后事物之间产生加锁的循环等待,形成死锁。
2、如何避免:A、类似的业务逻辑以固定的顺序访问表和行。
           B、大事务拆小。大事务更倾向于死锁,如果业务允许,将大事务拆小。
           C、在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁概 率。
           D、降低隔离级别,如果业务允许,将隔离级别调低也是较好的选择 。
           E、为表添加合理的索引。可以看到如果不走索引将会为表的每一行记录添加上锁(或者说是表锁)
           F、给锁加上等待超时时间  innodb_lock_wait_timeout
3、造成死锁的指令:
  select *  ...for update
  select *  ...LOCK IN SHARE MODE
I、游标

1、作用

游标可以时用户可逐行访问由SQl server返回的结果集,使用游标是为了把集合操作转换成单个记录处理方式,结果放在内存中的一块区域,且是一个含有多个记录的集合,可以按照用户自己的意愿来显示和处理这个记录;

2、优点

1、允许程序对由查询语句返回的行集合中的每一行执行相同或者不同的操作,而不是对整行执行同一个操作;
2、提供对基于游标位置的表中的行进行删除和更新的操作;
3、用来沟通面向集合的数据管理系统和面向行的程序设计的。

3、原理

游标就是把数据按照指定的要求提取出响应的数据集,然后逐条进行数据处理;

4、特点

1、只可以读,不能更新;
2、不滚动;
3、不敏感,意味着浏览器可以用但不可以复制它的结果集。

5、使用游标的顺序

申明游标、打开游标、读取数据、关闭游标、删除游标

持续更新中。。。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栈、小生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值