day43

自己总结内容:
    一:在python中连接mysql;
  1.   在终端cmd 中输入 pip3 install  pymysql    
  2.   在pycham中输入以下
    
      import pymysql
    连接mysql服务器
   conn = pymysql.connect(host="localhost",user="root",
     password="123",database="db1",charset="utf8")    host可以是主机名,可以是主机地址,user为用户名 ,database为要连接的数据库,charset为字符编码
    建立一只手,从服务器中取数据
   #cursor = conn.cursor()  如果括号中没指定,他取出来的数据是以元组类型显示,无法更好的见名知意
   cursor = conn.cursor(cursor=pymysql.cursor.DictCursor)  通常采用字典这种方式,更好的知道数据的内容
       利用sql语句来完成对数据库的操作
   sql = "select * from student where id> %s" % (12,)
       1: 函数方法功能体
     ......
      功能方法结束
   
   cursor.execute(sql)        把sql语法提交给服务器
    2:删除和更新的时候需要事务提交commit
   conn.commit()   查找的时候不需要此功能
   #res = cursor.fetchone()     获得一条数据
   #res = cursor.fetchmany(10)  获得许多条数据 即括号内的数据
   res = cursor.fetchall()      获得全部数据                  
      这样得到的数据都是列表里面套字典
   print(res)               打印一下这个数据
   cursor.close()           关闭手这只工具
   conn.close()   关闭连接
   
   案列:
       向t2表中插入10条数据
    import pymysql
    import random
    # 连接mysql服务器a
    conn = pymysql.connect(host='localhost', user='root', password='123', database='t123', charset='utf8')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    sql = 'insert into t2 (name,age) values (%s,%s)'
    data = []
    for i in range(10):
     num = random.randrange(0, 10)
     data.append(('root' + str(num), 'root' + str(num) + '@qq.com'))
    cursor.executemany(sql, data)  #提交多条
    conn.commit()
    res = cursor.fetchall()
    print(res)
    cursor.close()
    conn.close()
   import mysql
 改表:
 分组:select id,name from 表名 where 条件1 and 条件2 group by 分组的列名 having 分组后的二次筛选 limit 限制取几条
 

 多表连接查询:左连接 union 右连接     ===>全连接     显示的是有对应关系的数据, 还显示两张表中彼此没有对应关系的数据
    inner join ...on... #内连接     只是连接有对应关系的两张表
    left join ...on...#左连接  显示有对应关系的数据,且显示左表中没的对应关系的数据 即左表数据全部显示,右边表数据无关系的不显示
    right join ...on...#右连接      显示有对应关系的数据,且显示右表中没的对应关系的数据 即右表数据全部显示,左表数据无关系的不显示
    思路先连表,在查询
    多表连接可以不断的和虚拟表连接    表连接完成再有条件,再有分组 再有二次筛选 再有排序 再有限制取几条
 数据库备份:
    语法:
     mysqldump -h 服务器 -u用户名 -p密码 数据库名 >备份文件.sql
     #示例:
     #单库备份
     mysqldump -uroot -p123 db1 > db1.sql
     mysqldump -uroot -p123 db1 table1 table2 > db1-table1-table2.sql
     #多库备份
     mysqldump -uroot -p123 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql
     #备份所有库
     mysqldump -uroot -p123 --all-databases > all.sql
 sql注入:字符串的拼接关系所致,用特殊符号把sql语句进行了注释,所以形成了安全问题
         在服务端防止sql注入问题,不要自己拼接字符串,让pymysql去拼接,用execute()来传值,把需要的值写在他的括号里面
   案例;
   import mysql
   conn = pymysql.connect(host='localhost', user='root', password='123', database='t123', charset='utf8')
   cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
   inp_user = input("请输入用户名:").strip()
   inp_pwd = input("前输入密码:").strip()
   sql = "select * from yy where name=%s and pwd = %s"
   print(sql)
  在这里就可以用execute来解决sql注入带来的问题
   res = cursor.execute(sql, (inp_user, inp_pwd))      #在这里传值,注意括号,解决了sql注入
   print(res)
   if res:
    print("登录成功")
   else:
    print("登录失败")
   cursor.close()
   conn.close()
        在表中添加数据 前提是在pycham中用语法添加数据
   import mysql
   conn = pymysql.connect(host='localhost', user='root', password='123', database='t123', charset='utf8')
   cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
   sql = "insert into yy(name,pwd) values (%s,%s)"          添加数据                   *******
   print(sql)
   rows = cursor.execute(sql, ('张无忌', "234"))                        ***************
   print(rows)
    #data = ['name':'asa','ggg':123]
    #rows = cursor.executemany(sql,data)                #插入多条数据
   #rows = cursor.execute('update yy set name="sb" where pwd="pwdr"')     修改数据 
   #print(rows)
   conn.commit()        #只有执行commit 这条增加的数据才会正真的添加到表中   ****************
   cursor.close()
   conn.close()
 存储引擎:
  
  create table t1(
   id int auto_increment primary key,
   name varchar(32) not null default ''
  )engine=Innodb charset=utf8;
  
  分类: (****************)
   Innodb
    1.(默认版本包含5.5)
    2.支持事务
    3.不支持全文索引
    4.索引和数据都是在同一个文件中, .ibd
      表的结构实在.frm文件中
   MyIsam
    1.(默认版本5.5以下 5.3)
    2.不支持事务
    3.支持全文索引
    4..frm: 表结构
      .MYD: 表数据
      .MYI: 表索引
     
     
   memory
    
   全文索引:
    sphinx
  
 索引:
  
  作用: 加快查询的速度
  
  类比: 新华字典的目录, 可以将索引理解成一个特殊的文件, 然后如果没有这个文件的话, 查询是从前到后查找数据的,
      如果有这个文件的话, 会按照一种特殊的数据结构(二叉树)查找数据
  
  分类:
   主键索引: 加快查询 + 不能重复 + 不能为空  primary key
   唯一索引: 加快查询 + 不能重复   unique(列名)
    联合唯一索引: 加快查询 + 不能重复 unique(列名1,列名2)
   普通索引: 加快查询    index('列名')
  
  
  创建:
   
   主键索引:
    第一种:
     create table t1(
      id int auto_increment primary key,
      name varchar(32) not null default ''
     )engine=Innodb charset=utf8;
    第二种:
     alter table t1 change id id int  auto_increment primary key;
     
   唯一索引:
   
    第一种:
     create table t1(
      id int auto_increment primary key,
      name varchar(32) not null default '',
      unique ix_name ('name')
     )engine=Innodb charset=utf8;
     
    第二种:
     create unique index 索引名称(ix_name) on 表名(t1)(name);
     create unique index 索引名称(ix_name_age) on 表名(t1)(name,age);
   
   普通索引:
   
    第一种:
     create table t1(
      id int auto_increment primary key,
      name varchar(32) not null default '',
      index ix_name ('name')
     )engine=Innodb charset=utf8;
     
    第二种:
     create  index 索引名称(ix_name) on 表名(t1)(name);
   
   删除:
    drop 索引名称(ix_name) on 表名(t1);
    
  场景:
   使用频繁的列上加一个索引
    
  索引的缺点:
   
   版本5.3以下:
    删除和修改的速度就变慢了
   
   版本5.5以上:
    删除和修改的速度不是特别的慢
  
   create table t12(
    id int auto_increment primary key,
    name varchar(32) not null default '',
    email varchar(32) not null default ''
   )engine=Innodb charset=utf8;
   
  
  索引的使用:
   
   explain 工具
   
   查看sql语句是否用的上索引, 或者查看sql执行效率的工具
   
   给执行的SQL语句出一个报告, 通过此报告来判断sql语句的执行效率和效果
   
   ES (elasticsearch )
   SQL语句的规则:
   
    - 不建议使用 like 进行搜索
    - 组合索引最左前缀
     如果组合索引为:(name,email)
     where name and email       -- 使用索引
     where name                 -- 使用索引
     where email                -- 不使用索引
   
  慢日志查询(slow log):
   
   日志文件: 记录了执行速度特别慢的SQL语句
   
   开启的步骤:
    1. show variables like '%query%';
    
    2. set global long_query_time = 1; 设置慢查询的时间
    3.  slow_query_log = ON                                                 
    4.  slow_query_log_file  = E:programmysql-5.6.44-winx64dataoldboy-slow.log
  普通日志记录(general  log):
   
   SQL审计 (记录sql的操作语句)
原文地址:https://www.cnblogs.com/Fzhiyuan/p/11042866.html