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
                    - 类对象对数据进行操作
        
  • 相关阅读:
    Windows性能计数器应用
    Azure Oracle Linux VNC 配置
    Azure 配置管理系列 Oracle Linux (PART6)
    Azure 配置管理系列 Oracle Linux (PART5)
    Azure 配置管理系列 Oracle Linux (PART4)
    Azure 配置管理系列 Oracle Linux (PART3)
    Azure 配置管理系列 Oracle Linux (PART2)
    vagrant多节点配置
    docker基本操作
    LINUX开启允许对外访问的网络端口命令
  • 原文地址:https://www.cnblogs.com/zhen1996/p/9408038.html
Copyright © 2011-2022 走看看