此次介绍mysql
以及在python
中如何用pymysql
操做数据库, 以及在mysql
中存储过程, 触发器以及事务的实现, 对应到pymysql
中应该如何操做.
'-----------------------------------------------------------------'python
cmd
窗口中展现常见的sql
命令链接数据库 mysql -u root -p password -h (localhost)
mysql
显示数据库 show databases;
linux
create database pymysql_db default charset utf8 collate utf8_general_ci;
use pymysql_db;
显示当前数据库全部的表 show tables;
sql
'-----------------------------------------------------------------'数据库
userinfo
建立表以下ide
-- 建立一个名为userinfo的表 CREATE TABLE `userinfo` ( `nid` INT (11) NOT NULL AUTO_INCREMENT, `name` VARCHAR (32) DEFAULT NULL, `color_nid` INT (11) DEFAULT NULL, PRIMARY KEY (`nid`), CONSTRAINT `userinfo_ibfk_1` FOREIGN KEY (`color_nid`) REFERENCES `color` (`nid`) ) ENGINE = INNODB DEFAULT CHARSET = utf8;
删除表内容(自增也清零) truncate table 表名函数
修改表结构oop
- 增长一列 alter table 表名 add 列名 类型
- 删除一列 alter table 表名 drop column 列名
- 修改列类型 alter table 表名 modify column 列名 新类型;
- 修改列名称和列类型(类型保持不变也可) alter table 表名 change 原列名 新列名 类型;
删除默认值 alter table 表名 alter 列名 drop default;性能
'-------------------------------------------------------------'fetch
'----------------------------------------------------------------'
- select A.xx B.oo from A, B where A.x=B.o 没有A.x=B.o对应的数据则不显示任何结果
- select A.xx B.oo from A inner join B where A.x=B.o A和B具备对等位置, 没有A.x=B.o对应的数据则不显示任何结果
- select A.xx B.oo from A left join B where A.x=B.o A表显示全部, 对于B表若无符合A.x=B.o的数据则其值为null来显示
- select A.xx B.oo from B right join A where A.x=B.o A表显示全部, 对于B表若无符合A.x=B.o的数据则其值为null来显示
'---------------------------------------------------------------'
在介绍触发器,存储过程,函数以及事务以前咱们先简单的过一下mysql
中的条件和循环语句
if 条件 then 普通sql语句; elseif 条件 then 普通sql语句; else 普通sql语句; end if;
- while循环
while 条件 do 普通sql语句; end while;
- loop循环
loop_label:标签名 普通sql语句; - -继续循环 iterate loop_label; - - 跳出循环 leave loop_label; end loop;
'---------------------------------------------------------------'
-- 定义结束符为$$, 在mac和linux中颇有必要 delimiter $$ -- 若是存在tri_before_update_userinfo触发器则删除, 方便调试和修改 DROP TRIGGER if EXISTS tri_before_update_userinfo $$ -- 建立tri_before_update_userinfo触发器, 该触发器会在更新userinfo表以前执行begin和end之间的内容(before表示以前, after表示以后) CREATE TRIGGER tri_before_update_userinfo BEFORE UPDATE ON userinfo FOR EACH ROW BEGIN -- 若是在userinfo表中更改name为tom的行则会在color表中插入一行(old表示原来的数据) IF old.name = 'tom' THEN INSERT INTO color(tag) VALUES('black'); -- 若是在userinfo表中有name修改后为cc则会在color表中插入一行(new表示修改后的数据) ELSEIF new.name = 'cc' THEN INSERT INTO color(tag) VALUES('yellow'); END IF; end $$ delimiter ;
'-------------------------------------------------------------------'
DELIMITER $$ DROP PROCEDURE IF EXISTS p1 $$ CREATE PROCEDURE p1( IN in_1 INT, INOUT inout_1 INT, OUT out_1 INT ) BEGIN - - 声明语句块中的临时变量 DECLARE tmp_in_1 INT; DECLARE tmp_inout_1 INT; - -赋值语句 SET tmp_in_1 = in_1; SET tmp_inout_1 = inout_1; SET out_1 = tmp_in_1 + tmp_imout_1; - - 正常的esql查询语句 SELECT * FROM userinfo LIMIT in_1, onout_1; END $$ DELIMITER;
-- 设置用户变量传值,in类型可不用变量传值, out类型不能传入值, -- set @in_1_tmp=1; set @inout_1_tmp=3; -- 调用存储过程, 传入参数 CALL p1 (1,@inout_1_tmp,@out_1_tmp); -- 取得存储过程的执行结果, 包括sql语句结果集以及变量值(in, inout以及out类型变量都能取得他们的值) SELECT @in_1,@inout_1_tmp,@out_1_tmp;
DROP procedure 存储过程名
’--------------------------------------------------------------‘
- 普通索引 index : 仅仅加速查询, 无约束
- 惟一索引 unique : 加速查询, 指定的列不能重复, 可出现一次null
- 主键索引 primary key : 加速查询, 列值惟一切不能为null
- 组合索引 : 多列做为共同体组成索引, 效率高于多个索引列合并查询
- 全文索引: 数据库存储时候对存储内容进行分词存储便于搜索查询
查看当前表那些字段有索引 SHOW INDEX FROM userinfo;
如下状况即便建立了索引也不会使用索引:
- %开头的模糊匹配条件: select * from 表名 where 列名 like '%其余';
对创建索引的列使用函数查询: select * from 表名 where 函数名(列名) = 其余条件- 列类型匹配错误的条件查询时候 : select * from 表名 where 列名 = 不正确的类型;
- 当or条件中含有未创建索引的列时: select * from 表名 where 条件01 or 条件02';
- 匹配条件为不等于时候(主键例外) : select * from 表名 where 非主键列 != 其余;
- 匹配条件为大于的时候(主键或索引为整型例外) : select * from 表名 where 列名 > 其余;
- 排序时候选择的映射与排序列不同即便都是索引列也不走索引(主键例外) : select 索引列-01 from 表名 order by 索引列-02 desc;
- 组合索引为 索引列-01和索引列-02, 当先查索引列-02时候也不走索引
用执行计划能够详细显示sql语句(使用查询语句才有意义)的执行状况, 例如如执行EXPLAIN SELECT * from userinfo;
关于上述表中详细字段解释 :
- id 查询顺序标识, 表示sql查询语句的执行顺序
- select_type 查询语句的类型: 简单查询SIMPLE, 最外层查询PRIMARY, 子查询DERIVED, 映射是子查询SUBQUERY, 联合查询UNION, 联合查询所得UNION RESULT
- table 正在访问的表名
- partitions 分区类型
- type 查询方式, 查询时间性能排序 : 全表扫描all > 全索引扫描index > 索引部分范围内扫描range > 多单列索引合并扫描index_merge > 索引匹配一个或多个值扫描ref > 联合主键索引或者惟一索引扫描eq_ref > 最多有一个匹配行优化后做为常量表扫描const, 还有system特列, 性能与const近似
- possible_keys 可能使用的索引
- key 实际使用的索引
- key_len 字节长度
- rows 预测找到所需内容要查找的行数
- extra 其余信息, 多为mysql解决查询的详细信息
-- 查询第1000条数据以后的10条数据 -- 这种查询方式会进行全文扫描 SELECT * FROM userinfo LIMIT 1000,5; -- 这种方式仅仅优化了一点, 使用了一些普通索引和索引合并查询 EXPLAIN SELECT * FROM userinfo WHERE nid > (SELECT nid FROM userinfo LIMIT 1000, 1) LIMIT 5; -- 直接根据计算所得后的最大条数倒序排列查询 SELECT * FROM userinfo WHERE nid < 上次最大条数 ORDER BY nid DESC LIMIT 5;
- 查看全局变量 show global variables like "%名称"
- 设置全局变量 set global 变量名=值
- 是否开启慢日志全局变量 slow_query_log = OFF
- 时间限制全局变量 long_query_time = 2
- 日志文件存放位置全局变量 slow_query_log_file = /usr/slow.log
- 是否记录未使用索引的查询语句全局变量 log_queries_not_using_indexes = OFF
- 版本 -v或者--verbose
- 调试模式 -d或者--debug
- 排序方式 -s 规则选项, 默认是平均查询时间at
- 倒序排列显示 -r
- 显示前number条 -t number
- 不要将sql中数字转换成N,字符串转换成S, 选项为, -a
'----------------------------------------------------------------'
#!/usr/bin/env python # -*- coding:utf-8 -*- import pymysql # 建立链接通道, 设置链接ip, port, 用户, 密码以及所要链接的数据库 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='pymysql_db') # 建立游标, 操做数据库, 指定游标返回内容为字典类型 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 调用存储过程, 传入参数 cursor.callproc('p1', (1, 5, 0)) # 获得结果集1, 即sql语句执行结果 select_result = cursor.fetchone() print(select_result) # 执行存储过程, 获取返回值, @_存储过程名_第一个参数 cursor.execute("select @_p1_0,@_p1_1,@_p_2") select_result = cursor.fetchone() print(select_result) cursor.close() conn.close()