今日内容

  1.视图

  2.事务

  3.SQL注入问题

  4.存储过程

首先回顾一下昨天所学

子查询:

  in (select a where 字段名 in select b)

  exists(判断后面语句执行结果是否为True 为True执行外层语句 False不执行外层语句)

正则表达式匹配

  因为MySQL自身模糊查找只支持_和%查询

  关键字 regexp用于正则表达式匹配

用户管理

  GRANT all |权限管理  ON 数据库名.数据表名|*.*  TO 用户名@"主机地址";

pymysql 模块使用

  执行步骤:

    1.连接数据库 conn = pymysql.Connect()

    2.cursor = conn.cursor()获取游标

    3.执行增删改查 cursor.execute(SQL语句)

    4.获取执行结果或查询结果 fetchone #获取一条执行结果 fetchmany(指定获取执行结果数)#指定获取执行结果数  fetchall #获取所有执行结果

1.视图

  视图是什么?

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

  有什么用?

    原表安全

    功能一:隐藏部分数据 开放指定数据

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

  如何使用:

    示例:

    create view person_刘 as select * from emp where name = "刘备"; #创建视图

    select * from person_刘;

    

  特点:

    1.每次对视图进行的查询,其实都是再次执行了 as 后面的查询语句

    2.可以对视图进行修改,修改会同步到原表

    3.视图是永久存储的,存储的不是数据,而是一条 as sql 语句

2.事务

  生活中的事务,我们可以理解为事情

     一件事情要完成,通常需要分成多个步骤才能完成

  在MySQL中事务是什么?

    是一组MySQL语句的集合

  事务的特性:

    1.原子性

      事务是一个整体,不可分割

    2.隔离性

      事务的隔离级别

        1.读未提交(脏读,不可重复读,幻读)

        2.读已提交(不可重复读,幻读)

        3.可重复读(幻读)

        4.可串行化(串行执行)

      脏读:读取到另一个事务未提交的数据

      不可重复读:两次对同一条记录查询结果不一致(一个事务在查询,另一个事务在更新)

      幻读:对同一个表中的查询结果数量不一致(一个事物在查询,另一个事务在添加或删除)

    3.一致性

      当事务执行后 所有数据都是完整的(外键约束、非空约束)

    4.持久性

      一旦事务被提交,数据就会被永久保存

  MySQL这个客户端默认开启自动提交,一条SQL语句就是一个单独的事务

  pymysql默认是不自动提交,需要手动commit (默认开启了事务)

  为事务创建保存点,保存点就像游戏中的记录,你可以回滚到指定的一个点

  savepoint piont_name;

  回滚至一个保存点

  rollback to piont_name;

  查看自己MySQL的自动提交状态

  show variables like "autocommit";

  

  修改MySQL的自动提交状态

  set autocommit = 1|0;(打开|关闭)

  

  示例:开启一个事务,修改数据后然后rollback

  

3.SQL注入问题

  通过在输入是输入一些sql语句导致数据流失如输入“--”注释后面的代码,导致不用输入name 直接可以查询成功,

  为了预防这种操作,我们需要将输入写进cursor.execute(输入语句)因为这个pymysql这个方法内部已经帮我们做好了过滤

import pymysql

conn = pymysql.Connect(
host = "localhost",
user = "root",
password = "123456",
database = "mydb2",
port = 3306,
charset = 'utf8'
)
cursor = conn.cursor(pymysql.cursors.DictCursor) sql = "select * from emp where id = '%s' and name = '%s'"%(input("id:"),input("name:"))
print(sql)
res = cursor.execute(sql) if res:
print('查询成功')
print(res)
else:
print('查询失败') cursor.close()
conn.close()

  

