由于当时写的时候用的md文档,所以图片信息本地的传不上来,可以自己实战一下。
文章目录
- MySQL常用命令
- 创建、删除数据库
- 登录数据库
- 显示所有数据库
- 显示数据库引擎
- 建库+建表
- 主键,多字段联合主键
- 外键约束、非空约束、唯一约束、默认约束(后续补充)
- 设置表的属性值自动增加
- 查看表的基本结构
- 查看建表语句
- 修改表名
- (重点)查询语句
- order by(对结果排序)
- group by(分组查询)、having(重点)
- in、between and
- like、%、_
- and、or(and优先级高于or)
- distinct(结果去重)
- 内连接 inner join on
- 左连接left join on
- 右连接right join on
- 子查询
- 索引
- 函数
- 字符串连接函数concat
- 字符串连接函数concat_wa()
- 脏读、幻读、不可重复读
- 脏读(Drity Read):
- 不可重复读(Non-repeatable read):
- 幻读(Phantom Read):
- 事务隔离级别
- SQL 标准定义了四个隔离级别:
- 隔离级别与锁的关系
- 锁
- 对MySQL的锁了解吗**
- **隔离级别与锁的关系**
- 按照锁的粒度分数据库锁有哪些?锁机制与InnoDB锁算法**
- 数据库的乐观锁和悲观锁是什么?怎么实现的?
- 存储过程
- 优点
- 缺点
- 触发器
- 什么是触发器?触发器的使用场景有哪些?
- MySQL中都有哪些触发器?
- 笔记
MySQL常用命令
创建、删除数据库
create database dabase_name;
DROP DATABASE database_name; (无提示信息且不能恢复)
登录数据库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Wz8ram7-1604544945432)(C:\Users\itzouch\AppData\Roaming\Typora\typora-user-images\image-20200416084947996.png)]
显示所有数据库
show databases;
显示数据库引擎
show engines;
建库+建表
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HViPfBCX-1604544945438)(C:\Users\itzouch\AppData\Roaming\Typora\typora-user-images\image-20200416090840980.png)]
主键,多字段联合主键
方法1.[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-guXj6hIE-1604544945440)(C:\Users\itzouch\AppData\Roaming\Typora\typora-user-images\image-20200416090956741.png)]
方法2.[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zashvJz4-1604544945442)(C:\Users\itzouch\AppData\Roaming\Typora\typora-user-images\image-20200416091048718.png)]
多字段联合主键:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7VHXe5EP-1604544945444)(C:\Users\itzouch\AppData\Roaming\Typora\typora-user-images\image-20200416091158013.png)]
外键约束、非空约束、唯一约束、默认约束(后续补充)
设置表的属性值自动增加
规定属性自增的字段必须是主键的一部分且一个表只有一个字段能自增。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-csL7EOQO-1604544945445)(C:\Users\itzouch\AppData\Roaming\Typora\typora-user-images\image-20200416092013170.png)]
查看表的基本结构
desc 表名;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JCebsLIU-1604544945446)(C:\Users\itzouch\AppData\Roaming\Typora\typora-user-images\image-20200416092440467.png)]
查看建表语句
show create table 表名;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vvq9lgcT-1604544945447)(C:\Users\itzouch\AppData\Roaming\Typora\typora-user-images\image-20200416092609370.png)]
修改表名
alter table 表名 rename 表名;
(重点)查询语句
order by(对结果排序)
select 字段名 from 表名 order by 字段;
默认升序排序 ,如果要降序则是:
select 字段名 from 表名 order by 字段 DESC;
ASC是升序,但是默认为升,所以ASC加不加无所谓。
group by(分组查询)、having(重点)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NuMivc7i-1604544945447)(C:\Users\itzouch\AppData\Roaming\Typora\typora-user-images\image-20200416101110259.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QhMD6lmt-1604544945449)(C:\Users\itzouch\AppData\Roaming\Typora\typora-user-images\image-20200416102301019.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QPuIj8c8-1604544945449)(C:\Users\itzouch\AppData\Roaming\Typora\typora-user-images\image-20200513232615551.png)]
in、between and
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PU4ssPPP-1604544945450)(C:\Users\itzouch\AppData\Roaming\Typora\typora-user-images\image-20200416095213094.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cCH8RPTc-1604544945451)(C:\Users\itzouch\AppData\Roaming\Typora\typora-user-images\image-20200416095416222.png)]
区别:如果他们都为空的话,between会限制select语句让它一条记录都无法选出来,但是in的话则相反,这个限制条件不会起任何作用,会选择出所有的记录。这是二者最大的区别。
like、%、_
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D4UHjpRY-1604544945453)(C:\Users\itzouch\AppData\Roaming\Typora\typora-user-images\image-20200416095602891.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Max9OWkF-1604544945454)(C:\Users\itzouch\AppData\Roaming\Typora\typora-user-images\image-20200416095630287.png)]
%可以放在任意位置如:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N6XCclvi-1604544945454)(C:\Users\itzouch\AppData\Roaming\Typora\typora-user-images\image-20200416095746750.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cR98H2W1-1604544945455)(C:\Users\itzouch\AppData\Roaming\Typora\typora-user-images\image-20200416095755571.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iV0diZVT-1604544945456)(C:\Users\itzouch\AppData\Roaming\Typora\typora-user-images\image-20200416095856835.png)]
and、or(and优先级高于or)
后续补充。
distinct(结果去重)
select distinct 字段名 from 表名;
内连接 inner join on
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6ec5dcDp-1604544945457)(C:\Users\itzouch\AppData\Roaming\Typora\typora-user-images\image-20200417094908852.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yIVmF75p-1604544945458)(C:\Users\itzouch\AppData\Roaming\Typora\typora-user-images\image-20200417094957610.png)]
左连接left join on
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-deJWlJk8-1604544945459)(C:\Users\itzouch\AppData\Roaming\Typora\typora-user-images\image-20200417095047702.png)]
右连接right join on
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gM1MWVhx-1604544945460)(C:\Users\itzouch\AppData\Roaming\Typora\typora-user-images\image-20200417095122091.png)]
子查询
什么是子查询
条件:一条SQL语句的查询结果做为另一条查询语句的条件或查询结果
嵌套:多条SQL语句嵌套使用,内部的SQL查询语句称为子查询。
子查询的三种情况
子查询是单行单列的情况:结果集是一个值,父查询使用:=、 <、 > 等运算符
– 查询工资最高的员工是谁?
select * from employee where salary=(select max(salary) from employee);
子查询是多行单列的情况:结果集类似于一个数组,父查询使用:in 运算符
– 查询工资最高的员工是谁?
select * from employee where salary=(select max(salary) from employee);
子查询是多行多列的情况:结果集类似于一张虚拟表,不能用于where条件,用于select子句中做为子表
– 1) 查询出2011年以后入职的员工信息
– 2) 查询所有的部门信息,与上面的虚拟表中的信息比对,找出所有部门ID相等的员工。
select * from dept d, (select * from employee where join_date > ‘2011-1-1’) e where e.dept_id = d.id;
– 使用表连接:
select d., e. from dept d inner join employee e on d.id = e.dept_id where e.join_date > ‘2011-1-1’
索引
索引:帮助MySQL数据库高效获取数据的排好序的数据结构。
索引数据结构:
- 二叉树:节点和数据连接到一起。弊端是数据是有序的话会变为链表。
- 红黑树:不会转为链表,有自平衡,但是层数太多也就是树高会影响性能。
- Hash表
- B-Tree
简单来说,没有索引查询数据,需要在表中从头到尾查询一遍。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M5s1kKkI-1604544945461)(C:\Users\itzouch\AppData\Roaming\Typora\typora-user-images\image-20200417101538067.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ryaAykYu-1604544945461)(C:\Users\itzouch\AppData\Roaming\Typora\typora-user-images\image-20200417101545798.png)]
函数
字符串连接函数concat
select concat(字段名,字段名,字段名~~~)as 别名 from 表名
字符串连接函数concat_wa()
select concat(‘字段分割符’,字段名,字段名,字段名~~~)as 别名 from 表名
脏读、幻读、不可重复读
脏读(Drity Read):
某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。
不可重复读(Non-repeatable read):
在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。
幻读(Phantom Read):
在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。
事务隔离级别
为了达到事务的四大特性,数据库定义了4种不同的事务隔离级别,由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。
SQL 标准定义了四个隔离级别:
READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
隔离级别与锁的关系
在Read Uncommitted级别下,读取数据不需要加共享锁,这样就不会跟被修改的数据上的排他锁冲突
在Read Committed级别下,读操作需要加共享锁,但是在语句执行完以后释放共享锁;
在Repeatable Read级别下,读操作需要加共享锁,但是在事务提交之前并不释放共享锁,也就是必须等待事务执行完毕以后才释放共享锁。
SERIALIZABLE 是限制性最强的隔离级别,因为该级别锁定整个范围的键,并一直持有锁,直到事务完成。
锁
对MySQL的锁了解吗**
当数据库有并发事务的时候,可能会产生数据的不一致,这时候需要一些机制来保证访问的次序,锁机制就是这样的一个机制。
就像酒店的房间,如果大家随意进出,就会出现多人抢夺同一个房间的情况,而在房间上装上锁,申请到钥匙的人才可以入住并且将房间锁起来,其他人只有等他使用完毕才可以再次使用。
隔离级别与锁的关系
在Read Uncommitted级别下,读取数据不需要加共享锁,这样就不会跟被修改的数据上的排他锁冲突
在Read Committed级别下,读操作需要加共享锁,但是在语句执行完以后释放共享锁;
在Repeatable Read级别下,读操作需要加共享锁,但是在事务提交之前并不释放共享锁,也就是必须等待事务执行完毕以后才释放共享锁。
SERIALIZABLE 是限制性最强的隔离级别,因为该级别锁定整个范围的键,并一直持有锁,直到事务完成。
按照锁的粒度分数据库锁有哪些?锁机制与InnoDB锁算法**
在关系型数据库中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎)、表级锁(MYISAM引擎)和页级锁(BDB引擎 )。
MyISAM和InnoDB存储引擎使用的锁:
MyISAM采用表级锁(table-level locking)。
InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁
行级锁,表级锁和页级锁对比
行级锁 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁 和 排他锁。
特点:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
表级锁 表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。
特点:开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。
页级锁 页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。
特点:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
从锁的类别上分MySQL都有哪些锁呢?像上面那样子进行锁定岂不是有点阻碍并发效率了
从锁的类别上来讲,有共享锁和排他锁。
共享锁: 又叫做读锁。 当用户要进行数据的读取时,对数据加上共享锁。共享锁可以同时加上多个。
排他锁: 又叫做写锁。 当用户要进行数据的写入时,对数据加上排他锁。排他锁只可以加一个,他和其他的排他锁,共享锁都相斥。
用上面的例子来说就是用户的行为有两种,一种是来看房,多个用户一起看房是可以接受的。 一种是真正的入住一晚,在这期间,无论是想入住的还是想看房的都不可以。
锁的粒度取决于具体的存储引擎,InnoDB实现了行级锁,页级锁,表级锁。
他们的加锁开销从大到小,并发能力也是从大到小。
数据库的乐观锁和悲观锁是什么?怎么实现的?
数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。在查询完数据的时候就把事务锁起来,直到提交事务。实现方式:使用数据库中的锁机制
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。在修改数据的时候把事务锁起来,通过version的方式来进行锁定。实现方式:乐一般会使用版本号机制或CAS算法实现。
两种锁的使用场景
从上面对两种锁的介绍,我们知道两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下(多读场景),即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。
但如果是多写的情况,一般会经常产生冲突,这就会导致上层应用会不断的进行retry,这样反倒是降低了性能,所以一般多写的场景下用悲观锁就比较合适。
存储过程
存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需要创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。
优点
1)存储过程是预编译过的,执行效率高。
2)存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯。
3)安全性高,执行存储过程需要有一定权限的用户。
4)存储过程可以重复使用,减少数据库开发人员的工作量。
缺点
1)调试麻烦,但是用 PL/SQL Developer 调试很方便!弥补这个缺点。
2)移植问题,数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。
3)重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。
4)如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的,维护起来更麻烦。
触发器
什么是触发器?触发器的使用场景有哪些?
触发器是用户定义在关系表上的一类由事件驱动的特殊的存储过程。触发器是指一段代码,当触发某个事件时,自动执行这些代码。
使用场景
可以通过数据库中的相关表实现级联更改。
实时监控某张表中的某个字段的更改而需要做出相应的处理。
例如可以生成某些业务的编号。
注意不要滥用,否则会造成数据库及应用程序的维护困难。
大家需要牢记以上基础知识点,重点是理解数据类型CHAR和VARCHAR的差异,表存储引擎InnoDB和MyISAM的区别。
MySQL中都有哪些触发器?
在MySQL数据库中有如下六种触发器:
- Before Insert
- After Insert
- Before Update
- After Update
- Before Delete
- After Delete
笔记