MySQL知识点总结(必读,详细)

最基本的sql语句

之前写过一篇基础的sql语句,就不再赘述,可点击链接查看:基础SQL语句

MySQL常见的数据类型

mysql的数据类型:数值型、日期/时间、字符串类型
tinyint:小整数,数据类型用于保存一些范围的整数数值范围,MySQL中无布尔值,使用tinyint(1)构造
int:整数
varint:大整数
float:单精度浮点数,数值越大越不准确
double:双精度浮点数,数值越大月不准确
char:用于表示固定长度的字符串,可以包含最多达255个字符
varchar:用于变长的字符串,可以包含最多达255个字符。

虽然varchar使用起来较为灵活,但是从整个系统的性能角度来说,char数据类型的处理速度更快。

text:用于保存变长的大字符串
date:YYYY-MM-DD(2021-06-09)
timer:HH:MM:SS(“20:30:25”)
year:YYYY(2021)
datetime:YYYY-MM-DD HH:MM:SS(2021-02-27 00:00:00)
timestamp:YYYYMMDD HHMMSS(2019-08-09 00:00:00)

主键和外键

主键:表中的一个或多个字段,它的值用于唯一的标识表中的某一条记录。一个表中只能有一个主键,主键可以由多列组成

外键:用于建立两个表数据之间的联系。一个表中可以有多个外键

