【原创】 Mysql数据库入门、第二部分
16 05 2022

Mysql数据库基础知识


九、MYSQL约束

            9.1 约束基本介绍

            约束用于确保数据库数据满足特定的商业规则,在mysql中,约束包括not null(非空)、unique(唯一)、primary key(主键)、foreign key(外键)、check(检查)五种

            9.1.1、主键使用方式:字段名 类型 primary key

            primary key主键基本作用:用于唯一的表示表行的数据,当定义主键约束后,该列不能重复

            应用实例一:演示主键的使用

            第一步:创建表

            image.png

            第二步:添加数据

            image.png

            primary key主键使用细节讨论:

            1、primary key不能重复且值不能为空

            2、一张表最多只能有一个主键,但可以是复合主键,多个字段合起来是一个主键

            应用实例一:复合主键使用

            错误:

            image.png

            创建复合主键

            image.png

            image.png

            image.png

            3、主键的指定方式有两种

            一是直接在字段名后面指定:字段名 primary key

            二是在表定义的最后写primary key(列名,列名...)

            image.png

            4、可以使用desc 表名  查看primary key的情况

            image.png

            5、在实际的开发中,每个表往往都会设计一个主键


            9.1.2、not null(非空)使用方式:字段名  类型 not null 

            开发中,如果在列上定义了not null,那么在插入数据时,必须为列提供数据           


            9.1.3、unique(唯一)使用方式:字段名  字段类型  unique

            定义了唯一约束后,该列值是不能重复的

            应用实例一:演示unique的使用

            image.png

            image.png

            unique 使用细节讨论:

            1、如果没有指定主键的情况下也没有指定not null,则unique字段可以有多个null值

            image.png

            2、如果一个列(字段)  有unique not null 约束,使用效果类似primary key 

            3、一张表中可以有多个unique 字段


            9.1.4、foreign key(外键)使用方式:foreign key (本表(从表、外键表)的字段名)references  主表名(主键名或unique字段名) 

            外键基本介绍:

            外键用于定义主表和从表之间的关系,外键约束要定义在“从表”上,主表则必须具有“主键约束” 或是“unique“约束,当定义外键约束后,“要求外键列数据必须在主表的主键列存在或是为null“

            image.png

            应用实例一:演示外键使用

            第一步:创建主表,字段有班级编号、班级名称

            image.png

            第二步:创建从表,字段有学生编号、学生名字、学生所在班级编号(外键)

            image.png

            第三步:添加测试数据

            image.png

            从表设置了外键,主表中没有id为300的数据,所以从表的这条添加的语句不会成功,insert into my_stu values(3,'螳螂',300)[添加失败],但是外键字段的值如果允许为空 (没有设置not null 非空约束),则可以添加成功

            image.png

            image.png

            外键使用细节讨论:

            1、外键指向的表的字段,要求是primary key 或者是unique

            image.png

            2、表的类型必须是innodb,这样的表才支持外键;mysql从5.5版本以后,默认引擎innodb;查看mysql版本使用命令status

            image.png

            image.png

            3、外键字段的类型要和主键字段的类型一致(长度可以不一样)

            image.png

            4、外键字段的值,必须在主键字段中出现过,或者为null [前提是外键字段允许为null]

            image.png

            5、一旦建立外键关系,数据就不能随意删除了;如果要删除,除非把设置外键的从表中的对应ID的数据都删除,才能去删除主表中的该条ID记录值

            image.png

            image.png


            9.1.5、check    使用方式:列名   类型   check  (check条件)

            基本介绍:check用于强制行数据必须满足的条件,假定在之前的员工表的sal列上定义了check约束,并要求sal列值在1000~2000之间,如果不在1000~2000之间就会提示出错; oracle 和 sql server均支持check,但是mysql5.7目前还不支持check,只做语法校验,但不会生效

            应用实例一:演示check使用

            第一步:创建表

            image.png

            第二步:添加数据 ,  一样是能添加到数据表中,所以,只做语法校验,但不会生效

            image.png


            9.2 自增长

            在某张表中,存在一个id列(整数),我们希望在添加记录的时候从1开始,自动增长。 使用方式:字段名 整型 primary key auto_increment

            image.png

            应用实例一:演示自增长的使用

            第一步:创建表

            image.png

            image.png

            第二步:添加数据

            image.png

            image.png

            自增长使用细节讨论:

            1、一般来说自增长是和peimary key配合使用的

            2、自增长也可以单独使用 [需要配合一个unique]

            3、自增长修饰的字段为整数类型的(虽然小数类型也可以,但是非常非常少这样用的)

            4、自增长默认从1开始,也可以通过命令修改,  alter table 表名 auto_increment = 10(具体整形值)  

            image.png

            5、自如果你添加数据时,给自增长字段(列)指定有值,则以指定的值为准;以下图为例,以后再添加数据的时候,id就从667开始了

            image.png

            

