zoukankan      html  css  js  c++  java
  • python基础一 day43 笔记内容

    Day61

    回顾:
    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. 需求分析

    今日内容:
    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
    - 类对象对数据进行操作















  • 相关阅读:
    用Service充当Domain Object
    Scrum方法回顾
    为什么使用User Story Map
    前端状态管理之状态机
    项目进度管理注意事项
    单元测试遇到的最难的问题
    JS AMD模块的循环依赖
    jupyter notebook常用快捷键
    Jupyter-NoteBook-你应该知道的N个小技巧
    Python之配置日志的几种方式(logging模块)
  • 原文地址:https://www.cnblogs.com/wang-tan/p/11588319.html
Copyright © 2011-2022 走看看