constraint 外键名称 foreign key ("列名”) references 另一个表的表名  ('列名')

表与表之间的关系

在创建有关联的表的时候,要先创建被关联的表,再创建关联表。

多对一或一对多

1、在创建被关联的表的时候,保证被关联的表的字段必须唯一 2、在创建关联表时,保证关联字段要有重复的

书和出版社的例子,多个书可以是一个出版社,一个出版社也可以有很多书
在这里插入图片描述
一对一
用户和管理员的例子,一个管理员对应一个用户
在这里插入图片描述
多对多

联合唯一:unique (book_id,author_id)
联合主键:alter table t1 add primary key (id,avg)

一个作者可以写多本书,一本书也可以有多个作者,双向的一对多
在这里插入图片描述

级联操作

级联操作:当主表的关联字段发生变更时,从表自动做出相应的改变

级联更新:当主表的记录发生更新时,从表自动更新自己的外键值
级联更新:当主表的关联记录被删除时,从表会自动删除与主表删除记录相关联的记录

mysql的索引

索引分为单列索引组合索引

单列索引:一个索引只包含单个列,一个表可以有多个单列索引,但这并不是组合索引

组合索引:一个索引包含多个列

索引的缺点:虽然索引提高了查询速度,但同时会降低更新表的速度,因为在更新表时,mysql不仅要保存数据,还要保存索引文件,建立索引会占用磁盘空间的索引文件
主键索引:主键可以看成是一种特殊的索引
普通索引
创建索引:

create index 索引名 on 表名(要设置索引的列名)

删除索引:

drop index 索引名 on 表名

唯一索引

create unique index 索引名 on 表名

组合索引
覆盖索引:在索引文件中直接获取数据

select id from userinfo where id = 1;

索引合并:把多个单列索引合并使用

select * from userinfo where id = 1 and username = "kkk";

无法命中索引的情况

1、like "xx"
2、使用函数
3、or
当or条件中有未建立索引的列时才失效
一下情况还是会走索引(id和email是索引):

select * from tb1 where id =1 or name = "kkk" and email = "123456";

4、类型不一致
如果是字符串类型,传入条件时必须用括号括起来
5、!=
如果是主键,还是会走索引
6、>
主键或索引类型是整数类型还是会走索引
7、order by
当根据索引排序时,选择的映射如果不是索引,,则不走索引;如果是对主键排序,还是会走索引

select email from tb1 oreder by email 

8、组合索引最前缀
如果组合索引为(name、email)
name and email     使用索引
name          使用索引
email        不使用索引

分页

在索引表中扫:

select * from userinfo where id in(select * from userinfo limit 20000,10);

上一页

select * from userinfo where id < 20000 order by id desc limit 10;

下一页

select * from userinfo where id >20000 limit 10;

上一页 192 193 194 195 [196] 197 198 [199] 下一页

select * from userinfo where id in((select * from userinfo where id >max_id limit (199-196)*每页个数) as N order by N.id desc limit 每页个数);

事务机制

事务是一条简单的sql语句组成,也可以由一组复杂的sql语句组成。事务是访问并更新数据库中各种数据项的一个程序执行单元。在事务中的操作,要么都执行,要么都不执行。

事务的ACID特性

原子性:原子性指整个数据库事务是不可分割的工作单位。只有使事务中所有的数据库操作都执行成功,整个事务的执行才算成功。事务中任何一个SQL语句执行失败,那么已经执行成功的sql语句也必须撤销,数据库状态应该退回到执行事务前的状态
一致性:事务将数据库从一种状态转变为另一种一致的状态,在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏
隔离性:事务的隔离性要求每个读写事务的对象与其他事务的操作对象能相互分离。
持久性:事务一旦提交,其结果就是永久性的。数据已经写入到数据库了,如果发生宕机等事故,数据库也能将数据恢复。

事务的分类

看到过一篇关于事务机制很好的文章:事务机制

扁平事务

带有保存点的扁平事务

链事务

嵌套事务

分布式事务

扁平事务:

在这种事务中,所有的操作都处于同一层次
缺点:不能提交或回滚事务的某一部分,不能分几个独立的步骤去提交

begin work
	Operation 1
	Operation 2
	Operation 3
	...
	Operation n
commit work

之前看到过一个解释,感觉很容易理解,如下:
在这里插入图片描述
带有保存点的扁平事务

支持扁平事务的操作,并且允许在事务执行过程中回滚到同一个事务中较早的一个状态

链事务

是指回滚时,只能恢复到最近一个保存点;而带有保存点的扁平事务则可以回滚到任意正确的保存点

嵌套事务

在事务中再嵌套事务,位于根节点的事务称为顶层事务,。事务的前驱称为父事务,其他事务称为子事务。

   BEGIN WORK
     SubTransaction1:
         BEGIN WORK
           SubOperationX
         COMMIT WORK
     SubTransaction2:
         BEGIN WORK
           SubOperationY
         COMMIT WORK
     ...
     SubTransactionN:
         BEGIN WORK
           SubOperationN
         COMMIT WORK
   COMMIT WORK


分布式事务

在一个分布式环境下运行的扁平事务

mysql的存储引擎

存储引擎是数据库的核心,对于mysql来说,存储引擎是以插件的形式运行的。数据库管理系统使用存储引擎进行创建、查询、更新和删除数据。

查看MySQL使用的引擎

show engines;

查看数据库默认使用的引擎

show variables like '%storage_engine%';

查看所有表使用的引擎

show table status;

Mysql各种存储引擎对比总结

函数

函数可以return值,可以嵌入到sql语句中使用,一般用于实现较简单的有针对性的功能

mysql自带函数

求绝对值

select ABC (-1);

求ASCLL

select ASCLL ('a');

时间相关

select NOW(),current_date(),current_time();

在这里插入图片描述

自定义函数

delimiter //
CREATE FUNCTION f2(
	i1 int,
	i2 int
)
returns int;
BEGIN
-- DECLARE 用于声明变量
	declare num int default 0;   
	set num = i1+i2;
	return(num);
END//
delimiter;
--执行函数
select f2(100,90);

mysql的物理删除和逻辑删除

物理删除:真实删除。将对应数据从数据库中删除
在数据库中直接使用delete、drop删除数据表属于物理删除

逻辑删除:假删除。逻辑上数据被删除,但数据本身依然存在。
设置is_deleted字段,设置其数据类型为bit,只有两个值0、1。0表示已经删除,1表示没有被删除

数据的加密和解密方式

加密的思路有两种:一是在数据库外部加密后存入数据库。二是在数据库内部对数据进行加密。

双向加密

1、encode/decode

传入两个值,一个是要加密的记录,一个是加密和解密的key

加密

SELECT ENCODE('sname','myname');

在这里插入图片描述

解密

SELECT DECODE(ENCODE('sname','myname'),'myname');

在这里插入图片描述
2、AES_ENCRYPT/AES_DECRYPT

这种加密算法使用AES(高级加密标准),使用key_str加密,key_str的长度可以达到256位,加密的结果是一个二进制的字符串

加密

SELECT AES_ENCRYPT('kkll','clean');

在这里插入图片描述
解密

SELECT AES_DECRYPT(AES_ENCRYPT('kkll','clean'),'clean');

在这里插入图片描述
3、DES_ENCRYPT/DES_DECRYPT

这种加密方法使用了3DES(三重加密数据算法),加密时可以选择使用key_num还是key_str

加密

SELECT DES_ENCRYPT('kkll',6),DES_ENCRYPT('kkll','pwd');

在这里插入图片描述
解密

SELECT DES_DECRYPT('kkll',6),DES_DECRYPT('kkll','pwd');

单向加密

这里只介绍一个单向加密
MD5加密

MD5加密结果是32位十六进制数的二进制字符串

SELECT MD5('kkklll');

在这里插入图片描述

时间戳与日期相互转换

时间戳转换成日期
函数:FROM_UNIXTIME

SELECT FROM_UNIXTIME(1429063399,'%Y年%m月%d日');

把日期转换为时间戳
函数UNIX_TIMESTAMP

SELECT UNIX_TIMESTAMP('2015-04-15');

MySQL常用时间格式
在这里插入图片描述

一些注意事项

1、避免使用select *
2、count(1)或count(列)代替count(*)
3、创建表时,尽量用char代替varchar
4、索引散列值(重复少)不适合建立索引,例如:性别 就不合适
5、表的字段顺序固定顺序的字段优先
6、组合索引代替多个单个索引(经常使用多个条件查询时)
7、连表时注意条件类型一致
8、尽量使用短索引

Guess you like

Origin blog.csdn.net/qq_45701130/article/details/112692879