十、MYSQL索引

            10.1 索引基本介绍

            说起提高数据库性能,索引是最物美价廉的方案了,不用加内存,不用改程序不用调SQL,查询速度就有可能提高百倍千倍;

            

            说索引之前先说一下mysql安装在硬盘文件目录下面data文件夹中的文件

            1、表存储引擎是myisam,在data目录下面会看到3类文件:frm、myi、myd

            *.frm-表定义,是描述表结构的文件

            *.MYD-"D"数据信息文件,是表的数据文件

            *.MYI-"I"索引信息文件,是表数据文件中的任何索引的数据树

            2、表存储引擎是InnoDB,在data目录下面会看到2类文件:frm、ibd

            *.frm-表定义,是描述表结构的文件

            *.ibd-表数据和索引文件,该表的索引(B+树)的每个非叶子节点存储索引,叶子节点存储索引和索引对应的数据

            3、另外db.opt文件

            用来记录该库的默认字符集编码和字符集排序规则使用的。也就是说你创建数据库指定默认字符集和排序规则,那么后续创建的表如果没有指定字符集和排序规则,那么该新建的表将采用db.opt文件中指定的属性。

            

            10.2 索引原理:

            "没有使用索引"   的时候查询过程如下图:

            全表扫描,从id最小查询到id最大,即使查询条件是id=1,它也会全表扫描,查询速度非常慢

            image.png

            image.png


            二叉树简介:

            1、二叉树的叶子节点就是没有子节点的节点,一棵树中没有子节点(即度为0),的节点称为叶子节点,简称“叶子”,又称为终端节点。

            2、二叉树特点是每个节点最多只能有两颗子树,且有左右之分。

            3、二叉树是n个有限元素的集合,该集合或者为空,或者由一个称为根的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树,当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称为一个节点。

            建立索引的二叉树(数据结构),在1-9中间找一个位于最大编号id和最小编号id的中间的数,假设是5,比5小的摆放位置在左边,比5大的摆放位置在右边,然后继续在1和5之间中间数,假设为2,然后比2小的继续摆放在2左边,比2大的摆放在2的右边,所有数据按照此方式分析下去

            image.png

            使用了索引的时候查询过程如下图:

            第一步:where条件id为1,假设1--9二分,中间找到5,然后5右边的数据就不再查找了,如下图所示

            image.png

            第二步:where条件id为1,1比5小,再往左边再二分,假设1--5中间找到2,然后2右边的数据也不再查找,假设是一个800万的数据中查找,大概是23次左右就能找到,比顺序扫描快了不知道多少多少,如下图所示

            image.png

            二叉树五种基本形态:

            图a:空二叉树

            图b:只有一个根节点的二叉树

            图c:只有左子树

            图d:只有右子树

            图e:完全二叉树

            image.png


            B树简介:

            概念:

            叶子节点:B树的叶子节点就是没有子节点的节点,一棵树中没有子节点(即度为0),的节点称为 "叶子节点",简称“叶子”,又称为 "终端节点",叶子节点的指针为空。

            非叶子节点:B树的 "非叶子节点" 就是 "非终端节点",即“树枝”。

            基本定义:

            1、根节点至少有两个子节点

            2、叶子节点都在同一高度

            3、如果非叶子节点有n个关键字,那么它有n+1个子节点,切这n个节点递增排列

            

            image.png

            image.png


            B+树简介:

            B+树是由B树演变而来的,所以它具有B树的所有特性,另外还具有如下两点

            1、B+树的非叶子节点只有关键字,不存放数据

            2、B+树的叶子节点之间用指针相连,是一个双向链表

            image.png

            案例一:

            第一、

            image.png

            第二、

            image.png

            image.png

            第三、

            image.png

            image.png

            第四、

            image.png

            总结:

            image.png


            不得不提的时间单位换算:

            1s = 1000ms(10的3次方毫秒)= 1000000us(10的6次方微秒)= 1000000000ns(10的9次方纳秒) = 10的12次方皮秒(ps)

            假设3Ghz的CPU主频,再由CPU分配资源,诸多进程等待,获取CPU调度来处理MYSQL进程,假设分得的资源的一次处理周为10us,800万数据23次查询,耗时230us/0.23ms,再经过网络传输或者计算偏差等,建立索引后查询800万数据的耗时预估也就在几百微妙到几十毫秒之间


            不加索引速度为什么那么慢:全表扫描查询

            加索引为什么速度会很快:形成一个索引的数据结构,比如二叉树/B树/B+树

            加索引代价:

            1、创建索引后,文件变大,磁盘变大

            2、对dml(update、delete、insert)语句的效率影响,删除/修改/添加一个数据,可能导致存索引的二叉树/B+树的结构发生变化,需要重对索引进行维护,对速度有影响   在我们实际的项目中,大多数项目select的时候比update、delete、insert多得多; 假设一个UP主有一千万粉丝,一天发10篇文章,“理论情况下不使用其他扩展插件”,全都浏览了文章, insert才10次,而select就是1亿 次


            10.3、创建索引

            创建索引后,只对创建了索引的列(字段)有效

            image.png

            image.png

            10.3.1、添加索引的两种方式

            image.png

            image.png

            

            10.3.2、删除索引  drop  index  索引名 on   表名

            image.png

            image.png

            删除主键索引

            image.png

            10.3.3、修改索引,  操作是先删除再添加


            10.3.4、查询索引

            1、show index from t25

            image.png

            2、show indexes from t25  

            image.png    

            3、show keys from t25     

            image.png         

            4、desc 表名

            image.png  

            image.png

            Non_unique:值为0代表唯一索引,值为1代表非唯一索引


            image.png

            

            10.3.5、索引的类型

            1、主键索引:主键自动的为主索引(为字段添加的primary key)

            image.png

            2、唯一索引:唯一索引(unique)

            image.png

            3、普通索引:普通索引(index)

            image.png

            4、全文索引:全文索引(fulltext),适用于MyISAM表引擎。   假如我们要在一篇文章中搜索一个人的名字,希望搜索得很快,就可以在文章的字段上建一个全文索引,在实际的开发中,一般不使用mysql自带的全文索引,而考虑使用的全文索引框架 Solr和Elasticsearch

            

            10.3.6、索引总结

            哪些列上适合创建索引呢

            1、较频繁作为查询条件字段应该创建索引

            image.png

            2、唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件,下面的性别字段不适合创建索引

            image.png 

            3、更新非常频繁的字段不适合创建索引,因为会频繁的去更新索引结构

            image.png

            4、不会出现在where字句中字段不该创建索引  

            mysql索引失效的情况有哪哪些???

            ① 使用了左模糊查询,“%xxx”,或者是"%x%"的查询

            因为B+树是根据索引值进行排列的,前缀不确定的时候可能是,“小张”,"二张"之类的所有的情况,就只能通过全表扫描的方式来查询

            ② 对索引使用了函数的情况

            因为索引保存的是索引字段的原始值,而不是经过函数计算后的值,所以使用函数的时候就不会走索引了

            ③ where子句中的or

            因为 OR 的含义就是两个只要满足一个即可,因此只有一个条件列进行了索引是没有意义的,只要有条件列没有进行索引,就会进行全表扫描,因此索引的条件列也会失效

            ④ 对索引字段使用了表达式

            select * from sys_user where user_id+10 =50;

            在 where 中条件使用了条件表达式的时候,数据表中的索引就失效了,实际是因为 Mysql 需要将索引字段取出来之后再进行表达式的条件判断,因而进行了全表扫描,导致索引失效


            如何避免mysql索引失效???

            ① 全部采取值匹配,对查询语句中的列都指定索引

            ② 如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始,并且不跳过索引中的列。

            ③ 避免在索引上进行运算,索引将失效

            ④ 避免字符串查询不加单引号,索引失效

            ⑤ 避免select * 的写法

            ⑥ 避免以“%”开头的模糊查询,“%”开头的模糊查询将失效,尽量采用尾部模糊查询

            ⑦ in会走索引,not in 索引将失效

            ⑧ 在合适的业务场景使用or查询



