mysql边边角角

一开始学习python的时候,下载python解释器然后直接在终端书写
pycharm能够更加方便快捷的帮助你书写python代码
excel word pdf
我们在终端操作mysql 也没有自动提示也无法保存等等,不方便开发
Navicat内部封装了所有的操作数据库的命令
用户使用它的时候只需要鼠标点点点完成操作,无需书写sql语句
navicat能够充当多个数据库的客户端
navicat图像化界面有时候反应速度较慢,你可以选择刷新或者关闭当前窗口再次打开即可
当你有一些需求该软件无法满足的时候,你就自己动手写sql
提示
1,mysql是不区分大小写的
	upper, lower
验证码忽略大小写,内部统一
2,mysql建议所有的关键字写大写
3,mysql中的注释有2种  ——  #
4,在navicat中如何快速的注释和解注释
	ctrl+? 加注释        ctrl+?基于上述操作再来一次就是解开注释
	版本不同,可shift+ctrl+? 

pymysql模块

支持python代码操作数据库mysql

直接安装,无需考虑版本
pip3 install pymysql

import pymysql
conn = pymysql.connect(
	host = '127.0.0.1',
	port = 3306,
	user = 'root',
	password = '123', # 就可以简写passwd = '123'
	database = 'db666' #还可以简写db = 'db666'
	charset = 'utf8') # 编码千万不要加-       #链接数据库
# cursor = conn.cursor()  # 产生一个游标对象(用来帮你执行命令的)(括号内不加参数的话,那么查询出来的数据是元祖的形式,数据不够明确,容易混乱)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) #字典形式返回数据,数据有具体的描述信息,更加的合理方便 
sql = 'select * from user'
affect_rows = cursor.execute(sql) # 返回值是当前sql语句执行的受影响的函数
cursor.fetchone() #只能结果的一条   数据本身
cursor.fetchall() #拿所有    列表套多个数据   
cursor.fetchmany() # 指定获取几条
---上述三个方读取数据的时候有一个类似于文件指针的特点
cursor.scroll(1,'relative') #相对于光标所在的当前位置往后移动
cursor.scroll(1,'absolute') #相对于数据开头往后移动

sql注入

利用一些特俗字符,结合软件固定的一些语句句式
非法侵入并违规操作

利用mysql注释的语法,造成了sql注入的问题
用于不需要属于用户名和密码也能够登陆并且获取到整个用户表的数据
日常应用软件在获取用户输入的内容时,都会限制一些特俗符号的输入
如何解决上述问题:
	所有敏感的信息不要自己去拼接操作,交互固定的模块帮你去过滤防止sql注入
 在pymysql中execute就能帮你过滤
 # sql注入
 sql = "select * from user where username='%s' and password='%s'"%(username,password)
 # 不要自己拼接
 sql = "select * from user where username=%s and password=%s"
 execute(sql,(username,password))# 只能识别%s

视图

概念:视图就是通过查询得到一张虚拟表,然后保存下来,下次可以直接使用, 视图就是表

为何用:如果要频繁的操作一张虚拟表(拼表组成的),你就可以制作成试图,后续直接操作

如何操作:

1,固定语法: create view 表名 as 虚拟表的查询sql语句

2,具体操作:
create view teacher2course as
select * from teacher INNER JOIN course
on teacher.tid = course.teacher_id;

注意

1,创建视图在硬盘上只会有表结构,没有表数据(数据还是来自于之前的表)
2,视图一般只用来查询里面的数据不要继续修改,可能会影响真正的表
3,视图使用频率不高,当你创建 了很多视图之后,会造成表的不好维护

触发器

定义:在满足对表数据进行增、删、改的情况下,自动触发的功能

使用触发器可以帮助我们实现监控、日志。。。

触发器可以在6种情况下自动触发增前,增后,删前,删后,改前改后

基本语法结构

create trigger 触发器的名字 before/after insert/update/delete on 表名 for each row
begin
	sql语句
end
# 具体使用 针对触发器的名字,我们通常需要做到见名起义
1,针对增
create tigger tri_before_insert_t1 before insert on t1
for each row
begin
	sql语句
end
create tigger tri_after_insert_t1 after insert on t1
for each row
begin
	sql语句
end
---针对删和盖,书写格式一致
ps:修改mysql默认的语句结束符,只作用于当前窗口,临时生效
	delimiter $$ 将默认的结束符号由;改为$$
	
删除触发器
drop trigger tri_after_insert_cmd;

事务

定义:开启一个事务可以包含多条sql语句 这些sql语句要么同时成功,要么一个都别想成功,称之为事务的原子性

作用:保证了对数据操作的安全性

事务的特性ACID:

A: 原子性 --一个事务是一个不可分割的单位,事务中包含的诸多操作,要么同时成功要么同时失败

