一.使用正则表达式查询

  1. SELECT * FROM employee WHERE name REGEXP '^ale';
  2.  
  3. SELECT * FROM employee WHERE name REGEXP 'on$';
  4.  
  5. SELECT * FROM employee WHERE name REGEXP 'm{2}';
  6.  
  7. 小结:对字符串匹配的方式
  8. WHERE name = 'egon';
  9. WHERE name LIKE 'yua%';
  10. WHERE name REGEXP 'on$';

二.用户权限管理

  MySQL是一个tcp服务器,用于操作服务器上的文件数据,接收用户端发送的指令,接收指令时需要考虑安全问题,于是就需要用户权限的管理.

  在MySQL自带的mysql数据库中有4个表用于用户管理

  分别是(优先级从高到低):

    user --> db --> tables_priv --> columns_priv

  1. #授权表
  2. user #该表放行的权限,针对:所有数据,所有库下所有表,以及表下的所有字段
  3. db #该表放行的权限,针对:某一数据库,该数据库下的所有表,以及表下的所有字段
  4. tables_priv #该表放行的权限。针对:某一张表,以及该表下的所有字段
  5. columns_priv #该表放行的权限,针对:某一个字段
  6.  
  7. #按图解释:
  8. user:放行db1db2及其包含的所有
  9. db:放行db1,及其db1包含的所有
  10. tables_priv:放行db1.table1,及其该表包含的所有
  11. columns_prive:放行db1.table1.column1,只放行该字段
  1. #创建用户
  2. create user 用户名@"主机地址" identified by "密码";
  3. create user 'egon'@'1.1.1.1' identified by '';
  4. create user 'egon'@'192.168.1.%' identified by '';
  5. create user 'egon'@'%' identified by '';
  6. 此处的主机地址不是服务器地址,时客户端地址
  7.  
  8. #授权:对文件夹,对文件,对文件某一字段的权限
  9. 查看帮助:help grant
  10. 常用权限有:select,update,alter,delete
  11. all可以代表除了grant之外的所有权限
  12.  
  13. #授权语句
  14. #语法:grant [权限的名称 | all ] on 数据库.库名 to 用户名@"主机地址"
  15.  
  16. #针对所有库的授权:*.*
  17. grant select on *.* to 'egon1'@'localhost' identified by ''; #只在user表中可以查到egon1用户的select权限被设置为Y
  18.  
  19. #针对某一数据库:db1.*
  20. grant select on db1.* to 'egon2'@'%' identified by ''; #只在db表中可以查到egon2用户的select权限被设置为Y
  21.  
  22. #针对某一个表:db1.t1
  23. grant select on db1.t1 to 'egon3'@'%' identified by ''; #只在tables_priv表中可以查到egon3用户的select权限
  24.  
  25. #针对某一个字段:
  26. mysql> select * from t3;
  27. +------+-------+------+
  28. | id | name | age |
  29. +------+-------+------+
  30. | 1 | egon1 | 18 |
  31. | 2 | egon2 | 19 |
  32. | 3 | egon3 | 29 |
  33. +------+-------+------+
  34.  
  35. grant select (id,name),update (age) on db1.t3 to 'egon4'@'localhost' identified by '';
  36. #可以在tables_priv和columns_priv中看到相应的权限
  37. mysql> select * from tables_priv where user='egon4'\G
  38. *************************** 1. row ***************************
  39. Host: localhost
  40. Db: db1
  41. User: egon4
  42. Table_name: t3
  43. Grantor: root@localhost
  44. Timestamp: 0000-00-00 00:00:00
  45. Table_priv:
  46. Column_priv: Select,Update
  47. row in set (0.00 sec)
  48.  
  49. mysql> select * from columns_priv where user='egon4'\G
  50. *************************** 1. row ***************************
  51. Host: localhost
  52. Db: db1
  53. User: egon4
  54. Table_name: t3
  55. Column_name: id
  56. Timestamp: 0000-00-00 00:00:00
  57. Column_priv: Select
  58. *************************** 2. row ***************************
  59. Host: localhost
  60. Db: db1
  61. User: egon4
  62. Table_name: t3
  63. Column_name: name
  64. Timestamp: 0000-00-00 00:00:00
  65. Column_priv: Select
  66. *************************** 3. row ***************************
  67. Host: localhost
  68. Db: db1
  69. User: egon4
  70. Table_name: t3
  71. Column_name: age
  72. Timestamp: 0000-00-00 00:00:00
  73. Column_priv: Update
  74. rows in set (0.00 sec)
  75.  
  76. #删除权限
  77. #语法:revoke 权限的名称 on 数据库.表名 from 用户名@"主机地址";
  78. revoke select on db1.* from 'egon'@'%';