十一、MYSQL事务

            11.1 事务基本介绍

            事务用于保证数据的一致性,它由相关的dml语句组成,该组dml语句要么全部成功,要么全部失败。如转账就需要用事务来处理,用以保证数据的一致性。

            image.pngimage.pngimage.png

            11.2 事务和锁

            当执行事务操作时(dml语句),mysql会在表上加锁,防止其他用户改表的数据,这对用户来说时非常重要的。

            11.3 mysql数据库控制台事务的几个重要操作

            1、start  transaction           --开始一个事务

            2、savepoint  保存点名       --设置保存点

            3、rollback to 保存点名       --回退事务

            4、rollback                          --回退全部事务

            5、commit                          --提交事物,所有的操作生效,不能退回

            

            回退事务:在介绍事务前,先介绍一下保存点(savepoint),保存点时事务中的点,用于取消部分事务,当结束事务时,会自动删除该事务定义的所有保存点;当执行回退事务时,通过指定保存点可以回到指定的点

            提交事务:使用commit语句可以提交事务,当执行了commit语句后,会确认事务的变化、结束事务、删除保存点、释放锁、数据生效。当使用commit语句结束事务后,其他会话将看到事务变化后的新数据。


            image.png


            案例演示一、

            开启事务:

            image.png

            设置保存点:

            image.png

            执行dml操作:

            image.png

            再设置一个保存点:

            image.png

            回退到保存点i:

            image.png

            回退到保存点a: 中间的其他保存点会删除!!!

            直接回退到事务开始的状态:

            image.png

            提交事务,所有的操作生效,不能再回退,保存点删除,commit以后没有后悔药...


            11.4 mysql事务细节讨论

            1、如果不开启事务,默认情况下,dml操作时自动提交的,不能回滚

            2、如果开启一个事务,你没有创建保存点,你可以执行rollback,默认就是回到事务开始的状态

            3、在事务还没有提交的时候,你可以在事务中创建多个保存点 ,比如:savepoint aaa  ;执行dml语句;  savepoint bbb;

            4、可以在事务还没提交前,选择回到哪个保存点

            5、使用mysql事物机制需要innodb存储引擎才可以使用,myisam不行。

            6、开始一个事物可以使用start transation,也可以使用set autocommit = off。

            

            11.5 mysql事务隔离级别

            概念:mysql隔离级别,定义了事务与事务之间的隔离程度。 

            image.png

            基本介绍:

            1、多个连接开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性。

            2、如果不考虑隔离性,可能会引发如下问题:

            脏读:一个事务读取另一个事务尚未提交的改变时(update、insert、delete),产生脏读

            不可重复读:同一查询在同一事务中多次进行,由于其他提交事务所做的“修改”或“删除”,每次返回不同的结果集,此时发生不可重复读

            image.png

            幻读:同一查询在同一事务中多次进行,由于其他提交事务所做的“插入”操作,每次返回不同的结果集,此时发生幻读

            

            应用实例一、演示mysql事务隔离级别,read uncommitted(读未提交)     结果出现脏读、不可重复读、幻读

            第一步、查询当前默认隔离级别:select @@tx_isolation,  默认可重复读

            image.png

            第二步、把其中一个控制台的隔离级别设置为read  uncommitted(读未提交)

            语法:set session transaction isolation level  read  uncommitted

            image.png

            image.png

            第三步、脏读

            控制台1

            image.png

            控制台2

            image.png

            第四步、不可重复读

            控制台1修改了id=1的数据余额为800

            image.png

            控制台2读取到了另一事务提交的改变(修改、删除); 事务1的提交影响了事务2对表读的操作

            image.png

            第五步、幻读

            控制台1提交了新添加的数据

            image.png

            控制台2读取到了另一事务提交的改变(插入) ;事务1的提交影响了事务2对表读的操作

            image.png


            应用实例二、演示mysql事务隔离级别,read committed(读已提交)     结果出现不可重复读、幻读,不会出现脏读

            第一步、控制台1开启事务

            image.png

            第二步、控制台2修改事务隔离级别为read  committed(读已提交),并且开启事务

            语法:set session transaction isolation level  read  committed

            image.png

            image.png

            第三步、脏读

            控制台1添加了数据,并读取数据如下

            image.png

            控制台2读取数据,并没有读取到刚才控制台1事务添加的数据

            image.png

            第四步、不可重复读

            控制台1修改了数据,并且提交

            image.png

            控制台2读取数据,又读取到了控制台1事务做的修改,出现不可重复读

            image.png

            第五步、幻读

            控制台1添加了id为5的数据,并提交

            image.png

            控制台2查询到了控制台1事务的提交

            image.png


            应用实例三、演示mysql事务隔离级别,repeatable read(可重复读)  不会出现脏读、不可重复读、幻读

            第一步、控制台1开启事务

            image.png

            第二步、控制台2修改事务隔离级别为repeatable read(可重复读),并且开启事务

            语法:set session transaction isolation level  repeatable read

            image.png

            第三步、脏读、不可重复读、幻读   

            控制台1添加、修改了数据,并提交数据

            image.png

            image.png

            image.png

            控制台2读取数据,依然没有变化

            image.png


            应用实例四、演示mysql事务隔离级别,Serializable(可串行化)不会出现脏读、不可重复读、幻读

            第一步、控制台1开启事务

            image.png

            第二步、控制台2修改事务隔离级别为Serializable可串行化),并且开启事务

            语法:set session transaction isolation level  Serializable

            image.png

            第三步、控制台1添加一个语句,修改一个语句

            image.png

            控制台1并没有提交事务,控制台2查询,卡在那里等待,超时

            image.png

            image.png

            控制台1事务提交

            image.png

            控制台2查询

            image.png

            

            11.6 mysql设置隔离

            1、查看当前会话隔离级别  select @@tx_isolation

            image.png

            2、查看系统当前隔离级别   select @@global.tx_isolation

            image.png

            3、设置当前会话隔离级别   set session transaction isolation level  (隔离级别)

            image.png

            4、设置系统当前隔离级别   set session transaction isolation level  (隔离级别)

            image.png

            5、mysql默认的事务隔离级别是repeatable read,一般情况下没有特殊要求,没有必要修改(因为该隔离级别满足绝大部分项目需求)

            6、全局修改,设置mysql隔离级别,修改my.ini配置文件

            image.png

            

            11.7 mysql事务ACID

            1、原子性:原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生

            2、一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态

            3、隔离性:事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据干扰,多个并发事务之间要相互隔离

            4、持久性:持久性指一个事务一旦被提交,它对数据库中的数据改变是永久性的,接下来即使数据库发生故障也不应该对其有任何影响


            11.8 mysql表类型和存储引擎

            基本介绍:

            1、mysql的表类型由存储引擎决定,主要包括myisam、innodb、memory等...

            2、mysql数据表主要支持6种类型,分别是:CVS、Memory、ARCHIVE、MRG MYISAM、MYISAM、InnoDB

            3、这6种又分为两类,一类是“事务安全型”,比如:InnoDB;其余都属于第二类,称为“事务非安全型”

            

            查看所有的存储引擎:show engines

            image.png

            主要的存储引擎及其特点

            image.png

            image.png

            几种常用表类型的区别:

            innodb存储引擎:支持事务、支持外键、支持行级锁、写入速度慢一些

            myisam存储引擎:不支持事务和外键、写入速度快、支持表级锁

            memory存储引擎:数据存储在内存中、执行速度很快(没有磁盘IO读写)、默认支持索引(哈希表)、重启mysql服务或者操作系统以后,数据消失,但是表结构还在

            image.png

            image.png

            修改表存储引擎:alter table 表明 engine= innodb/myisam


            11.9 mysql视图

            image.png

            视图基本概念:

            1、视图是一个虚拟表,其内容由查询定义,同真实的表一样,视图包含列,其数据来自对应的真实表(基表)

            2、视图和基表关系示意图

            image.png

            image.png

            对视图的总结:

            image.png

            视图的基本使用:

            1、创建视图:create view 视图名 as select语句

            image.png

            image.png

            2、查看视图结构:desc 视图名

            image.png

            3、查询视图数据:select 字段  from  视图名

            image.png

            3、alter view 视图名 as select语句    修改一个视图,其实相当于重新定义一个视图了

            image.png

            image.png

            4、查看创建视图的指令: show create view 视图名

            image.png

            5、drop view 视图1   视图2

            image.png

            image.png

            

            视图细节讨论:

            1、创建视图后,到数据库去看,对应视图只有一个视图结构文件

            2、视图的数据变化会影响基表,基表的数据变化也会影响到视图(insert、update、delete)


            视图的最佳实践:

            image.png

            image.png


