zoukankan      html  css  js  c++  java
  • 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
                    - 类对象对数据进行操作
        
  • 相关阅读:
    jar强退出 JVM报错:Failed to write core dump. Core dumps have been disabled.
    配置 DHCP Snooping 和 IPSG
    OpenOffice
    RabbitMQ ADD
    YAPI 接口管理
    mysql:1153 Got a packet bigger than ‘max_allowed_packet’ bytes的解决方法
    修改端口的VLAN
    阿里云OSS设置跨域访问
    seata连接nacos 报错
    Linux登录超时问题
  • 原文地址:https://www.cnblogs.com/zhen1996/p/9408038.html
Copyright © 2011-2022 走看看