mysql数据库游标的使用,在mysql中使用游标的原因

发布时间:2022-11-21

本文目录一览:

  1. 数据库(mysql)关键知识
  2. 求mysql的游标用法详细说明,最好有例子!!
  3. mysql怎么使用游标和数据表实现数组功能
  4. [掌握Python 操作 MySQL 数据库](#掌握Python 操作 MySQL 数据库)
  5. Mysql存储过程中游标的用法实例
  6. [MySQL 游标的定义与使用](#MySQL 游标的定义与使用)

数据库(mysql)关键知识

Mysql是目前互联网使用最广的关系数据库,关系数据库的本质是将问题分解为多个分类然后通过关系来查询。一个经典的问题是用户借书,三张表,一个用户,一个书,一个借书的关系表。当需要查询某个用户借书情况或者是书被那些人借了,就用关系查询来实现。

关系数据库范式

来自英文Normal form,简称NF。要想设计—个好的关系,必须使关系满足一定的约束条件,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。总共有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。

  • 1NF:是指数据库表的每一列都是不可分割的原子数据项。
  • 2NF:必须满足1NF,要求数据库表中的每行记录必须可以被唯一地区分。
  • 3NF:在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)。
  • BCNF:在3NF基础上,任何非主属性不能对主键子集依赖(在3NF基础上消除对主码子集的依赖),满足BCNF不再会有任何由于函数依赖导致的异常,但是我们还可能会遇到由于多值依赖导致的异常。
  • 4NF:定义很简单:已经是BC范式,并且不包含多值依赖关系。
  • 5NF:处理的是无损连接问题,这个范式基本没有实际意义,因为无损连接很少出现,而且难以察觉。而域键范式试图定义一个终极范式,该范式考虑所有的依赖和约束类型,但是实用价值也是最小的,只存在理论研究中。

Catalog和Schema

是数据库对象命名空间中的层次,主要用来解决命名冲突的问题。从概念上说,一个数据库系统包含多个Catalog,每个Catalog又包含多个Schema,而每个Schema又包含多个数据库对象(表、视图、字段等)。但是Mysql的数据库名就是Schema,不支持Catalog。

Mysql的数据库引擎

主要有两种:MyISAM和InnoDB。

  • MyISAM:支持全文检索。
  • InnoDB:支持事务。

SQL中的通配符

  • %:代表任意字符出现任意次数。
  • _:代表任意字符出现一次。 SQL与正则表达式结合查询一般用在WHERE table_name REGEXP '^12.34'。子查询是从里到外执行。

数据库联结(join)

涉及到外键,外键是指一个表的列是另一个表的主键,那么它就是外键。笛卡尔积联结(不指定联结条件时)生成的记录条目是单纯的第一个表的行乘以第二个表的列数。用得最多的是等值联结也叫内部联结。

高级联结

  • 自连接:是指查询中的两张表是同一张表,它通常作为外部语句用来代替从相同表中检索数据时使用的子查询。
  • 自然联结:使每个列只返回一次。
  • 外部联结:是指联结包含了那些在相关表中没有关联行的行。例如列出所有产品及其订购数量,包括没有人订购的产品。LEFT OUTER JOIN指选择左边表的所有行。

组合查询

是指采用UNION等将两个查询结果取并集。

视图

是查看存储在别处的数据的一种工具,它本身并不包含数据,因此表的数据修改了,视图返回的数据也将随之修改,因此如果使用了复杂或嵌套视图会对性能有较大的影响。视图的作用之一是隐藏复杂的SQL通常会涉及到联结查询。

存储过程

类似于批处理,包含了一条或多条SQL语句。语法:

CREATE PROCEDURE name()
BEGIN
    SQL
END

调用存储过程:

CALL name();

游标有DECLARE定义,游标与存储过程是绑定的,存储过程处理完成,游标就会消失。游标被打开后可以使用FETCH语句访问每一行。

触发器

是在某个时间发生时自动执行某条SQL语句。语法:

CREATE TRIGGER name AFTER INSERT ON table_name FOR EACH ROW

事务处理

可以维护数据库的完整性,保证批量的操作要么完全执行,要么完全不执行。包括事务、回退、提交、保留点几个关键术语。

  • ROLLBACK:只能在一个事务处理内使用。他不能回退CREATEDROP操作。
  • COMMIT:保证事务提交。
  • 复杂的事务处理需要部分提交或回退,因此我们需要使用保留点SAVEPOINT。可以使用ROLLBACK TO savepoint_name。保留点越多越好。保留点在事务执行完成后自动释放。

求mysql的游标用法详细说明,最好有例子!!

先声明一个游标,语法:

DECLARE v_1 VARCHAR(16);
DECLARE v_2 VARCHAR(16);
DECLARE c_XXX CURSOR FOR
SELECT c_1, c_2
FROM t_1;

同时声明一个布尔型的变量FOUND,当循环的条件不成立时,结束循环用的。

DECLARE FOUND BOOLEAN DEFAULT TRUE;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET FOUND = FALSE;

在使用游标的时候,要先打开游标,语法:

OPEN c_XXX;

使用的时候,要先打开游标,取出第一条数据,语法:

FETCH c_XXX INTO v_1, v_2;

然后才开始执行循环,语法:

WHILE FOUND DO
    执行需要执行的语句;
    取下一条数据放到当前游标中,FETCH c_XXX INTO v_1, v_2;
END WHILE;

结束游标,语法:

CLOSE c_cargo;

mysql怎么使用游标和数据表实现数组功能

有两种方法:

  1. 使用CHECK TABLEREPAIR TABLE的SQL语句。
  2. 使用MySQL提供的多个myisamchkisamchk数据检测恢复工具。前者使用起来比较简便,推荐使用。

1. check table 和 repair table

登陆MySQL终端:

mysql -uxxxxx -p dbname

检查表:

CHECK TABLE tabTest;

如果出现的结果说Status是OK,则不用修复,如果有Error,可以用:

REPAIR TABLE tabTest;

进行修复,修复之后可以在用CHECK TABLE命令来进行检查。在新版本的phpMyAdmin里面也可以使用check/repair的功能。

2. myisamchk, isamchk

其中myisamchk适用于MYISAM类型的数据表,而isamchk适用于ISAM类型的数据表。这两条命令的主要参数相同,一般新的系统都使用MYISAM作为缺省的数据表类型,这里以myisamchk为例子进行说明。当发现某个数据表出现问题时可以使用:

myisamchk tablename.MYI

进行检测,如果需要修复的话,可以使用:

myisamchk -of tablename.MYI

关于myisamchk的详细参数说明,可以参见它的使用帮助。需要注意的是在进行修改时必须确保MySQL服务器没有访问这个数据表,保险的情况下是最好在进行检测时把MySQL服务器Shutdown掉。

掌握Python 操作 MySQL 数据库

本文Python 操作 MySQL 数据库需要是使用到 PyMySQL 驱动。 Python 操作 MySQL 前提是要安装好 MySQL 数据库并能正常连接使用,安装步骤详见下文。 注意:安装过程我们需要通过开启管理员权限来安装,否则会由于权限不足导致无法安装。 首先需要先下载 MySQL 安装包,官网下载地址下载对应版本即可,或直接在网上拉取并安装:

  • 权限设置
  • 初始化 MySQL
  • 启动 MySQL
  • 查看 MySQL 运行状态
  • Mysql安装成功后,默认的root用户密码为空,你可以使用以下命令来创建root用户的密码
  • 登陆
  • 创建数据库
  • 查看数据库 PyMySQL 模块使用 pip命令进行安装:
pip install PyMySQL

假如系统不支持 pip 命令,可以使用以下方式安装:

python setup.py install

pymysql.connect函数:连接上数据库 输出结果显示如下:表面数据库连接成功 使用 pymysqlconnect() 方法连接数据库,connect 参数解释如下:

  • conn.cursor():获取游标 如果要操作数据库,光连接数据是不够的,咱们必须拿到操作数据库的游标,才能进行后续的操作,游标的主要作用是用来接收数据库操作后的返回结果,比如读取数据、添加数据。通过获取到的数据库连接实例 conn 下的 cursor() 方法来创建游标,实例如下:
cursor = conn.cursor()

输出结果为:

cursor 返回一个游标实例对象,其中包含了很多操作数据的方法,如执行sql语句,sql 执行命令: execute() 和 executemany()
  • execute(query, args=None)
  • executemany(query, args=None): 其他游标对象如下表: 完整数据库连接操作实例如下:
import pymysql
conn = pymysql.connect(host='localhost', port=3306, user='root', password='123456', database='test')
cursor = conn.cursor()
cursor.execute("SELECT * FROM table")
result = cursor.fetchall()
print(result)

输出结果:

((1, 'test'), (2, 'hello'))

创建表代码如下:

CREATE TABLE table_name (
    id INT PRIMARY KEY,
    name VARCHAR(20)
);

如下所示数据库表创建成功: 插入数据实现代码:

cursor.execute("INSERT INTO table_name VALUES (1, 'test')")

插入数据结果: 查询数据代码如下:

cursor.execute("SELECT * FROM table_name")
result = cursor.fetchall()
print(result)

输出结果:

((1, 'test'),)

DB API中定义了一些数据库操作的错误及异常,下表列出了这些错误和异常: 本文给大家介绍 Python 如何连接 Mysql 进行数据的增删改查操作,文章通过简洁的代码方式进行示例演示,给使用 Python 操作 Mysql 的工程师提供支撑。

Mysql存储过程中游标的用法实例

本文实例讲述了Mysql存储过程中游标的用法。分享给大家供大家参考。具体如下:

1. 批量插入商户路由关联数据:

DELIMITER $$
USE `mmm_mac`$$
DROP PROCEDURE IF EXISTS `批量插入商户路由关联数据`$$
CREATE DEFINER=`root`@`%` PROCEDURE `批量插入商户路由关联数据`()
BEGIN
    DECLARE v_partner_no VARCHAR(32);
    DECLARE v_partner_id INT(11);
    DECLARE v_sc_pid INT(11);
    DECLARE v_mac_no VARCHAR(32);
    DECLARE v_mac_addr VARCHAR(32);
    DECLARE n_mac_no BIGINT;
    DECLARE n_mac_addr BIGINT;
    DECLARE n_mac_addr_str VARCHAR(32);
    DECLARE done INT;
    #取得商户数据
    DECLARE cur_partnerlist CURSOR FOR
    SELECT comp_id, partner_no, sc_pid
    FROM mmm_partner.anl_partner;
    SET n_mac_no = 100000000;
    SET n_mac_addr = 1000000000;
    OPEN cur_partnerlist;
    REPEAT
        FETCH cur_partnerlist INTO v_partner_id,v_partner_no,v_sc_pid;
        SET v_mac_no = CONCAT('MAC',v_sc_pid,n_mac_no);
        SET n_mac_addr_str = CONCAT(SUBSTR(n_mac_addr,1,2),':',SUBSTR(n_mac_addr,3,2),':',SUBSTR(n_mac_addr,5,2),':',SUBSTR(n_mac_addr,7,2),':',SUBSTR(n_mac_addr,9,2));
        SET v_mac_addr = CONCAT('CC:',n_mac_addr_str);
        SET n_mac_no = n_mac_no + 1;
        SET n_mac_addr = n_mac_addr + 1;
        #向t_machine_sc_config表中插入商户关联路由的数据
        #insert into t_machine_sc_config(mac_no, partner_no, partner_id, sc_pid, mac_addr, comp_id, is_lock) values('MAC2016000000001','44060430603381',1,4403,'C8:87:18:AB:79:66',1,1);
        INSERT INTO t_machine_sc_config(mac_no, partner_no, partner_id, sc_pid, mac_addr, comp_id, is_lock)
        VALUES(v_mac_no,v_partner_no,v_partner_id,v_sc_pid,v_mac_addr,1,1);
    UNTIL END REPEAT;
    CLOSE cur_partnerlist;
END$$
DELIMITER ;

2. 更新商户表:

DELIMITER $$
USE `mmm_partner`$$
DROP PROCEDURE IF EXISTS `更新商户表`$$
CREATE DEFINER=`root`@`%` PROCEDURE `更新商户表`()
BEGIN
    DECLARE v_partner_no VARCHAR(32);
    DECLARE vpartner_no VARCHAR(32);
    DECLARE v_partner_id VARCHAR(32);
    DECLARE n BIGINT;
    DECLARE partnerid_list CURSOR FOR
    SELECT comp_id
    FROM 100msh_partner.anl_partner
    WHERE TRIM(partner_no) = '';
    SET vpartner_no = '2015415parno';
    SET n = 10000000;
    OPEN partnerid_list;
    REPEAT
        FETCH partnerid_list INTO v_partner_id;
        SET v_partner_no = CONCAT(vpartner_no,n);
        SET n = n + 1;
        UPDATE mmm_partner.anl_partner
        SET partner_no = v_partner_no
        WHERE comp_id = v_partner_id;
    UNTIL END REPEAT;
    CLOSE partnerid_list;
END$$
DELIMITER ;

希望本文所述对大家的mysql数据库程序设计有所帮助。

MySQL 游标的定义与使用

从字面可以这么理解什么是游标,游标就像是水面上漂浮的一个标记,这个标记可以来回游动,一会游到这里一会游到那里,这里的河水可以理解为是数据的集合,这个标记就是在这些数据间来回游动。 为什么 MySQL 会有游标这个概念,由于 SQL 语言是面向集合的语句,它每次查询出来都是一堆数据的集合,没有办法对其中一条记录进行单独的处理。如果要对每条记录进行单独处理就需要游标。 游标其实就像是编程语言中的 for/foreach 循环,把一个数组(数据的集合)中每条数据一条一条地循环出来,然后你在 for/foreach 循环中使用判断语句对你感兴趣的数据进行处理。 哪里可以使用游标呢?函数、存储过程、触发器中都可以使用。 说完概念,就来看下游标的固定写法。不管概念是否理解,记住下面的固定模式也可以完成搬砖任务。

1. 声明游标

DECLARE cur_name CURSOR FOR SELECT column1, column2 FROM table_name;

SELECT 语句就是正常的查询语句,例如:SELECT id,age FROM table;

2. 打开游标

OPEN cur_name;

在打开游标之前,游标定义的 SQL 语句是不执行的。

3. 取出记录

FETCH cur_name INTO var1, var2;

将当前的记录数据存入变量。 当 FETCH 没有找到记录时会抛出异常,异常的定义需要下面的 HANDLER FOR 语句。 声明游标语句中的 SELECT 如果有多个字段,INTO 后面需要多个变量进行接收。

4. 设置结束条件

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

这个语句的作用是指定一个条件,告诉程序所有数据已经循环完毕,可以结束了。由于游标是使用 WHILE 循环进行每条数据的读取,就需要给 WHILE 一个结束条件。 处理种类:可以是,EXIT 立即结束。CONTINUE 继续下面的处理。 异常的类型:一般指定为 NOT FOUND,意思是没有找到任何数据。 异常发生时的处理:当异常发生时需要做的事情,这里一般改变一个变量的值来记录异常已经发生了,如 SET done = 1

5. 关闭游标

CLOSE cur_name;

实战代码:

DELIMITER $$
CREATE PROCEDURE example_procedure()
BEGIN
    DECLARE v_id INT;
    DECLARE v_name VARCHAR(20);
    DECLARE done INT DEFAULT 0;
    DECLARE cur CURSOR FOR SELECT id, name FROM table_name;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    OPEN cur;
    read_loop: LOOP
        FETCH cur INTO v_id, v_name;
        IF done THEN
            LEAVE read_loop;
        END IF;
        -- 处理逻辑
        SELECT v_id, v_name;
    END LOOP;
    CLOSE cur;
END$$
DELIMITER ;

完毕,看懂没,如果没看懂没关系,游标处理是一套固定的格式,按照上面例子中固定的格式套入到你的程序就可以了。