8.2数据库(4)

2018-8-2 17:09:08

又继续看mysql 下面有好多内容都是熟悉的!知道有这个事情就好啦!

上天要眷顾我,我会努力的!

pymysql内部编写了代码

存储过程

 

对于每一行数据分门别类计算的时候再用游标,

游标  其实就循环

 

    
回顾:
    SQL语句:
        数据行:
            临时表:(select * from tb where id>10)
            指定映射:
                    select id,name,1,sum(x)/count()
            条件:
                    case when id>8 then xx else xx end
                    
            三元运算: if(isnull(xx),0,1)
            补充:
                左右连表: join
                上下连表: union
                        # 自动去重
                        select id,name from tb1
                        union
                        select num,sname from tb2
                        
                        # 不去重
                        select sid,sname from student
                        UNION ALL
                        select sid,sname from student
上节练习:
        基于用户权限管理
            参考表结构:

                用户信息
                id username   pwd
                 1   alex     123123

                权限
                1    订单管理 
                2    用户劵
                3    Bug管理
                ....

                用户类型&权限
                1     1
                1     2
                2     1
                3     1
            程序:
                用户登录
            
        
        基于角色的权限管理
            
            用户信息
                id username     pwd     role_id
                 1   alex     123123      1
                 2   eric     123123      1

            权限
                1    订单管理 
                2    用户劵
                3    Bug管理
                ....
            
            角色表:
                1    IT部门员工
                2    咨询员工
                3    IT主管
                
            角色权限管理
                1     1
                1     2
                3     1
                3     2
                3     3
                
        ===> 
            1. 基于角色的权限管理
            2. 需求分析

# 最重要的还是sql语句,下面这些东西用到的时候可以翻博客
# 主要是下面东西还都不带常用,了解就行!!熟悉就好!
            