三.pymysql模块

  1. 安装
  2. pip3 install pymysql

1.链接.执行sql,关闭(游标)

  1. # 创建链接得到一个链接对象
  2. conn = pymysql.Connect(
  3. host="127.0.0.1", # 数据库服务器主机地址
  4. user="root", # 用户名
  5. password="admin", # 密码
  6. database="day42", # 数据库名称
  7. port=3306, # 端口号 可选 整型
  8. charset="utf8" # 编码 可选
  9. )
  10. # 获取游标对象 pymysql.cursors.DictCursor指定 返回的结果类型 为字典 默认是元祖类型
  11. cursor = conn.cursor(pymysql.cursors.DictCursor)
  12.  
  13. # 查询数据
  14. sql = "select *from emp"
  15.  
  16. # 执行sql 如果是select 语句返回的是查询成功的记录数目
  17. res = cursor.execute(sql)
  18. print(res)
  19.  
  20. # 关闭链接
  21. cursor.close()
  22. conn.close()

2.execute()之sql注入

  注意:符号"--"会注释掉它之后的sql,正确的语法:"--"后至少有一个任意字符

  根本原理:就根据程序的字符串拼接name='%s',输入一个xxx'-- haha,用输入的xxx加'在程序中拼接成一个判断条件name='xxx' -- haha'

  1. 最后那一个空格,在一条sql语句中如果遇到select * from t1 where id > 3 -- and name='egon';则--之后的条件被注释掉了
  2.  
  3. #1、sql注入之:用户存在,绕过密码
  4. egon' -- 任意字符
  5.  
  6. #2、sql注入之:用户不存在,绕过用户与密码
  7. xxx' or 1=1 -- 任意字符

  解决方法:

  1. # 原来是我们对sql进行字符串拼接
  2. # sql="select * from userinfo where name='%s' and password='%s'" %(user,pwd)
  3. # print(sql)
  4. # res=cursor.execute(sql)
  5.  
  6. #改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了)
  7. sql="select * from userinfo where name=%s and password=%s" #!!!注意%s需要去掉引号,因为pymysql会自动为我们加上
  8. res=cursor.execute(sql,[user,pwd]) #pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。

3.增.删.改:conn.commit()

  1. import pymysql
  2. #链接
  3. conn=pymysql.connect(host='localhost',user='root',password='',database='egon')
  4. #游标
  5. cursor=conn.cursor()
  6.  
  7. #执行sql语句
  8. #part1
  9. # sql='insert into userinfo(name,password) values("root","123456");'
  10. # res=cursor.execute(sql) #执行sql语句,返回sql影响成功的行数
  11. # print(res)
  12.  
  13. #part2
  14. # sql='insert into userinfo(name,password) values(%s,%s);'
  15. # res=cursor.execute(sql,("root","123456")) #执行sql语句,返回sql影响成功的行数
  16. # print(res)
  17.  
  18. #part3
  19. sql='insert into userinfo(name,password) values(%s,%s);'
  20. res=cursor.executemany(sql,[("root",""),("lhf",""),("eee","")]) #执行sql语句,返回sql影响成功的行数
  21. print(res)
  22.  
  23. conn.commit() #提交后才发现表中插入记录成功
  24. cursor.close()
  25. conn.close()

4.查:fetchone,fetchmany,fetchall

  1. import pymysql
  2. #链接
  3. conn=pymysql.connect(host='localhost',user='root',password='',database='egon')
  4. #游标
  5. cursor=conn.cursor()
  6.  
  7. #执行sql语句
  8. sql='select * from userinfo;'
  9. rows=cursor.execute(sql) #执行sql语句,返回sql影响成功的行数rows,将结果放入一个集合,等待被查询
  10.  
  11. # cursor.scroll(3,mode='absolute') # 相对绝对位置移动
  12. # cursor.scroll(3,mode='relative') # 相对当前位置移动
  13. res1=cursor.fetchone()
  14. res2=cursor.fetchone()
  15. res3=cursor.fetchone()
  16. res4=cursor.fetchmany(2)
  17. res5=cursor.fetchall()
  18. print(res1)
  19. print(res2)
  20. print(res3)
  21. print(res4)
  22. print(res5)
  23. print('%s rows in set (0.00 sec)' %rows)
  24.  
  25. conn.commit() #提交后才发现表中插入记录成功
  26. cursor.close()
  27. conn.close()
  28.  
  29. '''
  30. (1, 'root', '123456')
  31. (2, 'root', '123456')
  32. (3, 'root', '123456')
  33. ((4, 'root', '123456'), (5, 'root', '123456'))
  34. ((6, 'root', '123456'), (7, 'lhf', '12356'), (8, 'eee', '156'))
  35. rows in set (0.00 sec)
  36. '''

