day44

day43.5        sql注入,事务
 
pymysql
import pymysql
 
connect -----------------conn----------------cursor
 
执行sql语句-----excute(sql)
 
取数据
    fetchone
    fetchall
    fetchmany
增加删除操作
    conn.commit()
 
 
登陆验证:
    写sql语句,%传值的时候需要加引号
第一
    

 

第二
上述两个例子,账号密码都不对,但是都能登陆
 
上面出现的这些问题称之为sql注入
 
出现问题的根源是:
 
 
                    我们在接受用户输入的参数的时候,没有进行转义
解决sql注入:
   1 #对用户的输入的值进行转义
 
  2 #cursor.excute(sql,(username,pwd)), pymysql中进行操作
 
 
 
插入多条
data =[('linux','123'),(),()]
 
cursor.excutemany(sql,data)
 
如果sql错误就进行回滚
 
 
 
cursor.lastrowid
??????????插入之后获取最后一条Id,返回的行数和id主键没关系.
 
事务:
转账,需要更新两个人的钱.如果只更新其中一个,就不成功
特性******
原子性:一组操作:要不都成功,要不都失败
一致性:事务发生前和发生后,数据的总额依然匹配
隔离性:这个事务对其他事务没影响
持久性:当事务完成后(commit以后),这些影响是不能更改的,不能撤销,只能通过补偿性事务(再开一次事务)
 
解决方法:
    开启事务(start transaction)
    执行sql操作
    commit   提交上面的sql语句,让其生效
    rollback   如果任务失败,回滚
    
 ps:针对mysql
        start transaction
        drop table t1;
        rollback  ###这个rollback就回不去了
 
了了解
视图:
    产生的原因:如果有一个sql语句,频繁的会被使用到,比如说:
    select * from t1 where id =1;   ======>v1
搞一个映射或者取一个别名.
   
     select * from v1;这个就叫视图
创建一个视图
create view v1 as select * from t1 where id =1;
 
show full tables;###可以看这个表是不是视图  v1就显示为view
 
 
修改一个视图
    alter view v1 as sql语句;
 
删除
    drop view v1;
 
问题,问题:
    如果原生的表的数据发生变化,那视图会不会发生变化???
    也会变化
 
    视图中的数据能不能修改;
    不能
 
应用场景:
    mysql(DBA)
        生成视图view
    程序:
        调用 select * from v1;
 
函数: 不要轻易使用,影响效率,在程序中用代码计算,计算完成,再传给sql语句执行
    char_length("hello")
    concat("hello"."world")
    format(13.2567.,2)   保留两位,进行四舍五入
    instr ('hello','e')返回第一个e出现的位置
    left('hello',3)  从1到3切片
    right('hello'3) 从右开始切片
    lower()大写变小写
    upper()小写变大写
    ltrim()左去留白
    substring('hello',2,3)求子字符串  从2开始,取3个
    locate('el','hello')
    repeat('x'.5)重复五次
    reverse('hello')  反转 olleh
 
存储过程:
    将一大堆sql语句进行封装,类似于函数,结果就是存储过程.
    delimiter //
    create procedure p1()
    BEGIN
        select * from t1;
        ..............
    END //
    delimiter;
    
一般都是DBA去写的
 
这个是程序里去调的
    call p1();
 
 
了了解
传参
 
create procedure p1(
    in n1 int,
    in n2 int
)
 
select * from t1 where id > n1;
 
 
程序里调用传参
call p1(12,2)
 
#####out
 
delimiter //
    create procedure p3(
        in n1 int,
        out n2 int
)
    BEGIN
        select * from t1;
        set n2 =1
        ..............
    END //
    delimiter;
 
 
程序里
set @v2=123212;    需要定义一个默认值
call p3(12,@v2)
select @v2;
 
触发器:
    向用户表中添加一条数据的同时,在日志里也要添加一条记录
 