C: 一致性 --事务必须是使数据库从一个一致性的状态变到另外一个一致性的状态,一致性跟原子性是密切相关的

I: 隔离性 --一个事务的执行不能被其他事务干扰

D: 持久性 --也叫’永久性‘,一个事务一旦提交成功执行成功,那么它对数据中数据的修改应该是永久的,接下来的其他操作或者故障不应该对其有任何的影响

如何使用事务:

# 事务相关的关键字
1,开启事务
start transaction;
2,回滚(回到事务执行之前的状态)
rollback
3,确认(确认之后就无法回滚了)
commit;

存储过程

存储过程就类似于python中的自定义函数

它的内部包含了一系列可以执行的sql语句,存储过程存放于mysql服务端中,可以直接通过调用存储过程触发内部sql语句的执行

基本使用

create procedure  # 存储过程的名字(形参1,形参2.。。。)
begin
	sql代码
end
# 调用
call 存储过程的名字();

三种开发模型

1,应用程序:程序员写代码开发 *
mysql:提前编写好存储过程,供程序员调用
优点:开发效率提升了,执行效率上去
缺点:考虑到认为元素,跨部门沟通的问题,后续的存储过程的扩展性差

2,应用程序:程序员写代码开发之外,设计到数据库操作也可以自己动手写 **
优点:扩展性高
缺点:开发效率降低,编写sql语句太过繁琐,而且后续还需要考虑sql优化的问题

3,应用程序:开发只写程序代码,不写sql语句,基于别人写好的操作mysql的python框架直接调用操作即可    ORM框架  ***
优点:开发效率比1,2的效率高
缺点:语句的扩展性差,可能会出现效率低下的问题

存储过程具体演示

delimiter $$
create procedure p1(
	in m int, # 只进不出,m不能返回出去
	in n int,
	out res int)  # 该形参可以返回出去
begin
	select tname from teacher where tid>m and tid<n;
	set res=0;   #将res变量修改,用来标识当前的存储过程代码确实执行了
end $$
delimiter;
# 针对形参res 不能直接传数据,应该传一个变量名
# 定义变量
set @ret=10;
#查看变量对应的值
select @ret

函数

跟存储过程是有区别的,存储过程是自定义的函数,函数就类似于是内置函数

流程控制

if 判断
while循环

索引

ps:数据都是存在于硬盘上的,查询数据不可避免的需要进行io操作

索引:就是一种数据结构,类似于书的目录,意味着以后在查询数据的时候应该先找目录再找数据,而不是一页一页的翻书,从而提升查询速度降低io操作

索引在mysql中也叫“键” ,是存储引擎用于快速查找记录 的一种数据结构

-primary key

-unique key

-index key

注意foreign key不是用来加速查询用的,不在我们的研究范围之内

上面的三种key,前面2种除了可以增加查询速度之外各自还具有约束条件,而最后一种index key 没有任何的约束条件,只是用来帮助你快速查询数据

本质:通过不断的缩小想要的数据范围筛选出最终的结果,同时将随机事件(一页一页的翻)变成顺序事件(先找目录,找数据)

也就是说有了索引机制,我们可以总是用一种固定的方式查找数据

一张表中可以有多个索引(多个目录)

索引虽然能帮助你加快查询速但也有缺点

1,当表中有大量数据存在的前提下,创建索引速度会很慢

2,在索引创建完毕后,对表的查询性能会大幅度的提升,但是写的性能也会大幅度的降低

索引不要随意创建!!!

b+树

只有叶子节点存放真实的数据,其他节点存放的是虚拟数据,仅仅是用来指路的
树的层级越高查询数据所需要经历的步骤越多(树有几层查询数据就需要几步)
一个磁盘块存储是有限制的
为什么建议你将id字段作为索引
	占的空间少,一个磁盘块能够存储的数据多
	那么久降低了树的高度,从而减少查询次数

聚集索引(primary key)

指的就是主键
innodb 只有2个文件,直接将主键存放在idb表中
myisam  三个文件,单独将索引存在一个文件

辅助索引(unique,index)

查询数据的时候不可能一直使用到主键,也有可能会用到name,password等其他字段

那么这个时候你是没有办法利用聚集索引。 这个时候就可以根据情况给其他字段设置辅助索引(也是一个b+树)

叶子节点存放的是数据对应的主键值
	先按照辅助索引拿到数据的主键值
	之后还是需要去主键的聚集索引里面查询数据

覆盖索引

在辅助索引的叶子节点就已经拿到了需要的数据

给name设置辅助索引
select name from user where name='jason';

非覆盖索引
select age from user where name='jason';
原文地址:https://www.cnblogs.com/caodan01/p/14465325.html