day 43
今日内容
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 ; (记得要将结束符改回来)
案例一
begin
select a + b ;
end//
create procedure add_d(in a int,in b int,out su)
begin
set @su = a+b;
end //
day 43的更多相关文章
- Java多线程系列目录(共43篇)
最近,在研究Java多线程的内容目录,将其内容逐步整理并发布. (一) 基础篇 01. Java多线程系列--“基础篇”01之 基本概念 02. Java多线程系列--“基础篇”02之 常用的实现多线 ...
- L440 无线网卡:由于该设备有问题,Windows 已将其停止(代码 43)
最近重装了系统,本来用的好好的,结果重启之后突然无线网卡不能用了,设备管理器老是黄色叹号!无线网卡设备状态:由于该设备有问题,Windows 已将其停止. (代码 43). 无线网卡型号:2 ...
- AC日记——质因数分解 1.5 43
43:质因数分解 总时间限制: 1000ms 内存限制: 65536kB 描述 已知正整数 n 是两个不同的质数的乘积,试求出较大的那个质数. 输入 输入只有一行,包含一个正整数 n. 对于60% ...
- 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 ...
- 分享Kali Linux 2016.2第43周镜像
分享Kali Linux 2016.2第43周镜像Kali Linux官方于10月23日如约发布了2016.2第43周镜像.和以往一样,此次镜像包含了11个镜像文件,包含PC端的32和64位镜像,还有 ...
- Chapter6: question 43 - 45
43. 投 n 个骰子,计算点数和出现的概率 递归求解:(空间 O(5*n+1),时间 O(6n)) void count(int N, int curN, int sum, int record[ ...
- 重新想象 Windows 8 Store Apps (43) - 多线程之任务: Task 基础, 多任务并行执行, 并行运算(Parallel)
[源码下载] 重新想象 Windows 8 Store Apps (43) - 多线程之任务: Task 基础, 多任务并行执行, 并行运算(Parallel) 作者:webabcd 介绍重新想象 W ...
- 与众不同 windows phone (43) - 8.0 相机和照片: 镜头的可扩展性, 图片的可扩展性, 图片的自动上传扩展
[源码下载] 与众不同 windows phone (43) - 8.0 相机和照片: 镜头的可扩展性, 图片的可扩展性, 图片的自动上传扩展 作者:webabcd 介绍与众不同 windows ph ...
- Tools下的mdscongiguer 文件中 43行 oracle 配置 发现需要连接库 -lclntsh libclntsh.so 库是个什么东西呢?
Tools下的mdscongiguer 文件中 43行 oracle 配置 发现需要连接库 -lclntsh libclntsh.so 库是个什么东西呢? 分想一个知乎网 ...
- 43. 动态规划求解n个骰子的点数和出现概率(或次数)[Print sum S probability of N dices]
[题目] 把N个骰子扔在地上,所有骰子朝上一面的点数之和为S.输入N,打印出S的所有可能的值出现的概率. [分析] 典型的动态规划题目. 设n个骰子的和为s出现的次数记为f(n,s),其中n=[1-N ...
随机推荐
- JS 回调函数、立即执行、for块作用域、try/catch、let、垃圾收集 p3
限于时间关系,加上有些倦意,简单的记录下一些要点: 1.回调函数:就你把函数当成参数传给另一个函数,这个函数在某个时间段会执行这个函数.
- 排序算法(10)--Distribution Sorting--分布排序[2]--Radix Sort--基数排序
1.基本思想 基数排序是通过“分配”和“收集”过程来实现排序 2.实现原理 基数排序(以整形为例),将整形10进制按每位拆分,然后从低位到高位依次比较各个位.主要分为两个过程: (1)分配,先从个位开 ...
- Android 投射工具和录屏工具
前言 写博客,难免需要上传手机截图或者是Gif文件,分享两个常用的工具 GifCam GifCam,一个简单的 屏幕录制工具,可以实现Gif的录制编辑和保存 Total Control Total C ...
- Linux sudo 命令使用简介
Linux sudo 命令使用简介 by:授客 QQ:1033553122 基本语法: $ sudo [-u username] [command] -u:将身份变成username的身份 #编辑/e ...
- vue与原生混合开发
前段时间,做了一个混合开发的项目,主要是以vue框架开发h5页面,使用cordova作为中间沟通桥梁,实现了h5与安卓.iOS的混合开发,由于从事iOS开发,h5也是刚接触不久,很多深入原理还不太清楚 ...
- Android 如何执行java命令
android的程序基于java开发,当我们接上调试器,执行adb shell,就可以执行linux命令,但是却并不能执行java命令. 那么在android的shell中是否就不能执行java程序了 ...
- FileWriter写数据路径问题及关闭和刷新方法的区别
package com.itheima_01; import java.io.FileWriter; import java.io.IOException; /* * 输出流写数据的步骤: * A:创 ...
- [iOS] UICollectionView初始化滚动到中间的bug
转载请保留地址wossoneri.com 问题 首先看一下我之前写的demo:link demo是封装了一个控件,直接在MainViewController的viewWillAppear里初始化,并且 ...
- Appium环境搭建(MAC版)
一.环境搭建 (1)安装node.js brew install node (2)安装Xcode 测试iOS App需要.打开Finder,在Applications文件夹下,看是否有Xcode.ap ...
- Oracle EBS AP 取消发票
--取消发票 created by jenrry 20170425 declare l_result BOOLEAN; l_message_name VARCHAR2(240); l_invoice_ ...