十二、MYSQL管理

            12.1 mysql用户管理

            当我们在项目开发时,可以根据不同的开发人员,赋给他相应的mysql操作权限!!!

            mysql中的用户都存在系统数据库的mysql中的user表

            image.png

            其中user表重要字段说明:

            1、host字段:允许登录的“位置”,localhost表示该用户只允许本机登录,也可以指定IP登录

            2、user字段:用户名

            3、authentication_string字段:密码,是通过mysql的password()函数加密之后的密码


            创建用户

            create  user  '用户名' @ '允许登录的位置'  identified  by '密码'      创建用户的同时指定密码

            image.png

            image.png

            密码是password()函数加密的

            image.png

            删除用户

            drop user '用户名'  @ ‘允许登录的位置’

            image.png

            其他用户登录

            image.png

            image.png

            image.png

            

            image.png

            普通用户登录修改自己的密码:set password = password('112235')

            image.png

            image.png

            普通用户修改其他用户的密码:set password  for '用户'  @  '允许登录位置' = password('密码')

            这里,访问mysql数据库权限不够,被拒绝

            image.png 

            使用root用户来修改其他用户密码

            image.png


            12.2 mysql权限管理

            权限列表

            image.png

            1、使用root账户给其他账户赋权限

            如果被赋值权限的用户存在,可选里面设置了密码则表示修改密码,如果不存在就是创建用户并赋权限

            image.png

            2、回收用户授权

            revoke  权限列表  on  库.对象名  from  '用户名'@'登录位置';

            3、权限刷新指令

            FLUSH  PRIVILEGES;


            应用实例一、用户管理练习

            image.png

            第一步、使用root用户创建用户

            image.png

            第二步、使用root用户创建testdb库和news表

            image.png

            第三步、使用root用户给普通用户分配权限

            image.png

            第四步、测试用户权限

            image.png

            第五步、使用root用户修改密码为abc

            image.png

            第六步、重新登录

            image.png

            第七步、回收权限

            image.png

            已经没有了删除权限,删除失败

            image.png


            mysql管理细节说明:

            1、在创建用户的时候,如果不指定Host,则为%,%表示所有IP都有链接权限

            image.png

            image.png

            2、也可以指定IP创建:  create   user   '用户名'@'IP' 

            image.png

            image.png

            3、在删除用户的时候,如果host不是%,需要明确指定  '用户'@'host值'

            image.png

            host不是%的情况

            image.png

            image.png

            image.png


【原创】 Mysql数据库入门、第一部分
27 03 2022

Mysql数据库基础知识

