Python_MySQL
一 数据库操作;
1、显示数据库
1 SHOW DATABASES;
2、创建数据库
1 # utf-8 2 CREATE DATABASE 数据库名称 DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 3 4 # gbk 5 CREATE DATABASE 数据库名称 DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;
3、使用数据库
1 USE db_name;
显示当前使用的数据库中所有表:SHOW TABLES;
4、用户管理
创建用户 create user '用户名'@'IP地址' identified by '密码'; 删除用户 drop user '用户名'@'IP地址'; 修改用户 rename user '用户名'@'IP地址'; to '新用户名'@'IP地址';; 修改密码 set password for '用户名'@'IP地址' = Password('新密码') PS:用户权限相关数据保存在mysql数据库的user表中,所以也可以直接对其进行操作(不建议)
5、授权管理
1 show grants for '用户'@'IP地址' -- 查看权限 2 grant 权限 on 数据库.表 to '用户'@'IP地址' -- 授权 3 revoke 权限 on 数据库.表 from '用户'@'IP地址' -- 取消权限
二 数据表基本操作
1、创建表
1 create table 表名( 2 列名 类型 是否可以为空, 3 列名 类型 是否可以为空 4 )ENGINE=InnoDB DEFAULT CHARSET=utf8
2、删除表
1 drop table 表名
3、清空表
1 delete from 表名 2 truncate table 表名
4、修改表
添加列:alter table 表名 add 列名 类型 删除列:alter table 表名 drop column 列名 修改列: alter table 表名 modify column 列名 类型; -- 类型 alter table 表名 change 原列名 新列名 类型; -- 列名,类型 添加主键: alter table 表名 add primary key(列名); 删除主键: alter table 表名 drop primary key; alter table 表名 modify 列名 int, drop primary key; 添加外键:alter table 从表 add constraint 外键名称(形如:FK_从表_主表) foreign key 从表(外键字段) references 主表(主键字段); 删除外键:alter table 表名 drop foreign key 外键名称 修改默认值:ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000; 删除默认值:ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
三 表内容操作
1、增
1 insert into 表 (列名,列名...) values (值,值,值...) 2 insert into 表 (列名,列名...) values (值,值,值...),(值,值,值...) 3 insert into 表 (列名,列名...) select (列名,列名...) from 表
2、删
1 delete from 表 2 delete from 表 where id=1 and name='alex'
3、改
1 update 表 set name = 'alex' where id>1
4、查
1 select * from 表 2 select * from 表 where id > 1 3 select nid,name,gender as gg from 表 where id > 1
5、条件查询
1 select * from 表 where id > 1 and name != 'alex' and num = 12; 2 select * from 表 where id between 5 and 16; 3 select * from 表 where id in (11,22,33) 4 select * from 表 where id not in (11,22,33) 5 select * from 表 where id in (select nid from 表)
6、通配符查询
select * from 表 where name like 'ale%' - ale开头的所有(多个字符串) select * from 表 where name like 'ale_' - ale开头的所有(一个字符)
7、限制查询
1 select * from 表 limit 5; - 前5行 2 select * from 表 limit 4,5; - 从第4行开始的5行 3 select * from 表 limit 5 offset 4 - 从第4行开始的5行
8、排序
1 select * from 表 order by 列 asc - 根据 “列” 从小到大排列 2 select * from 表 order by 列 desc - 根据 “列” 从大到小排列 3 select * from 表 order by 列1 desc,列2 asc - 根据 “列1” 从大到小排列,如果相同则按列2从小到大排序
9、分组
1 select num from 表 group by num 2 select num,nid from 表 group by num,nid 3 select num,nid from 表 where nid > 10 group by num,nid order nid desc 4 select num,nid,count(*),sum(score),max(score),min(score) from 表 group by num,nid 5 select num from 表 group by num having max(id) > 10 6 7 特别的:group by 必须在where之后,order by之前
10、链接表(inner, outer, left, right)
1 无对应关系则不显示 2 select A.num, A.name, B.name 3 from A,B 4 Where A.nid = B.nid 5 6 无对应关系则不显示 7 select A.num, A.name, B.name 8 from A inner join B 9 on A.nid = B.nid 10 11 A表所有显示,如果B中无对应关系,则值为null 12 select A.num, A.name, B.name 13 from A left join B 14 on A.nid = B.nid 15 16 B表所有显示,如果B中无对应关系,则值为null 17 select A.num, A.name, B.name 18 from A right join B 19 on A.nid = B.nid
11、组合
1 组合,自动处理重合 2 select nickname 3 from A 4 union 5 select name 6 from B 7 8 组合,不处理重合 9 select nickname 10 from A 11 union all 12 select name 13 from B
四 视图
视图是一个虚拟表(非真实存在),其本质是【根据SQL语句获取动态的数据集,并为其命名】,用户使用时只需使用【名称】即可获取结果集,并可以将其当作表来使用。
1 SELECT 2 * 3 FROM 4 ( 5 SELECT 6 nid, 7 NAME 8 FROM 9 tb1 10 WHERE 11 nid > 2 12 ) AS A 13 WHERE 14 A. NAME > 'alex'; 15 16 临时表搜索
1、创建视图
1 --格式:CREATE VIEW 视图名称 AS SQL语句 2 CREATE VIEW v1 AS 3 SELET nid, 4 name 5 FROM 6 A 7 WHERE 8 nid > 4
2、删除视图
DROP VIEW v1
3、修改视图
1 -- 格式:ALTER VIEW 视图名称 AS SQL语句 2 3 ALTER VIEW v1 AS 4 SELET A.nid, 5 B. NAME 6 FROM 7 A 8 LEFT JOIN B ON A.id = B.nid 9 LEFT JOIN C ON A.id = C.nid 10 WHERE 11 A.id > 2 12 AND C.nid < 5
4、使用视图
使用视图时,将其当作表进行操作即可,由于视图是虚拟表,所以无法使用其对真实表进行创建、更新和删除操作,仅能做查询用。
1 select * from v1
五 触发器
对某个表进行【增/删/改】操作的前后如果希望触发某个特定的行为时,可以使用触发器,触发器用于定制用户对表的行进行【增/删/改】前后的行为。
1、创建基本语法
1 # 插入前 2 CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW 3 BEGIN 4 ... 5 END 6 7 # 插入后 8 CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW 9 BEGIN 10 ... 11 END 12 13 # 删除前 14 CREATE TRIGGER tri_before_delete_tb1 BEFORE DELETE ON tb1 FOR EACH ROW 15 BEGIN 16 ... 17 END 18 19 # 删除后 20 CREATE TRIGGER tri_after_delete_tb1 AFTER DELETE ON tb1 FOR EACH ROW 21 BEGIN 22 ... 23 END 24 25 # 更新前 26 CREATE TRIGGER tri_before_update_tb1 BEFORE UPDATE ON tb1 FOR EACH ROW 27 BEGIN 28 ... 29 END 30 31 # 更新后 32 CREATE TRIGGER tri_after_update_tb1 AFTER UPDATE ON tb1 FOR EACH ROW 33 BEGIN 34 ... 35 END
1 delimiter // 2 CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW 3 BEGIN 4 5 IF NEW. NAME == 'alex' THEN 6 INSERT INTO tb2 (NAME) 7 VALUES 8 ('aa') 9 END 10 END// 11 delimiter ; 12 13 插入前触发器
1 delimiter // 2 CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW 3 BEGIN 4 IF NEW. num = 666 THEN 5 INSERT INTO tb2 (NAME) 6 VALUES 7 ('666'), 8 ('666') ; 9 ELSEIF NEW. num = 555 THEN 10 INSERT INTO tb2 (NAME) 11 VALUES 12 ('555'), 13 ('555') ; 14 END IF; 15 END// 16 delimiter ; 17 18 插入后触发器
NEW表示即将插入的数据行,OLD表示即将删除的数据行。
2、删除触发器
DROP TRIGGER tri_after_insert_tb1;
3、使用触发器
insert into tb1(num) values(666)
六 储存过程
存储过程是一个SQL语句集合,当主动去调用存储过程时,其中内部的SQL语句会按照逻辑执行。
1、创建存储过程
-- 创建存储过程 delimiter // create procedure p1() BEGIN select * from t1; END// delimiter ; -- 执行存储过程 call p1() 无参数存储过程
对于存储过程,可以接收参数,其参数有三类:
- in 仅用于传入参数用
- out 仅用于返回值用
- inout 既可以传入又可以当作返回值
1 -- 创建存储过程 2 delimiter \\ 3 create procedure p1( 4 in i1 int, 5 in i2 int, 6 inout i3 int, 7 out r1 int 8 ) 9 BEGIN 10 DECLARE temp1 int; 11 DECLARE temp2 int default 0; 12 13 set temp1 = 1; 14 15 set r1 = i1 + i2 + temp1 + temp2; 16 17 set i3 = i3 + 100; 18 19 end\\ 20 delimiter ; 21 22 -- 执行存储过程 23 set @t1 =4; 24 set @t2 = 0; 25 CALL p1 (1, 2 ,@t1, @t2); 26 SELECT @t1,@t2; 27 28 有参数的存储过程
1 delimiter // 2 create procedure p1() 3 begin 4 select * from v1; 5 end // 6 delimiter ; 7 8 1. 结果集
1 delimiter // 2 create procedure p2( 3 in n1 int, 4 inout n3 int, 5 out n2 int, 6 ) 7 begin 8 declare temp1 int ; 9 declare temp2 int default 0; 10 11 select * from v1; 12 set n2 = n1 + 100; 13 set n3 = n3 + n1 + 100; 14 end // 15 delimiter ; 16 17 2. 结果集+out值
1 delimiter \\ 2 create PROCEDURE p1( 3 OUT p_return_code tinyint 4 ) 5 BEGIN 6 DECLARE exit handler for sqlexception 7 BEGIN 8 -- ERROR 9 set p_return_code = 1; 10 rollback; 11 END; 12 13 DECLARE exit handler for sqlwarning 14 BEGIN 15 -- WARNING 16 set p_return_code = 2; 17 rollback; 18 END; 19 20 START TRANSACTION; 21 DELETE from tb1; 22 insert into tb2(name)values('seven'); 23 COMMIT; 24 25 -- SUCCESS 26 set p_return_code = 0; 27 28 END\\ 29 delimiter ; 30 31 3. 事务
1 delimiter // 2 create procedure p3() 3 begin 4 declare ssid int; -- 自定义变量1 5 declare ssname varchar(50); -- 自定义变量2 6 DECLARE done INT DEFAULT FALSE; 7 8 9 DECLARE my_cursor CURSOR FOR select sid,sname from student; 10 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 11 12 open my_cursor; 13 xxoo: LOOP 14 fetch my_cursor into ssid,ssname; 15 if done then 16 leave xxoo; 17 END IF; 18 insert into teacher(tname) values(ssname); 19 end loop xxoo; 20 close my_cursor; 21 end // 22 delimter ; 23 24 4. 游标
1 delimiter \\ 2 CREATE PROCEDURE p4 ( 3 in nid int 4 ) 5 BEGIN 6 PREPARE prod FROM 'select * from student where sid > ?'; 7 EXECUTE prod USING @nid; 8 DEALLOCATE prepare prod; 9 END\\ 10 delimiter ; 11 12 5. 动态执行SQL
2、删除存储过程
drop procedure proc_name;
3、执行存储过程
-- 无参数 call proc_name() -- 有参数,全in call proc_name(1,2) -- 有参数,有in,out,inout set @t1=0; set @t2=3; call proc_name(1,2,@t1,@t2) 执行存储过程
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import pymysql 4 5 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1') 6 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) 7 # 执行存储过程 8 cursor.callproc('p1', args=(1, 22, 3, 4)) 9 # 获取执行完存储的参数 10 cursor.execute("select @_p1_0,@_p1_1,@_p1_2,@_p1_3") 11 result = cursor.fetchall() 12 13 conn.commit() 14 cursor.close() 15 conn.close() 16 17 18 print(result) 19 20 pymysql执行存储过程