今日内容:
    1. 视图
        100个SQL:
            88: v1
            
            select .. from v1
            select asd from v1
        某个查询语句设置别名,日后方便使用
            
        - 创建
            create view 视图名称 as  SQL
            
            PS: 虚拟
        - 修改
            alter view 视图名称 as  SQL
            
        - 删除
            drop view 视图名称;
        
    2. 触发器
        
        当对某张表做:增删改操作时,可以使用触发器自定义关联行为
        
        insert into tb (....)
        
        -- delimiter //
        -- create trigger t1 BEFORE INSERT on student for EACH ROW
        -- BEGIN
        --     INSERT into teacher(tname) values(NEW.sname);
        --     INSERT into teacher(tname) values(NEW.sname);
        --     INSERT into teacher(tname) values(NEW.sname);
        --     INSERT into teacher(tname) values(NEW.sname);
        -- END //
        -- delimiter ;
        -- 

        -- insert into student(gender,class_id,sname) values('',1,'陈涛'),('',1,'张根');

        -- NEW,代指新数据
        -- OLD,代指老数据

    3. 函数
        def f1(a1,a2):
            return a1 + a2
            
        f1()
        bin()
        
        内置函数:
            执行函数 select CURDATE();
            
            blog
            id       title            ctime
             1        asdf        2019-11
             2        asdf        2019-11
             3        asdf        2019-10
             4        asdf        2019-10
             
             
            select ctime,count(1) from blog group ctime
            
            select DATE_FORMAT(ctime, "%Y-%m"),count(1) from blog group DATE_FORMAT(ctime, "%Y-%m")
            2019-11   2
            2019-10   2
            
            
        自定义函数(有返回值):
            
            delimiter \\
                create function f1(
                    i1 int,
                    i2 int)
                returns int
                BEGIN
                    declare num int default 0;
                    set num = i1 + i2;
                    return(num);
                END \\
            delimiter ;
            
            SELECT f1(1,100);
            
    4. 存储过程
        保存在MySQL上的一个别名 => 一坨SQL语句
        
        别名()
        
        用于替代程序员写SQL语句
        
        
        方式一:
            MySQL: 存储过程
            程序:调用存储过程
        方式二:
            MySQL:。。
            程序:SQL语句
        方式三:
            MySQL:。。
            程序:类和对象(SQL语句)
            
            
        1. 简单
            create procedure p1()
            BEGIN
                select * from student;
                INSERT into teacher(tname) values("ct");
            END
            
            call p1()
            cursor.callproc('p1')
        2. 传参数(in,out,inout)
            delimiter //
            create procedure p2(
                in n1 int,
                in n2 int
            )
            BEGIN
                
                select * from student where sid > n1;
            END //
            delimiter ;
            
            call p2(12,2)
            cursor.callproc('p2',(12,2))
            
        3. 参数 out
            delimiter //
            create procedure p3(
                in n1 int,
                inout n2 int
            )
            BEGIN
                set n2 = 123123;
                select * from student where sid > n1;
            END //
            delimiter ;
            
            set @v1 = 10;
            call p2(12,@v1)
            select @v1;
            
            set @_p3_0 = 12
            ser @_p3_1 = 2
            call p3(@_p3_0,@_p3_1)
            select @_p3_0,@_p3_1

            
            
            
            cursor.callproc('p3',(12,2))
            r1 = cursor.fetchall()
            print(r1)


            cursor.execute('select @_p3_0,@_p3_1')
            r2 = cursor.fetchall()
            print(r2)

            =======> 特殊
                    a. 可传参: in   out   inout
                    b. pymysql
                        
                            cursor.callproc('p3',(12,2))
                            r1 = cursor.fetchall()
                            print(r1)

                            cursor.execute('select @_p3_0,@_p3_1')
                            r2 = cursor.fetchall()
                            print(r2)
                                        
        为什么有结果集又有out伪造的返回值?
        
        
            delimiter //
            create procedure p3(
                in n1 int,
                out n2 int  用于标识存储过程的执行结果  1,2
            )
            BEGIN
                insert into vv(..)
                insert into vv(..)
                insert into vv(..)
                insert into vv(..)
                insert into vv(..)
                insert into vv(..)
            END //
            delimiter ;
            
        4. 事务
        
            
            delimiter //
            create procedure p4(
                out status int
            )
            BEGIN
                1. 声明如果出现异常则执行{
                    set status = 1;
                    rollback;
                }
                   
                开始事务
                    -- 由秦兵账户减去100
                    -- 方少伟账户加90
                    -- 张根账户加10
                    commit;
                结束
                
                set status = 2;
                
                
            END //
            delimiter ;
            
            ===============================
            delimiter \\
            create PROCEDURE p5(
                OUT p_return_code tinyint
            )
            BEGIN 
              DECLARE exit handler for sqlexception 
              BEGIN 
                -- ERROR 
                set p_return_code = 1; 
                rollback; 
              END; 
             
              START TRANSACTION; 
                DELETE from tb1;
                insert into tb2(name)values('seven');
              COMMIT; 
             
              -- SUCCESS 
              set p_return_code = 2; 
             
              END\\
            delimiter ;

        
        5. 游标
        
            delimiter //
            create procedure p6()
            begin 
                declare row_id int; -- 自定义变量1  
                declare row_num int; -- 自定义变量2 
                declare done INT DEFAULT FALSE;
                declare temp int;
                
                declare my_cursor CURSOR FOR select id,num from A;
                declare CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
                
                
                
                open my_cursor;
                    xxoo: LOOP
                        fetch my_cursor into row_id,row_num;
                        if done then 
                            leave xxoo;
                        END IF;
                        set temp = row_id + row_num;
                        insert into B(number) values(temp);
                    end loop xxoo;
                close my_cursor;
                
                
            end  //
            delimter ;
    
        6. 动态执行SQL(防SQL注入)
        
            delimiter //
            create procedure p7(
                in tpl varchar(255),
                in arg int
            )
            begin 
                1. 预检测某个东西 SQL语句合法性
                2. SQL =格式化 tpl + arg 
                3. 执行SQL语句
                
                set @xo = arg;
                PREPARE xxx FROM 'select * from student where sid > ?';
                EXECUTE xxx USING @xo;
                DEALLOCATE prepare prod; 
            end  //
            delimter ;
        
        
            
            call p7("select * from tb where id > ?",9)
        
            ===> 
    
            delimiter \\
            CREATE PROCEDURE p8 (
                in nid int
            )
            BEGIN
                set @nid = nid;
                PREPARE prod FROM 'select * from student where sid > ?';
                EXECUTE prod USING @nid;
                DEALLOCATE prepare prod; 
            END\\
            delimiter ;
            
            
数据库相关操作:
    1. SQL语句 *****
        - select xx() from xx ;
    2. 利用MySQL内部提供的功能
        

作业:
    一、SQL题 *****
    
    二、数据库
        表: id   name    email   gender
                  alex1
        三百万行
    
        预习:
            5. 索引
            
            6. ORM操作 SQLAlchmy
                - 类对象对数据进行操作
    

 

posted @ 2018-08-02 16:37  我想喝杨枝甘露~  阅读(141)  评论(0编辑  收藏  举报