MySQL(四)的更多相关文章

  1. Mysql 四种事务隔离介绍以及锁机制

    还有很多不太懂,这里收集几份大佬文章“飞机票”,待我整理好了,再好好写一篇文章吧. MySQL的四种事务隔离级别 https://www.cnblogs.com/huanongying/p/70215 ...

  2. MySQL 四种事务隔离级的说明

    很早之前写的文章,重新回顾和学习下: 按照SQL:1992 事务隔离级别,InnoDB默认是可重复读的(REPEATABLE READ).MySQL/InnoDB 提供SQL标准所描述的所有四个事务隔 ...

  3. 细说Mysql四种安装方法及自动化部署

    一.简介 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库, 每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据. 我们也可以将数据存储在文件中,但是 ...

  4. mysql四种事务隔离级的说明

    ·未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据 ·提交读(Read Committed):只能读取到已经提交的数据.Oracle等多数数据库默 ...

  5. 【转载】mysql 四种隔离级别分析

    sql标准中,有四种隔离级别,各个离级别都有各自的规则,隔离级别越低,允许并发越大,消耗的资源越少,但是越不安全,下面就mysql数据库来分别介绍一下(每个存储引擎实施的隔离级别会有稍微的不同)mys ...

  6. MySQL 四种隔离级别

    什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事务的结束有 ...

  7. MySQL四种隔离级别和MVCC

    事务在一个数据库中的地位尤为重要,尤其是高并发的场合.保证数据库操作的原子性和错误出现情况下的回滚,对数据的安全性和可靠性提供了保障.事务有四大原则,即ACID原则.网上关于这个问题的文章有很多,读者 ...

  8. MySQL 四种事务隔离级的说明[转]

    很早之前写的文章,重新回顾和学习下: 按照SQL:1992 事务隔离级别,InnoDB默认是可重复读的(REPEATABLE READ).MySQL/InnoDB 提供SQL标准所描述的所有四个事务隔 ...

  9. MySQL四种事务隔离级别详解

    本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做 ...

  10. mysql四-1:单表查询

    一 单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 二 关键 ...

随机推荐

  1. server12装.NET 3.5

    参考:https://support.microsoft.com/en-us/help/2734782/net-framework-3-5-installation-error-0x800f0906- ...

  2. 关于cuda拷贝的速度测试

    由于没有使用profiler,仅仅通过简单的传输函数测试,如下测试了10000个点,1000000个点,100000000个点的速度: 均按时钟周期来计时,通过MAX调整数据 int main(){ ...

  3. C++学习笔记-关键词

    1.friend友元 采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口.但是,有时需要定义一些函数,这些函数不是类的一部分( ...

  4. swift -- 单例+ lazy懒加载 + 第三方库

    //工具类单例 static let goods : NHGoods = { let good = NHGoods() return good }() //懒加载 lazy var registerB ...

  5. springboot整合activemq(三)配置文件

    application.properties文件配置: #服务端口,8080被另一服务占用server.port=9090spring.activemq.broker-url=tcp://127.0. ...

  6. HDU计算机学院大学生程序设计竞赛(2015’12)The Country List

    Problem Description As the 2010 World Expo hosted by Shanghai is coming, CC is very honorable to be ...

  7. js删除数组中的 "NaN"

    [注意] js中的NaN不和任何值相等,包括自身 所以可以使用 x!=x 来判断x是否是NaN,当且仅当x为NaN时,表达式的结果为true NaN != NaN ; //true 可以依此删除数组中 ...

  8. 基于APPIUM测试微信公众号的UI自动化测试框架(结合Allure2测试报告框架)

    框架初衷 前两周组内的小伙伴跟我说她现在测试的微信公众号项目(保险)每次上新产品时测试起来很费时,存在大量的重复操作(点点点),手工测试每个产品可能需要半天到一天的时间,复杂的产品需要两天. 由于保险 ...

  9. day 012 生成器 与 列表推导式

    生成器的本质就是迭代器,写法和迭代器不一样,用法一样. 获取方法: 1.通过生成器函数 2.通过各种推导式来实现生成器 3.通过数据的转换也可以获取生成器 例如: 更改return 为 yield 即 ...

  10. oracle截取字符串,定索引

    转载:https://www.cnblogs.com/qmfsun/p/4493918.html 使用Oracle中Instr()和substr()函数: 1 2 3 4 5 6 7 8 9 10 1 ...