4.存储过程

  存储过程是什么?

    可以理解为MySQL的编程语言

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

  既然如此,能不能把所有的与数据存储有关的业务逻辑全部放到MySQL中?

    理论上,技术层面上是可以的,但是,对于公司而言需要再请一个MySQL开发者,对于你个人来说,也提高了沟通成本

  三种开发的模式

    对于同样一个业务,你可以放到python,也可以放到MySQL中

    区别:

      1.应用程序(处理逻辑)

        需要手动编写SQL语句

        优点:执行效率高

        缺点:开发效率低

      2.MySQL(处理逻辑)

        特点:应用程序开发者不需要手动编写SQL语句(MySQL开发者来编写)

        优点:应用程序开发效率高

        缺点:执行效率略低,沟通成本增高

      3.使用ORM(object relation map)对象关系映射

        自动帮你生成对应的SQL语句

        优点:开发效率高

        缺点:执行效率低

      存储过程就相当于python中的一个函数

      简单来说,学习存储过程就是学习如何使用MySQL编写一个函数

      

      语法:

        create procedure 过程名称 (in | out | inout , 参数名称,数据类型)

        begin

          具体的SQL代码

        end

        参数前面需要指定参数的作用

        in 表示该参数用于传入

        out 表示返回数据

        inout 可传入 也可返回

        参数类型是MySQL的数据类型

        注:在存储过程中,需要是用分号来结束一行,但是分号有特殊含义

        要将原始的结束符,修改为其他符号

          delimiter // #结束符更改为//

          delimiter ; (记得要将结束符改回来)

        案例一

        create procedure add_p(in a int , in b int)
        begin
              select a + b ;
        end//
 
        定义变量 set @变量名
        create procedure add_d(in a int,in b int,out su)
        begin
             set @su = a+b;
        end //

      

