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;