zoukankan      html  css  js  c++  java
  • 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的操作语句)
  • 相关阅读:
    OpenGL搭建环境-VS2012【OpenGL】
    IOS内存约定-【ios】
    bootstrap下jQuery自动完成的样式调整-【jQuery】
    如何访问https的网站?-【httpclient】
    twitter typeahead控件使用经历
    grails服务端口冲突解决办法-【grails】
    jQuery中live函数的替代-【jQuery】
    如何自动设置网页中meta节点keywords属性-【SEO】
    如何在grails2.3.x中的fork模式下进行调试?-【grails】
    树的简介及Java实现
  • 原文地址:https://www.cnblogs.com/Fzhiyuan/p/11042866.html
Copyright © 2011-2022 走看看