day 43的更多相关文章

  1. Java多线程系列目录(共43篇)

    最近,在研究Java多线程的内容目录,将其内容逐步整理并发布. (一) 基础篇 01. Java多线程系列--“基础篇”01之 基本概念 02. Java多线程系列--“基础篇”02之 常用的实现多线 ...

  2. L440 无线网卡:由于该设备有问题,Windows 已将其停止(代码 43)

    最近重装了系统,本来用的好好的,结果重启之后突然无线网卡不能用了,设备管理器老是黄色叹号!无线网卡设备状态:由于该设备有问题,Windows 已将其停止. (代码 43).      无线网卡型号:2 ...

  3. AC日记——质因数分解 1.5 43

    43:质因数分解 总时间限制:  1000ms 内存限制:  65536kB 描述 已知正整数 n 是两个不同的质数的乘积,试求出较大的那个质数. 输入 输入只有一行,包含一个正整数 n. 对于60% ...

  4. Oracle中把一个DateTime的字符串转化成date类型。to_date('2016/12/8 18:55:43','yyyy/MM/dd hh24:mi:ss'),

    Oracle中把一个DateTime或者该形态字符串转化成date类型. to_date('2016/12/8 18:55:43','yyyy/MM/dd hh24:mi:ss'), 或者: sele ...

  5. 分享Kali Linux 2016.2第43周镜像

    分享Kali Linux 2016.2第43周镜像Kali Linux官方于10月23日如约发布了2016.2第43周镜像.和以往一样,此次镜像包含了11个镜像文件,包含PC端的32和64位镜像,还有 ...

  6. Chapter6: question 43 - 45

    43.  投 n 个骰子,计算点数和出现的概率 递归求解:(空间 O(5*n+1),时间 O(6n)) void count(int N, int curN, int sum, int record[ ...

  7. 重新想象 Windows 8 Store Apps (43) - 多线程之任务: Task 基础, 多任务并行执行, 并行运算(Parallel)

    [源码下载] 重新想象 Windows 8 Store Apps (43) - 多线程之任务: Task 基础, 多任务并行执行, 并行运算(Parallel) 作者:webabcd 介绍重新想象 W ...

  8. 与众不同 windows phone (43) - 8.0 相机和照片: 镜头的可扩展性, 图片的可扩展性, 图片的自动上传扩展

    [源码下载] 与众不同 windows phone (43) - 8.0 相机和照片: 镜头的可扩展性, 图片的可扩展性, 图片的自动上传扩展 作者:webabcd 介绍与众不同 windows ph ...

  9. Tools下的mdscongiguer 文件中 43行 oracle 配置 发现需要连接库 -lclntsh libclntsh.so 库是个什么东西呢?

    Tools下的mdscongiguer     文件中 43行  oracle 配置      发现需要连接库 -lclntsh      libclntsh.so 库是个什么东西呢? 分想一个知乎网 ...

  10. 43. 动态规划求解n个骰子的点数和出现概率(或次数)[Print sum S probability of N dices]

    [题目] 把N个骰子扔在地上,所有骰子朝上一面的点数之和为S.输入N,打印出S的所有可能的值出现的概率. [分析] 典型的动态规划题目. 设n个骰子的和为s出现的次数记为f(n,s),其中n=[1-N ...

随机推荐

  1. H5音乐播放器【歌单列表】

    上篇详细描述了播放页歌词如何实现跟随跟单滚动,如何解析歌词,那么歌单页又是如何生成的呢,话不多说,直接上图上代码! 首先需要获取数据,具体获取数据api请转到我跟我大兄弟博客去观看学习去,同时也感谢我 ...

  2. iTerm通过堡垒机自动登录服务器

    为了保障网络和数据安全,越来越多公司使用堡垒机.iTerm作为一个好用的终端利器,要实现自动通过堡垒机登录服务器的方式有多种.下面我就来介绍一种通过expect脚本的方式完成配置. 第一步,进入/us ...

  3. SD从零开始03-04

    [原创]SD从零开始3 SD中的主数据 客户主数据Customer master(分层维护) 一般数据general data: 与销售和财务都有关,对所有的组织单元有效: 销售区域数据sales a ...

  4. 解读 --- 基于微软企业商务应用平台 (Microsoft Dynamics 365) 之上的人工智能 (AI) 解决方案

    9月25日微软今年一年一度的Ignite 2017在佛罗里达州奥兰多市还是如期开幕了.为啥这么说?因为9月初五级飓风厄玛(Hurricane Irma) 在佛罗里达州登陆,在当地造成了挺大的麻烦.在这 ...

  5. 【webpack】webpack.base.conf.js基础配置

    var path = require('path') // node路径模块 var utils = require('./utils') // 对vue-loader对于css预编译一些提取的工具模 ...

  6. 自己来实现一套IOC注解框架

    我们自己来实现一套IOC注解框架吧,采用的方式反射加注解和Xutils类似,但我们尽量不写那么麻烦,也不打算采用动态代理,我们扩展一个检测网络的注解,比如没网的时候我们不去执行方法而是给予没有网络的提 ...

  7. android 所有焦点问题

    一. 主动获取焦点 setFocusable(true);    //  是设置能否获得焦点而已.. requestFocus();          //是让控件得到焦点 requestFocusI ...

  8. [Android] 布局优化技巧

    看了一些关于优化布局的资料,了解了很多平时不怎么注意的问题,于是把资料整理了一下,一部分内容是翻译来的,一部分是自己理解加上的.每部分内容都有demo,有些资料里的demo比较好的,我就直接拿来用了: ...

  9. 【Java入门提高篇】Day19 Java容器类详解(二)Map接口

    上一篇里介绍了容器家族里的大族长——Collection接口,今天来看看容器家族里的二族长——Map接口. Map也是容器家族的一个大分支,但里面的元素都是以键值对(key-value)的形式存放的, ...

  10. Asp.Net Core使用System.Drawing.Common部署到docker报错问题

    Asp.Net Core 2.1发布后,正式支持System.Drawing.Common绘图了,可以用来做一些图片验证码之类的功能.但是把网站部署到docker容器里运行会遇到很多问题,也是非常闹心 ...