一、Mysql5.7.19解压版安装

            Mysql基本介绍:

            Mysql是一个关系型数据库管理系统,由瑞典MYSQL AB公司开发,属于Oracle旗下产品。

            Mysql是一个单进程多线程的数据库,在innodb中大概3种线程为:1、主线程Master Thread;2、IO Thread线程,用于异步处理写请求;3、purge Thread线程,用于删除undo日志。


    网址:https://dev.mysql.com/

    下载地址https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.19-winx64.zip

            特别说明:

            image.png

            image.png

            安装步骤:

            1.下载得到zip文件

            2.解压的路径不要带有中文和空格

            3.解压到这里

            image.png

            4.添加环境变量,其目的是:可以在dos下的任意目录操作mysql相关指令

            WIN + E -> 右键此电脑 -> 属性 -> 高级系统设置 -> 高级选项卡 -> 环境变量, 在path环境变量中增加mysql安装目录,到那个bin目录下面,如:D:\mysql-5.7.19-winx64\bin\

            image.png

            5.在D:\mysql-5.7.19-winx64\目录下创建my.ini文件,需要我们自己创建

            [client]

            port=3306

            default-character-set=utf8

            

            [mysqld]

            #设置为自己的mysql安装目录

            basedir=D:\mysql-5.7.19-winx64\

            #设置为mysql的数据目录

            datadir=D:\mysql-5.7.19-winx64\data\

            port=3306

            character_set_server=utf8

            #跳过安全检查,注释以后需要输入正确的用户名和密码才能登录

            #skip-grant-tables

            6.使用管理员身份打开cmd,并切换到D:\mysql-5.7.19-winx64\bin目录下执行 mysqld -install (mysqld后面有个空格)

            image.png

            7.初始化数据库  mysqld --initialize-insecure --user=mysql    ,如果执行成功,生成data目录

            image.png

            8.启动mysql服务net start mysql;停止mysql服务net stop mysql;

            image.png

            image.png

            9.进入mysql终端mysql -u root -p [安装完成以后,root账户,密码为空]

            10.修改root用户密码

            use mysql;

            update user set authentication_string=password('你要设置的密码') where user='root' and Host='localhost';

            或者下面修改密码语句也可以:

            set password for root@localhost=password('你的密码');

            flush  privileges;   //刷新权限

            

二、数据库

            1、连接到mysql服务的命令:mysql -h localhost -P 3306 -u root -p123123123   

            注意:-P端口这个P是大写;-p密码这里没有空格

            image.png

            2、mysql三层结构

            image.png

            image.png

            3、sql语句分类

            image.png

            4、创建数据库数据表操作

            4.1、创建数据库

            create database 数据库名;

            4.2、创建数据库,同时设置字符集

            create database 数据库名 character set utf8;

            image.png

            4.3、显示数据库语句

            show databases;

            image.png

            4.4、显示数据库创建语句,下图中的反引号 `` 是用来规避关键字的

            show create databases db_name;

            image.png

            4.5、数据库删除语句

            drop database if exists ab_name; (谨慎使用,生产环境一定不要轻易操作,仔细确认再的确要删除才执行)

            image.png

            4.6、备份数据库,在dos命令行操作

            mysqldump -u 用户名 -p 密码 -B 数据库1  数据库2  数据库n > 文件位置:\文件名.sql

            image.png 

            4.7、恢复数据库,需要登录进mysql再执行操作

            source 文件夹:\beifen.sql

            image.png

            4.8、备份数据库的表,

            mysqldump -u 用户名 -p 密码 数据库 表1  表2  表n > 文件位置:\文件名.sql

            image.png


三、表

            1、创建mysql数据表,语法如图所示:

            image.png

            image.png


四、Mysql常用数据类型(列类型/字段类型)

            1、mysql列类型-即mysql数据类型(数据类型选择遵守保小不保大)

            image.png

            1.1、数值类型

            image.png

            image.png

            1.2、文本类型(字符串类型)

            image.png

            1.3、二进制数据类型

            image.png

            1.4、时间日期类型

            image.png

            image.png


