zoukankan      html  css  js  c++  java
  • 数据库中的视图的使用与存储过程

    视图是什么?

    本质是一张虚拟表,他的数据来自select语句。

    作用:

    功能1:隐藏部分数据,开放指定的数据

    功能2:因为视图可以将查询的结果保存特性,我可以用视图来达到减少书写sql的次数

    例如:select *from emp where dept_id=(select id from dept where name=”市场”);

    要查询市场的人,将查询的结果作为一个试图,以后使用到这个需求就可以直接查看试图。

    如何使用:

    创建试图:

    Create view test_view as select *from t1;

    特点:

    1. 每次对视图进行的查询,其实都是在次执行了as后面的小哈寻语句
    2. 可以对视图进行修改,修改会同步到原表
    3. 视图是永久保存的,存储的不是数据,而是一条as sql语句

    基本不使用视图,因为你的程序开放的数据不是开放sql 语句,而开放的是查询结果

     

    Sql注入问题

    import  pymysql
    
     
    
    conn = pymysql.Connect(
    
        user="root",
    
        password="admin",
    
        host="localhost",
    
        database="day43",
    
        charset="utf8"
    
    )
    
    cursor = conn.cursor(pymysql.cursors.DictCursor)
    
    #sql = "select *from user where user = '%s' and pwd = '%s';" % (input("input userName"),input("input password"))
    
     
    
    # 当用户输入的用户名为字符串 为 yy' --   时
    
    # 最终产生的sql  select *from user where user = 'yy' -- ' and pwd = '987657890';
    
    # -- 用于mysql注释  意思是 后面的内容忽略掉
    
    # 从而导致 密码是否正确都能登录成功
    
    # "select *from user where user = 'axxax' or 1=1;
    
    #print(sql)
    
    count = cursor.execute("select *from user where user = %s and pwd = %s;",args=(input("user"),input("pwd")))
    
     
    
    print(count)
    
    if count:
    
        print("login success")
    
    else:
    
        print("login error")
    
     
    
    cursor.close()
    
    conn.close()

    Sql注入攻击,是什么意思?

    一些了解授权sql语法的用户可以输入一些关键字或合法的sql语句,来导致原始sql逻辑发生变化,从而跳过登陆验证或者删除数据库。

    如何避免:在接受用户输入的数据时,可以加上限制,比如不能输入 --’;where等等

    上面这种方式只能避免黑客从你的客户端和服务器中间加一个中转服务器),这样就绕过了客户端的输入限制,此时只能将生气了sql合法性验证放在服务器端

    总结:

    Python如何避免sql注入?把你的sql(用户输入的)参数放在execute函数中,让pymysql自动帮你屏蔽注入攻击

    存储过程

    你可以理解为MySQL的编程语言。

    作用:

    可以将你的程序业务逻辑放到MySQL中来处理,这样可以降低网络的访问次数,从而提高你的程序效率。

    我们可以将所有与数据存储相关的业务逻辑全都放在MySQL中,但这样意味着公司需要再请一个MySQL开发者,对你个人而言,提高了沟通成本。

    三种开发模型:

    对于同样的一个业务,你可以放到Python有人可以放到MySQL有什么区别?

    1. 应用程序处理逻辑,需要动手编写sql语句

    优点:执行效率高;缺点:开发效率低

    1. MySQL处理逻辑

    特点:应用程序开发者不需要手动编写sql语句,MySQL开发者来编写。

    优点:应用程序开发效率高;缺点:执行效率低,沟通成本高

    1. 使用OMB(object relation map)对象关系映射,自动帮你生成对应的sql语句,比如你要注册用户,本来要写insert语句,现在使用orm 调用save(用户对象)

    优点:开发效率高;缺点:执行效率低

    存储过程相当于Python中的一个函数,简单的说,学习存储过程就是学习如何使用MySQL编写一个函数。

    语法;

    Create procedure 过程名称({in ,out,inout}数据类型 参数名称)
    
    Begin
    
    具体的代码
    
    End
    
    参数前面需要指定参数的作用
    
    In 表示该函数用于传入数据
    
    Out 用于返回数据
    
     
    
    Inout 即可传入也可返回
    
    参数类型是MySQL中的数据类型

     案例:创建一个存储过程 作用是将两个整数相加

                create procedure add_p (in a int,in b int)

                begin

                    select a + b;

                end

                //

      调用 call add_p(1,2)

    案例创建一个存储过程作用是将两个整数相加,将结果保存在变量中,先定义一个变量:set @su=100;

    Create procedure add_p(int a int,in b int,out su int)

    Begin

    Set su=a+b;

    End

    //  

    定义变量:set @su=100;

    调用过程: call add_p2(10,20,@su);

    注意:在存储过程中,需要使用分号来结束一行,但是分号有特殊意义,因此将原始的结束符修改为其他符号。

    Delimiter // 结束符更换为//

    Delimiter

     mysql中的if语句

              if 条件 then

                代码

              elseif 条件 then

                代码

              else then

                代码

              end if;

     案例:

             使用存储过程 完成  输入 一个 数字 12   显示 壹 或 贰

                create procedure show_p (in a int)

                begin

                if a = 1 then

                    select "";

                elseif a = 2 then

                    select "";

                else

                    select "other";

                end if;

                end //

    调用存储过程 使用 call 过程名称

    call add_p(10,20);

            其他的流程控制

            switch

            case

            while

            repeat ==  do while

    总结: 实际上一个mysql中的类似函数的东西  我们可以用它实现一些逻辑处理

          特点:里面可以包含流程控制语句 和 普通的sql语句

            使用存储过程的优势

            提高应用程序开发效率

            降低网络访问次数

     

         

  • 相关阅读:
    课程一(Neural Networks and Deep Learning),第一周(Introduction to Deep Learning)—— 1、经常提及的问题
    递归、字节流、文件复制_DAY20
    IO概述、异常、File文件类_DAY19
    某书2018笔试题之薯券
    某书2018笔试题之翻转数字
    某书2018笔试题之字符串中最大子数字串
    批量发货的启示
    为什么易燥易怒以及柔润相处的练习
    编程漫谈(十五):编程与软件开发
    使用函数式编程消除重复无聊的foreach代码(Scala示例)
  • 原文地址:https://www.cnblogs.com/xuecaichang/p/9670300.html
Copyright © 2011-2022 走看看