create trigger t1 before insert on t7 for each row
BEGIN
    insert into t11 (name,moey) values ("sss",111)
END
 
 
 ##############################################
 
day44   存储引擎    索引   权限   日志慢查询
 
 
#存储引擎:
分类:Innodb(5.5版本以上)
          1:支持事务
            2:不支持全文索引
            3索引和数据,都是在同一个文件中.ibd结尾 ,   .frm表结构文件  
        MyIsam(5.5以下)
           1:不支持事务
            2:支持全文索引
            3.文件名  frm表结构  .MYD表数据  MYI表索引
        memory(基本用不到)
全文索引:国内用插件(sphinx)
 
 
#索引:
作用:加快查询的速度,可以将索引理解成一个特殊的文件,如果没有这个文件,查询是从前到后查找数据,如果有这个文件会按照一种特殊的数据结构(二叉树)查找数据.
 
类比:新华字典的目录
 
分类:
主键索引:加快查询     不能重复    不能为空 primary key
唯一索引:加快查询    不能重复    unique(列名)          联合唯一索引:加快查询,不能重复 unique(列1,列2)
普通索引:加快查询    index(列名)
创建:
主键索引:
    第一种:创建表的时候创建
    第二种:表已经成功了  alter table t1 change id(旧) id(新) int auto_increment primary key;
唯一索引:
    第一种:建表的时候建
    第二种:create unique index 索引名字 on 表名(列名:给哪个列添加索引)
联合  :
 
普通索引:
第一种
    index(列名)
 
给eamil加索引
第二种:create index 自己给索引取的名字 on t12(email);
加联合索引 create index 名字 on t12 (name.email);
删除:
    drop 索引名 on 表名;
场景:
    使用频繁的列上加一个索引
 
索引的缺点:
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语句是否用得上索引的工具
    explain sql语句;(给执行的语句出一个报告,通过此报告来判断????????????
    其中type列的解释
      ALL INDEX RANGE CONST SYSTEM
                                                                                                                             规则:
    不用like
    不用函数
    类型不一致                                                                                                            order by
    最左前缀索引(如果是组合索引(name,email),两个值,前面那个索引name能用的到,后面email那个用不到)
                     
慢日志查询:
    日志文件:记录了执行速度特别慢的日志
    查看日志:show variables like '%query%';#里面有日志
set global slow_query_log=ON;  #开启
long_query_time   超过多少时间进慢日志
 
普通日志:
    show variables like '%general%';
SQL审计(记录sql的操作日志)
权限:
创建用户:
show variables like '%general%';
            +------------------+------------------------------------------------+
            | Variable_name    | Value                                          |
            +------------------+------------------------------------------------+
            | general_log      | ON                                             |
            | general_log_file | E:\program\mysql-5.6.44-winx64\data\oldboy.log |
            +------------------+------------------------------------------------+
            set global general_log = ON;
            
        
        权限管理:
            
            创建用户
                create user '用户名'@'IP地址' identified by '密码';
                creaee user 'zekai'@'192.168.1.123' identified by '123qwe';
                creaee user 'zekai'@'192.168.1.%' identified by '123qwe';
                create user 'zekai'@'%' identified by '123qwe';
                
            删除用户
                drop user '用户名'@'IP地址';
            修改用户
                rename user '用户名'@'IP地址' to '新用户名'@'IP地址';
                
            修改密码
                set password for '用户名'@'IP地址' = Password('新密码')
            
            授权:
                grant  权限 on 数据库.表 to   '用户'@'IP地址'      -- 授权
                
                grant select on db1.*  to 'zekai'@'%';
                grant select on *.*  to 'zekai'@'%';
                grant select, insert, delete on db1.*  to 'zekai'@'%';
            
            记住:
                flush privileges;
 
 
 
 
 
posted @ 2019-06-17 22:05  轩辕12  阅读(186)  评论(0编辑  收藏  举报