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 from2 delete fromwhere id=1 and name='alex'

3、改

1 updateset name = 'alex' where id>1

4、查

1 select * from2 select * fromwhere id > 1
3 select nid,name,gender as gg fromwhere id > 1

5、条件查询

1 select * fromwhere id > 1 and name != 'alex' and num = 12;
2 select * fromwhere id between 5 and 16;
3 select * fromwhere id in (11,22,33)
4 select * fromwhere id not in (11,22,33)
5 select * fromwhere id in (select nid from 表)

6、通配符查询

select * fromwhere name like 'ale%'  - ale开头的所有(多个字符串)
select * fromwhere 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 * fromorder byasc              - 根据 “列” 从小到大排列
2 select * fromorder bydesc             - 根据 “列” 从大到小排列
3 select * fromorder by 列1 desc,列2 asc     - 根据 “列1” 从大到小排列,如果相同则按列2从小到大排序

9、分组

1 select num fromgroup by num
2 select num,nid fromgroup by num,nid
3 select num,nid fromwhere nid > 10 group by num,nid order nid desc
4 select num,nid,count(*),sum(score),max(score),min(score) fromgroup by num,nid
5 select num fromgroup 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
View Code

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 插入前触发器
Sample 1
 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执行存储过程
pymysql 执行存储过程

 

posted @ 2020-04-08 10:37  这么神奇  阅读(152)  评论(0编辑  收藏  举报