五、列类型

            5.1、mysql列类型之bit

            image.png

            image.png

            image.png

            image.png

            image.png

            5.2、mysql列类型之数值型

            5.2.1小数类型

            image.png

            image.png

                        

            image.png

            

            5.3、mysql列类型之字符串类型

            5.3.1char(这里是字符数,char(10),即使只存5个汉字,但是也占用10个字符空间 )、varchar(这里面是字符数,varchar(10)可以存储10个中文汉字,utf8编码占用内存空间31-33个字节)(utf8编码varchar最大21844个字符,gbk编码varchar最大32766个字符

            image.png

            image.png

            

            字符串使用细节1:占用多大字节空间根据表的编码决定(utf8中文3个字节,英文一个字节;gbk中文2个字节)

            image.png

            image.png

            字符串使用细节2:

            image.png

            字符串使用细节3:

            image.png

            为什么char比varchar快呢?

            char类型在存放数据的时候,中间是没有间隔的,数据本身是有空格的,但是数据段之间是没有间隔的,这是因为我们在创建列的时候已经告诉MySQL列的长度了,MySQL在查询数据的时候,只需要按部就班寻找就行了,不需要在中途计算这个数据段的长度。

但是varchar类型的存放就不同了,它是动态分配存储空间的,在每个数据段开头,都要有一段空间来(1~2个字节)存放数据段的长度信息,在数据段的结尾也还有一段空间(1个字节)标记此字段的节数。MySQL在读取一个数据段的时候,首先要读开头,比如读到了3,说明数据段的长度是3,之后就不多不少,只读3个字节,也只分配3个字节的存储空间。所以MySQL在遍历数据的时候,磁针要比char类型的列,多读很多次磁盘来获取字段的真实长度,这就是为什么varchar比char查询效率低的原因了。

            image.png

            字符串使用细节4:

            image.png

            image.png


            5.4、mysql列类型之日期类型

            image.png

            image.png


六、表操作

            6.1、修改表基本介绍

            image.png

            添加字段:

            image.png

            查看表结构:

            image.png

            修改表结构(字段类型):

            image.png

            image.png

            注意:int(10),这个10表示数据显示的长度为10;  int(2)并不表示数据大小的最大值为99,其大小和int表示的最大值一样,只是表示查询时显示的结果长度为2位; 而char(10)  varchar(10), 这里的10表示不管什么字符集,最多只能存10个字符!!!

            删除表结构(字段):

            image.png

            修改表名:

            image.png

            修改表字符集:

            image.png

            查看建表语句:

            image.png

            image.png

            修改字段名称:

            image.png


七、CURD  C[create] U[update] R[retrieve 检索、找、取] D[delete]

            7.1、添加语句

            image.png

            image.png

            image.png

            注意细节:

            image.png


            7.2、更新语句 

            image.png

            image.png

            image.png

            image.png

            注意细节:

            image.png


            7.3、删除语句 (注意:删除的时候一定要带条件,不然会导致整个表的数据全部被删除 !!!)

            image.png

            image.png

            注意了:

            image.png

            image.png


            7.4、select查询语句  (SQL中的重点、难点)

            image.png


            7.4.1 指定字段查询

            image.png


            7.4.2 指定字段去重查询

            image.png

            image.png


            7.4.3 使用表达式对查询的列进行运算

            image.png

            image.png

            image.png            

            

            7.4.4 在select语句中使用as语句

            image.png

            image.png

            7.4.5 在where字句中经常使用的运算符

            image.png

            >  <   like  and 

            image.png

            image.png

            查询姓氏姓金的

            image.png

            image.png

            (between  and )   是一个闭区间 

            image.png

            or

            image.png

            in

            image.png

            order by    order by语句应该位于select语句的结尾

            image.png

            image.png

            image.png

            image.png


            7.5、合计/统计函数

            7.5.1、count函数

            image.png

            image.png

            count(字段) 返回非空的字段满足条件的数量!!!

            image.png

            image.png

            image.png

            image.png

            7.5.2、sum函数

            image.png

            image.png

            image.png

            统计一个班级语文成绩的平均分

            image.png

            注意:sum函数仅对数值起作用,对其他类型值求sum没有意义;  还有多列求和的时候“,”不能少!!!

            7.5.3、avg函数

            image.png

            image.png

            7.5.4、max/min函数

            image.png

            image.png


            7.6、分组统计

            image.png

            按照部门分组来查询

            image.png

            显示每个部门的每种岗位的平均工资和最低工资

            image.png


            image.png

            显示平均工资低于2000的部门编号和它的平均工资

            image.png

            下面这个使用1次avg函数的查询方式效率高一点

            image.png

            

            7.7、字符串函数

            image.png

            7.7.1 返回字串字符集

            image.png

            7.7.2 连接字串,把多个列拼接成一列(把字串粘在一起)

            image.png

            7.7.3 INSTR(string,substring)  返回substring在string中出现的位置,从1开始,没有则返回0

            image.png

            7.7.4 转成大写小写  UCASE/LCASE

            image.png

            image.png

            7.7.5 LEFT(string,length) / RIGHT(string,length)   从string的左边 / 右边起,取length个字符

            image.png

            image.png

            7.7.6 LENGTH(string)   返回string的长度(字节长度)

            image.png

            image.png

            7.7.7 REPLACE(str,search_str,replace_str) 在str中用 replace_str 替换 search_str   

            image.png

            7.7.8 STRCMP(string1,string2) 逐字符比较两字串的大小, 函数用于比较两个字符串,如果两个字符串都相同,则返回0,如果根据定义的顺序第一个参数小于第二个参数,则返回-1,而当第二个参数小于第一个参数时,则返回1。

            image.png

            7.7.9 substring(str,position,[length]) 从str的position位置开始 [从1开始计算] ,取出length个字符;如果第三个参数不给,就默认取出到末尾

            image.png

            7.7.10 ltrim(string)    rtrim(string)    trim(string)   去掉string的左边、右边、两端空格

            image.png

            以首字母小写的方式显示所有员工emp表的姓名

            image.png

            image.png

            

            7.8、数学函数

            image.png

            7.8.1 abs()函数

            image.png

            7.8.2 bin()函数, 十进制转二进制

            image.png

            7.8.3 ceiling(num)函数,向上取整,得到比num大的最小整数

            image.png

            7.8.4 conv(num,from_base,to_base)函数, 进制转换函数

            image.png

            7.8.5 floor(num)函数,向下取整,得到比num小的最大整数

            image.png

            7.8.6 format(num,decimal_places)函数,对num 保留 decimal_places位小数(四舍五入)

            image.png

            7.8.7 hex(num)函数,转成十六进制

            image.png

            7.8.8 least(num1,num2, [...])函数,求最小值

            image.png

            7.8.9 mod(numerator,denominator)函数,求余

            image.png

            7.8.10 rand([seed] rand [seed])函数,返回随机数,其范围为0 <= v <= 1.0

            image.png

            注意:使用rand(),每次返回不同的随机数,范围0 <= v <= 1.0;使用rand(seed)返回随机数,范围0 <= v <= 1.0,如果seed不变,该随机数也不会变化


            7.9、时间日期相关函数

            image.png

            7.9.1 current_date()函数,返回当前日期; 查询的时候current_date 可以带小括号也可以不带

            image.png

            7.9.2 current_time()函数,返回当前时间

            image.png

            7.9.3 current_timestamp()函数,返回当前时间戳

            image.png

            image.png

            7.9.4 now()函数,返回当前日期时间

            image.png

            image.png

            应用实例1:显示所有新闻信息,发布日期只显示日期,不显示时间

            image.png

            7.9.5 date_add(date,interval  d_value   d_type)函数在date上加上时间或者日期

            应用实例2:查询在10分钟内、一天内、一个月内、一年内添加的数据      

            image.png

            image.png

            7.9.6 date_sub(date,interval  d_value   d_type)函数, 在date上减去时间或者日期

            image.png

            image.png

            7.9.7 datediff(date1,date2)函数,返回两个日期差(结果是天)

            image.png


            image.png

            7.9.8 year|month|date(datetime)     年月日

            image.png

            7.9.9 unix_timestamp()函数, 返回自1970-01-01 00:00:00  到当前时间的秒数

            image.png

            7.9.9 FROM_UNIXTIME()函数,   把一个unix_timestamp秒数[时间戳]  转成指定格式的日期

            image.png

            

            7.10、加密和系统函数

            image.png

            7.10.1  user()函数,查询当前是哪个用户

            image.png

            7.10.2  database()函数,查询当前使用的数据库名

            image.png

            7.10.3  md5()函数,为字符串算出一个md5  32位的字符串,常用于用户密码加密

            image.png

            7.10.4  password()函数,加密函数,mysql数据库的用户密码就是用password函数加密的

            image.png

            image.png

            image.png


            7.11、流程控制函数

            image.png

            image.png

            7.11.1 if(expr1,expr2,expr3)函数,如果 expr1为true则返回expr2,否则返回expr3

            image.png

            7.11.2 ifnull(expr1,expr2)函数,如果expr1不为空,则返回expr1,否则返回expr2

            image.png

             7.11.3 判断是否为null,要使用is null, 判断不为空,使用is not null

            image.png

            7.11.4  SELECT CASE  WHEN expr1  THEN  expr2  WHEN expr3   THEN  expr4  ELSE  expr5  END ;  【多重分支】 如果expr1为 true 则返回expr2,如果expr3为 true 则返回expr4, 否则返回expr5

            image.png


八、MYSQL查询加强

            8.1 mysql多表查询

            image.png

            8.2  在mysql中,日期类型可以直接比较

            image.png

            8.3  like模糊查询,   %:表示0到多个任意字符    _:表示单个任意字符

             显示首字母为N的员工的工资和姓名  

            image.png     

             显示第三个字符为小写n的员工工资和姓名

            image.png    

             显示没有上级的职员信息 就是判断mgr字段为null,  判断null   使用 is null

            image.png    

             根据工资升序倒序查询

            image.png

            image.png

             根据工资倒序排序,部门升序排序

            image.png



            image.png

            image.png

            8.4  limit分页查询

            image.png

            image.png


            8.5  使用分组函数和分组子句 group by

            应用实例一:显示每种岗位的雇员总数、平均工资

            image.png

            应用实例二:显示雇员总数,以及获得奖金的雇员数

            count(字段),如果字段的值为null,则count()不会统计

            image.png

            image.png

            应用实例三:显示雇员总数,以及没有获得奖金的雇员数

            image.png

            image.png

            应用实例四:显示管理者的总人数

            image.png

            应用实例五:显示最大薪资差

            image.png

            应用实例六:统计各个部门的平均工资,并且大于1000,按照平均工资从高到低排序,取出前两行记录

            image.png

            

            注意::语句顺序!!!

            image.png


            8.6  多表联合查询

            应用实例一:多表查询,显示雇员名字、雇员工资、及所在部门的名字

            image.png

            image.png

            当多表查询不加条件的时候:

            image.png

            image.png

            分析:从第一张表中取出一行和第二张表进行组合,返回结果,结果包含两张表的所有列,上面两表查询不加条件的时候,结果就有32行,这样的多表查询默认处理返回的结果,称为笛卡尔集

            image.png

            image.png

            应用实例二:多表查询,显示雇员名字、雇员工资、部门编号、及所在部门的名字

            注意:当我们需要指定某个表的列时,需要使用  表名.列名的方式

            image.png

            小技巧:多表查询的条件不能少于表的张数-1,如:3表查询,条件至少要两个,才不会出现笛卡尔集

            应用实例三:多表查询,显示雇员名字、雇员工资、部门编号为10的部门、及所在部门的名字

            image.png


            8.7  多表联合查询-自连接

            什么是自连接:自连接指在同一张表的链接查询(将同一张表看做两张表)

            自连接的特点:1、把同一张表当做两张表来说使用    2、需要给表取别名   表名  表别名   3、列名不明确,可以指定列的别名   列名  as  列的别名

            image.png

            image.png

            image.png


            过程分析:同一张表某条记录的mgr = 同一张表某条记录的empno

            image.png

            image.png

            第一步:

            image.png

            第二步:

            image.png

            第三步:

            image.png

            

            8.8  子查询

            什么是子查询:嵌入在sql语句中的select语句,也叫嵌套查询

            单行子查询:指只返回一行数据的子查询语句

            多行子查询:指只返回多行数据的子查询语句,使用关键字 IN

            应用实例一:显示与smith同一部门的员工

            第一步:查询部门编号

            image.png

            第二步:把上面的select语句当做子查询来使用

            image.png

            应用实例二:查询和部门10的工作相同的雇员的名字、岗位、工资、部门号,但是不包含10号部门自己的雇员

            第一步:查询10号部门的工作岗位有哪些

            image.png

            像以下情况需要过滤

            image.png

            第二步:把上面查询的结果当做子查询

            image.png


            8.9  子查询当做临时表

            image.png

            image.png

            image.png

            

            image.png

            image.png

            image.png

            

            image.png

            image.png

            image.png


            8.10  在多行子查询中使用all操作符和any操作符

            应用实例一:显示工资比部门30的所有员工的工资高的员工姓名、工资和部门号

            image.png

            image.png

            应用实例二:显示工资比部门30的其中一个员工的工资高的员工姓名、工资和部门号

            image.png

            8.11  多列子查询

            多列子查询是指查询返回多个列数据的子查询语句

            应用实例一:查询与smith的部门和岗位完全相同的所有雇员(不包含smith本人)

            第一步:得到smith的部门和岗位

            image.png

            第二步:把上面的查询当做子查询来使用,并且使用多列子查询的语法进行匹配

            image.png

            image.png

            应用实例二:

            image.png

            第一步:先得到每个部门的平均工资和部门号

            image.png

            第二步:把上面的结果当做子查询,和emp进行多表查询

            image.png

            应用实例三:查询每个部门工资最高的人

            image.png

            应用实例四:查询每个部门的信息(包括:部门号、编号、地址)和人员数量

            第一步:部门号、编号、地址在dept表

            

            第二步:各个部门人员数量 -> 构建一个临时表

            image.png

            第三步:组合查询

            image.png

            image.png

            

            8.12  自我复制数据(蠕虫复制)

            有时,为了对某个sql语句进行效率测试,我们需要海量数据时,可以使用此方法为表创建海量数据

            应用实例一:把emp表得记录复制到my_tab1中

            第一步:从其他表复制

            image.png

            第一步:自我复制

            image.png

            image.png

            image.png

            多次点击,数据成倍增长

            image.png


            应用实例二:删除掉一张表中重复记录

            第一步:先创建一张表  下面语句,把表emp的结构(列),复制到my_tab2中

            image.png

            第二步:添加数据

            image.png

            查询,已经有重复数据

            image.png

            第三步:去除重复数据

            image.png

            1、创建一张临时表

            image.png

            2、把数据去重以后添加到临时表

            image.png

            3、清除掉my_tab2的数据记录

            image.png

            4、把my_tmp表的记录复制到my_tab2

            image.png

            5、drop掉临时表my_tmp

            image.png


            8.13  合并查询

            有些在实际的应用中,为了合并多个select语句的结果,可以使用集合操作符union(联合)、union all(联合所有)

            应用实例一:union all  该操作用于取得两个结果集的并集,当使用该操作时,不会取消重复行

            image.png

            image.png

            image.png

            应用实例二:union 该操作与union all类似,但是会自动去掉结果集中重复行

            image.png


            8.14  mysql表外连接

            image.png

            左外连接:如果左侧的表完全显示(即使左侧的表和右侧的表没有匹配的记录),我们就说是左外连接;  语法:select field1,field2,... from 表1 left join 表2  on  条件[表1就是左表,表2就是右表]

            右外连接:如果右侧的表完全显示(即使右侧的表和左侧的表没有匹配的记录),我们就说是右外连;  语法:select field1,field2,... from 表1 right join 表2  on  条件[表1还是叫左表,表2还是叫右表]

            

            应用实例一:列出部门名称和这些部门员工名字和工作,同时要求显示那些没有员工的部门

            第一步:这里只有三个部门

            image.png

            但实际上是有四个部门的

            image.png

            SQL:

            


            应用实例二:使用左外链接,显示所有人的成绩,如果没有成绩,也要显示该同学的姓名和id,成绩显示为空

            第一步:传统的外键

            image.png

            image.png

            image.png

            第二步:改成左外连接

            image.png

            应用实例三:使用右外链接,查询所有成绩,如果没有名字匹配,显示为空

            image.png

            应用实例四:查询部门的名称和这些部门员工信息(名字和工作),同时列出那些没有员工的部门

            image.png

            image.png

            总结:在开发中,绝大多数情况下还是使用前面学过的多表查询

            

                    


【原创】 Mysql锁机制
09 06 2021

Mysql锁机制

一、Mysql是一个单进程多线程架构数据库

        1、Mysql锁概述

            相对于其他数据库而言,Mysql的锁机制比较简单,最显著的特点就是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁,BDB存储引擎采用的是页面锁,但也支持表级锁,InnoDB存储引擎既支持表级锁,也支持行级锁,默认情况下采用的行级锁。

        2、Mysql这三种锁的特性大致归纳如下:开销、加锁速度、死锁、粒度、并发性能

            表级锁(锁定整个表):开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。注意:字段索引值,表级锁中字段没有索引,如果使用该字段作为操作条件会造成整张表锁定。

            行级锁(锁定某个id记录):开销大,加锁慢;会出现死锁;锁定粒度最小,发生冲突的概率最低,并发度也最高。

            页面所:开销和加锁时间介于表级锁和行级锁之间;会出现死锁;锁定粒度介于表级锁和行级锁之间,并发度一般。

            仅从锁的角度来说,表级锁更适合于查询为主,只有少量按索引条件更新数据的应用,如web应用;而行级锁更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理系统。

            从上述很难笼统的说哪种锁更好,只能就具体的应用特点来说哪种锁更适合。

            

            Mysql的表级锁有两种模式:表共享读锁(Table Read Lock) 和 表度占写锁(Table Write Lock),一般用于MyISAM存储引擎

            给表加锁:

            1. 表共享读锁,其他用户只能读取,不能添加、更改

            lock table 表名 read

            2. 表独占写锁,其他用户不能读取,也不能添加、更改

            lock table 表名 write


            Mysql的innoDB存储引擎一般使用悲观锁和乐观锁:

            悲观锁(文件锁、行锁):假设当前操作一定会发生冲突,屏蔽一切,阻塞、等待状态,适用于访问量少的场合,不能用于访问量大,并发高的场合,“速度慢,性能差”


            说明:

            1. 对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;对MyISAM表的写操作,会阻塞其他用户对同一表的读写操作,MyISAM表的读操作于写操作之间,以及写操作之间是串行的!当一个线程获得对一个表的写锁后,只有持有锁的线程可以对表进行更新操作。其他线程读、写操作都会等待,直到锁被释放为止。

            2. 一个session使用LOCK TABLE命令给表f加了读锁,这个session可以查询锁定表中记录,但更新或者访问其他表都会提示错误;同时,另一个session可以查询f表的记录,但更新就会出现锁等待。

        3、并发插入




【原创】 mysql数据库设计三范式
25 05 2021

Mysql - 数据库设计三范式

    1、第一范式

    要求任何一张表必须有主键,每一个字段原子性不可再分

    image.png

    2、第二范式

    建立在第一范式的基础上,要求所有非主键字段完全依赖主键,不要产生部分依赖

    ①

    image.png

    ② 

    image.png

    关系表设置外键,外键的关系字段分别为两张表的主键字段

    3、第三范式

    建立在第二范式的基础上,要求所有非主键字段直接依赖主键,不要产生传递依赖

    ①

    image.png

    ②

    image.png


    总结如下:

    image.png

           


【原创】 使用Navicat链接mysql数据库
16 09 2019

    一、使用Navicat链接mysql数据库

    ①登录云服务商,在安全组中放行3306端口,出口、入口都添加。

    

    ②按如下所示配置参数,点击确定保存。

    

    ③进行授权操作。

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'youpassword' WITH GRANT OPTION;
    重载授权表
    FLUSH PRIVILEGES;

    ④检查防火墙有没有屏蔽3306端口,查看开放端口,有3306则没蔽,没有则被屏蔽,屏蔽的情况下自行添加,

    操作如下:

    查看防火墙端口:firewall-cmd --zone=public --list-ports  或者   firewall-cmd --list-ports

    添加防火墙端口:firewall-cmd --zone=public --add-port=3306/tcp --permanent

    重启防火墙端口:firewall-cmd --reload

    防火墙.png

    ⑤在本机Navicat中新建链接,链接Mysql,输入远程IP、端口、登录账户、密码保存,测试链接,return 'OK';

    


    二、mysql设置环境变量

    ①找到环境变量

        windows + e,在弹出框找到此电脑,鼠标右键->属性,找到高级系统设置

        图片.png


    ②找到环境变量设置按钮

         图片.png


    ③新建环境变量,变量值为本机安装的mysql路径

        图片.png


    ④编辑系统变量Path,在其他值后面添加%MYSQL_HOME%,然后点击确定->确定

        图片.png

    

    ⑤测试成功与否,windows+r打开命令行工具输入cmd,在命令行窗口输入mysqldump,看到如下黑窗口则环境变量设置成功

        图片.png

            

        图片.png


    ⑥登录mysql并设置密码,输入mysql -u root -p,默认没有密码直接回车,登录到mysql,执行以下修改命令,Query OK说明修改成功

        图片.png

            

        图片.png