本文目录一览:
- 数据库(mysql)关键知识
- 求mysql的游标用法详细说明,最好有例子!!
- mysql怎么使用游标和数据表实现数组功能
- [掌握Python 操作 MySQL 数据库](#掌握Python 操作 MySQL 数据库)
- Mysql存储过程中游标的用法实例
- [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
:只能在一个事务处理内使用。他不能回退CREATE
和DROP
操作。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怎么使用游标和数据表实现数组功能
有两种方法:
- 使用
CHECK TABLE
和REPAIR TABLE
的SQL语句。 - 使用MySQL提供的多个
myisamchk
、isamchk
数据检测恢复工具。前者使用起来比较简便,推荐使用。
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
函数:连接上数据库
输出结果显示如下:表面数据库连接成功
使用 pymysql
的 connect()
方法连接数据库,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 ;
完毕,看懂没,如果没看懂没关系,游标处理是一套固定的格式,按照上面例子中固定的格式套入到你的程序就可以了。