MySQL(四)
一.使用正则表达式查询
- SELECT * FROM employee WHERE name REGEXP '^ale';
- SELECT * FROM employee WHERE name REGEXP 'on$';
- SELECT * FROM employee WHERE name REGEXP 'm{2}';
- 小结:对字符串匹配的方式
- WHERE name = 'egon';
- WHERE name LIKE 'yua%';
- WHERE name REGEXP 'on$';
二.用户权限管理
MySQL是一个tcp服务器,用于操作服务器上的文件数据,接收用户端发送的指令,接收指令时需要考虑安全问题,于是就需要用户权限的管理.
在MySQL自带的mysql数据库中有4个表用于用户管理
分别是(优先级从高到低):
user --> db --> tables_priv --> columns_priv
- #授权表
- user #该表放行的权限,针对:所有数据,所有库下所有表,以及表下的所有字段
- db #该表放行的权限,针对:某一数据库,该数据库下的所有表,以及表下的所有字段
- tables_priv #该表放行的权限。针对:某一张表,以及该表下的所有字段
- columns_priv #该表放行的权限,针对:某一个字段
- #按图解释:
- user:放行db1,db2及其包含的所有
- db:放行db1,及其db1包含的所有
- tables_priv:放行db1.table1,及其该表包含的所有
- columns_prive:放行db1.table1.column1,只放行该字段
- #创建用户
- create user 用户名@"主机地址" identified by "密码";
- create user 'egon'@'1.1.1.1' identified by '';
- create user 'egon'@'192.168.1.%' identified by '';
- create user 'egon'@'%' identified by '';
- 此处的主机地址不是服务器地址,时客户端地址
- #授权:对文件夹,对文件,对文件某一字段的权限
- 查看帮助:help grant
- 常用权限有:select,update,alter,delete
- all可以代表除了grant之外的所有权限
- #授权语句
- #语法:grant [权限的名称 | all ] on 数据库.库名 to 用户名@"主机地址"
- #针对所有库的授权:*.*
- grant select on *.* to 'egon1'@'localhost' identified by ''; #只在user表中可以查到egon1用户的select权限被设置为Y
- #针对某一数据库:db1.*
- grant select on db1.* to 'egon2'@'%' identified by ''; #只在db表中可以查到egon2用户的select权限被设置为Y
- #针对某一个表:db1.t1
- grant select on db1.t1 to 'egon3'@'%' identified by ''; #只在tables_priv表中可以查到egon3用户的select权限
- #针对某一个字段:
- mysql> select * from t3;
- +------+-------+------+
- | id | name | age |
- +------+-------+------+
- | 1 | egon1 | 18 |
- | 2 | egon2 | 19 |
- | 3 | egon3 | 29 |
- +------+-------+------+
- grant select (id,name),update (age) on db1.t3 to 'egon4'@'localhost' identified by '';
- #可以在tables_priv和columns_priv中看到相应的权限
- mysql> select * from tables_priv where user='egon4'\G
- *************************** 1. row ***************************
- Host: localhost
- Db: db1
- User: egon4
- Table_name: t3
- Grantor: root@localhost
- Timestamp: 0000-00-00 00:00:00
- Table_priv:
- Column_priv: Select,Update
- row in set (0.00 sec)
- mysql> select * from columns_priv where user='egon4'\G
- *************************** 1. row ***************************
- Host: localhost
- Db: db1
- User: egon4
- Table_name: t3
- Column_name: id
- Timestamp: 0000-00-00 00:00:00
- Column_priv: Select
- *************************** 2. row ***************************
- Host: localhost
- Db: db1
- User: egon4
- Table_name: t3
- Column_name: name
- Timestamp: 0000-00-00 00:00:00
- Column_priv: Select
- *************************** 3. row ***************************
- Host: localhost
- Db: db1
- User: egon4
- Table_name: t3
- Column_name: age
- Timestamp: 0000-00-00 00:00:00
- Column_priv: Update
- rows in set (0.00 sec)
- #删除权限
- #语法:revoke 权限的名称 on 数据库.表名 from 用户名@"主机地址";
- revoke select on db1.* from 'egon'@'%';
三.pymysql模块
- 安装
- pip3 install pymysql
1.链接.执行sql,关闭(游标)
- # 创建链接得到一个链接对象
- conn = pymysql.Connect(
- host="127.0.0.1", # 数据库服务器主机地址
- user="root", # 用户名
- password="admin", # 密码
- database="day42", # 数据库名称
- port=3306, # 端口号 可选 整型
- charset="utf8" # 编码 可选
- )
- # 获取游标对象 pymysql.cursors.DictCursor指定 返回的结果类型 为字典 默认是元祖类型
- cursor = conn.cursor(pymysql.cursors.DictCursor)
- # 查询数据
- sql = "select *from emp"
- # 执行sql 如果是select 语句返回的是查询成功的记录数目
- res = cursor.execute(sql)
- print(res)
- # 关闭链接
- cursor.close()
- conn.close()
2.execute()之sql注入
注意:符号"--"会注释掉它之后的sql,正确的语法:"--"后至少有一个任意字符
根本原理:就根据程序的字符串拼接name='%s',输入一个xxx'-- haha,用输入的xxx加'在程序中拼接成一个判断条件name='xxx' -- haha'
- 最后那一个空格,在一条sql语句中如果遇到select * from t1 where id > 3 -- and name='egon';则--之后的条件被注释掉了
- #1、sql注入之:用户存在,绕过密码
- egon' -- 任意字符
- #2、sql注入之:用户不存在,绕过用户与密码
- xxx' or 1=1 -- 任意字符
解决方法:
- # 原来是我们对sql进行字符串拼接
- # sql="select * from userinfo where name='%s' and password='%s'" %(user,pwd)
- # print(sql)
- # res=cursor.execute(sql)
- #改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了)
- sql="select * from userinfo where name=%s and password=%s" #!!!注意%s需要去掉引号,因为pymysql会自动为我们加上
- res=cursor.execute(sql,[user,pwd]) #pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。
3.增.删.改:conn.commit()
- import pymysql
- #链接
- conn=pymysql.connect(host='localhost',user='root',password='',database='egon')
- #游标
- cursor=conn.cursor()
- #执行sql语句
- #part1
- # sql='insert into userinfo(name,password) values("root","123456");'
- # res=cursor.execute(sql) #执行sql语句,返回sql影响成功的行数
- # print(res)
- #part2
- # sql='insert into userinfo(name,password) values(%s,%s);'
- # res=cursor.execute(sql,("root","123456")) #执行sql语句,返回sql影响成功的行数
- # print(res)
- #part3
- sql='insert into userinfo(name,password) values(%s,%s);'
- res=cursor.executemany(sql,[("root",""),("lhf",""),("eee","")]) #执行sql语句,返回sql影响成功的行数
- print(res)
- conn.commit() #提交后才发现表中插入记录成功
- cursor.close()
- conn.close()
4.查:fetchone,fetchmany,fetchall
- import pymysql
- #链接
- conn=pymysql.connect(host='localhost',user='root',password='',database='egon')
- #游标
- cursor=conn.cursor()
- #执行sql语句
- sql='select * from userinfo;'
- rows=cursor.execute(sql) #执行sql语句,返回sql影响成功的行数rows,将结果放入一个集合,等待被查询
- # cursor.scroll(3,mode='absolute') # 相对绝对位置移动
- # cursor.scroll(3,mode='relative') # 相对当前位置移动
- res1=cursor.fetchone()
- res2=cursor.fetchone()
- res3=cursor.fetchone()
- res4=cursor.fetchmany(2)
- res5=cursor.fetchall()
- print(res1)
- print(res2)
- print(res3)
- print(res4)
- print(res5)
- print('%s rows in set (0.00 sec)' %rows)
- conn.commit() #提交后才发现表中插入记录成功
- cursor.close()
- conn.close()
- '''
- (1, 'root', '123456')
- (2, 'root', '123456')
- (3, 'root', '123456')
- ((4, 'root', '123456'), (5, 'root', '123456'))
- ((6, 'root', '123456'), (7, 'lhf', '12356'), (8, 'eee', '156'))
- rows in set (0.00 sec)
- '''
MySQL(四)的更多相关文章
- Mysql 四种事务隔离介绍以及锁机制
还有很多不太懂,这里收集几份大佬文章“飞机票”,待我整理好了,再好好写一篇文章吧. MySQL的四种事务隔离级别 https://www.cnblogs.com/huanongying/p/70215 ...
- MySQL 四种事务隔离级的说明
很早之前写的文章,重新回顾和学习下: 按照SQL:1992 事务隔离级别,InnoDB默认是可重复读的(REPEATABLE READ).MySQL/InnoDB 提供SQL标准所描述的所有四个事务隔 ...
- 细说Mysql四种安装方法及自动化部署
一.简介 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库, 每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据. 我们也可以将数据存储在文件中,但是 ...
- mysql四种事务隔离级的说明
·未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据 ·提交读(Read Committed):只能读取到已经提交的数据.Oracle等多数数据库默 ...
- 【转载】mysql 四种隔离级别分析
sql标准中,有四种隔离级别,各个离级别都有各自的规则,隔离级别越低,允许并发越大,消耗的资源越少,但是越不安全,下面就mysql数据库来分别介绍一下(每个存储引擎实施的隔离级别会有稍微的不同)mys ...
- MySQL 四种隔离级别
什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事务的结束有 ...
- MySQL四种隔离级别和MVCC
事务在一个数据库中的地位尤为重要,尤其是高并发的场合.保证数据库操作的原子性和错误出现情况下的回滚,对数据的安全性和可靠性提供了保障.事务有四大原则,即ACID原则.网上关于这个问题的文章有很多,读者 ...
- MySQL 四种事务隔离级的说明[转]
很早之前写的文章,重新回顾和学习下: 按照SQL:1992 事务隔离级别,InnoDB默认是可重复读的(REPEATABLE READ).MySQL/InnoDB 提供SQL标准所描述的所有四个事务隔 ...
- MySQL四种事务隔离级别详解
本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做 ...
- mysql四-1:单表查询
一 单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 二 关键 ...
随机推荐
- server12装.NET 3.5
参考:https://support.microsoft.com/en-us/help/2734782/net-framework-3-5-installation-error-0x800f0906- ...
- 关于cuda拷贝的速度测试
由于没有使用profiler,仅仅通过简单的传输函数测试,如下测试了10000个点,1000000个点,100000000个点的速度: 均按时钟周期来计时,通过MAX调整数据 int main(){ ...
- C++学习笔记-关键词
1.friend友元 采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口.但是,有时需要定义一些函数,这些函数不是类的一部分( ...
- swift -- 单例+ lazy懒加载 + 第三方库
//工具类单例 static let goods : NHGoods = { let good = NHGoods() return good }() //懒加载 lazy var registerB ...
- springboot整合activemq(三)配置文件
application.properties文件配置: #服务端口,8080被另一服务占用server.port=9090spring.activemq.broker-url=tcp://127.0. ...
- HDU计算机学院大学生程序设计竞赛(2015’12)The Country List
Problem Description As the 2010 World Expo hosted by Shanghai is coming, CC is very honorable to be ...
- js删除数组中的 "NaN"
[注意] js中的NaN不和任何值相等,包括自身 所以可以使用 x!=x 来判断x是否是NaN,当且仅当x为NaN时,表达式的结果为true NaN != NaN ; //true 可以依此删除数组中 ...
- 基于APPIUM测试微信公众号的UI自动化测试框架(结合Allure2测试报告框架)
框架初衷 前两周组内的小伙伴跟我说她现在测试的微信公众号项目(保险)每次上新产品时测试起来很费时,存在大量的重复操作(点点点),手工测试每个产品可能需要半天到一天的时间,复杂的产品需要两天. 由于保险 ...
- day 012 生成器 与 列表推导式
生成器的本质就是迭代器,写法和迭代器不一样,用法一样. 获取方法: 1.通过生成器函数 2.通过各种推导式来实现生成器 3.通过数据的转换也可以获取生成器 例如: 更改return 为 yield 即 ...
- oracle截取字符串,定索引
转载:https://www.cnblogs.com/qmfsun/p/4493918.html 使用Oracle中Instr()和substr()函数: 1 2 3 4 5 6 7 8 9 10 1 ...