windows,pycharm,python,PyMySQL( 七 )


7,联合索引,应遵循最左前缀
如果联合索引为(name,password)select * from tb1 where name='122' and password='233' --命中select * from tb1 where name='122' --命中select * from tb1 where password='233' --未命中select * from tb1 where name='122' or password='233' --未命中
7.4 索引 执行计划 在查询语句前,加,查看返回数据的type列 。如果结果是all,则查询速度最低;如果结果是/const,则查询速度最快;排序为all 7.5博客系统 表索引 设计
对于推荐表:
1)id为主键索引;
2)和可以设计为联合唯一索引,因为用户只能评价一篇文章一次 。
对于用户表:
1)id为主键索引;
2)用户名+密码,设计为联合索引,加快搜索进度;
3)手机号:唯一索引,因为不能重复;
4)邮箱:唯一索引,不能重复 。8.示例3:MySQL函数 8.1 内置函数
count()max()min()avg()reverse()concat()now()--获取当前时间date_format(now(),'%Y-%m-%d %H:%m:%s')--按格式格式化时间sleep(1)--等待1s......
8.2 自定义MySQL函数(一般不用)
--定义函数delimiter $$create function f1(i1 int,i1 int)returns intbegindeclare num int;declare maxID int;select max(id) from tb1 into maxID;set num = i1 + i2 +maxID;return(num);end $$delimiter;--调用函数select f1(11,22);select f1(11,id),name from tb1;--删除函数drop function f1;
8.3 存储过程(不常用)
将一系列SQL语句集合存储在数据库中,当主动去调用存储过程时,其中内部的SQL语句会按照逻辑执行 。
相比与使用执行SQL,可以节约数据传输的时间,但是修改存储过程比较麻烦 。
(更新中......) 附1:MySQL时区设置 时区 set ='+0:00':设置时区为0区
showlike '%%':查询时区附2:SQL注入 基于字符串格式化来拼接SQL语句,存在SQL注入风险,如下面代码所示:
例如用户输入user为‘ or 1=1 -- 输入pwd为123,
则下述sql为 * from db1 where name='' or 1=1 -- and ='{}'
--后的被认为是注释,则where条件为1==1就是True,则实际上用户名不需要正确,也不需要密码,也能登录
cursor.execute("use db1")user = input("请输入用户名")pwd = input("请输入密码")sql = "select * from db1 where name='{}' and password='{}'".format(user,pwd)cursor.excute(sql)result = cursor.fetchall()print(result)
为避免SQL注入问题,涉及到用户输入,应避免用传统的字符串格式化,应该用提供的方法
这种方法会帮助检测输入是否非法,且会帮助转义
cursor.execute("select * from db1 where name=%s and password=%s",[user,pwd])#或者cursor.execute("select * from db1 where name=%(n1)s and password=%(n2)s",{"n1":user,"n2":pwd})
附3:sql执行顺序 join
on
where
group by
order by
limit