【MySQL知识点】MySQL基础知识学习-来自于视频

目录

一、MySQL架构图

二、数据库存储引擎InnoDB与MyISAM的区别

三、手写SQL顺序与机读SQL顺序

四、MySQL七种join连接详解之建表SQL:

五、MySQL七种join连接详解:

六、MySQL索引

(1)B站视频:尚硅谷MySQL数据库高级,mysql优化,数据库优化(周阳老师):https://www.bilibili.com/video/BV1KW411u7vy?p=11

(2)B站视频:本教程主要讲授针对 Java 开发所需的 MySQL 高级知识,课程中会让大家快速掌握索引,如何避免索引失效,索引的优化策略,了解innodb和myisam存储引擎,熟悉MySQL锁机制,能熟练配置MySQL主从复制,熟练掌握explain、show profile、慢查询日志等日常SQL诊断和性能分析策略。MySQL基础教程:https://www.bilibili.com/video/av21400736?spm_id_from=333.788.b_765f64657363.1

一、MySQL架构图

二、数据库存储引擎InnoDB与MyISAM的区别

三、手写SQL顺序与机读SQL顺序

对于人工而言,手写的SQL是这样的顺序:

对于MySQL数据库而言,它读取的顺序是这样的:

鱼骨图总结:

四、MySQL七种join连接详解之建表SQL:

(1)班级表:

CREATE TABLE `RUN_Class` (
  `Id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID(班级)',
  `ClassName` varchar(256) NOT NULL COMMENT '班级名称',
  `Status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '有效=1,无效=-1',
  `AddTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
  `UpdateTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='班级信息表';

(2)学生表

CREATE TABLE `RUN_Student` (
  `Id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID(学号)',
  `Name` varchar(256) NOT NULL DEFAULT '' COMMENT '姓名',
  `ClassId` int(11) NOT NULL COMMENT '班级',
  `Status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '有效=1,无效=-1',
  `AddTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
  `UpdateTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='学生信息表';

五、MySQL七种join连接详解:

(1)内连接:内连接查询出的数据是两张表的交集,即图中红色所表示的部分。

(2)左外连接:左外连接如图中红色部分的内容,即包含左边表的全部行(不管右边的表中是否存在与它匹配的行),和右边表中全部匹配的行。

(3)右外链接:右外连接如图中红色部分的内容,即包含右边表的全部行(不管左边的表中是否存在与它匹配的行),和左边表中全部匹配行。

(4)左连接:左连接如图中红色部分的内容,查询出左表独有的数据。

    

 解析:其实上图就是在左外连接的基础上进行的,左外连接得到了左表,但是左表里还包含了一部分左右表都具有相同数据的区域,这时需要将这部分相同数据去掉,去除的条件就是 B.key IS NULL

(5)右连接:如果看懂了上面的左连接,那么右连接大同小异,就是查询出右表独有的数据。

 解析:其实上图就是在右外连接的基础上进行的,右外连接得到了右表,但是右表里还包含了一部分左右表都具有相同数据的区域,这时需要将这部分相同数据去掉,去除的条件就是 A.key IS NULL

(6)全连接(Mysql中不支持下图写法):查询出左右两表的所有数据 。

但是!MySQL中并不支持这种写法,所以只能通过别的方法。A、B的所有:也就是A的独有+B的独有+A与B的共同拥有的数据.

Mysql中可以使用:select * from Table A left join Table B on A.Key = B.Key       (找出A的所有)

                               union            (去重+合并)

                               select * from Table A right join Table B on A.Key = B.Key     (找出B的所有)     

(7)全外连接(Mysql中不支持下图写法):左右表的共有数据之外的数据查询。

筛选出对于A表而言B为空+对于B表而言A为空的数据,MySQL中也不支持这种写法,所以只能通过别的方法。

其实全外连接也就是:A的独有+B的独有。

Mysql语法:          select * from Table A left join Table B on A.Key = B.Key  where B.Key is null      (找出A的独有)

                               union            (去重)

                               select * from Table A right join Table B on A.Key = B.Key where A.Key is null    (找出B的独有)

六、MySQL索引

结论:索引一方面解决where条件的查询如何使其快速,另一方面解决order by排完序之后的查询如何使其快速。 

 

表中数据达到几十万甚至数百万及行记录以上的时候才开始做优化比较合适。

explain关键字查询出10个字段属性:id、select_type、table、type、possiable_keys、key、key_len、ref、rowsextro

其中的type属性有如下7种取值:system > const > eq_ref > ref > range > index > all 

注:先完成再完美,先功能再性能。

主表不用加索引,从表的连接字段一定要加索引。

永远使用小的结果集驱动大的结果集(小表驱动大表)。

子查询(或者嵌套查询):鸡蛋黄(最内层查询)——>鸡蛋清(中间层查询)——>鸡蛋壳(最外层查询)。 

使用mysql索引口诀:

带头大哥不能死,中间兄弟不能断。索引列上不计算。like百分加右边。范围之后全失效。字符串里有引号。覆盖索引不写星 *。

 


 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值