mysql总结

执行顺序

将之前的关键字全部组合在一起,来看他们的执行顺序?
select
from
where
group by
order by
执行顺序必须掌握:
第一步:from
第二步:where
第三步:group by
第四步:having
第五步:select
第六步:order by 排序总是在最后执行

约束

约束对应的英语单词:constraint
在创建表的时候,我们给表中的字段加上一些约束,来保证这个表中数据的完成性,有效性。
约束的作用就是为了保证:表中数据有效

约束包括那些?
非空约束:not null 只有列级约束没有表级约束
唯一性约束:unique
主键约束:primary key (简称pk)
外键约束:foreign key(简称FK)
检查约束:check(mysql不支持,oracle支持)

一个表中主键约束能加两个吗?
结论:一张表,主键约束只能添加一个
主键建议使用:int bigint char 等类型
不建议使用:varchar来做主键。主键值一般都是数字,一般都是定长的。

在实际开发中使用业务主键多,还是使用自然主键多一些?
自然主键使用比较多,因为主键主要做到不重复就行,不需要有意义。
业务主键不好,因为主键一旦和业务挂钩,那么当业务发生变动的时候,可能会影响到主键值,所以业务主键不建议使用。尽量使用自然主键。

外键约束:
t_class是父表 t_student是子表

删除表的顺序? 先删除子在删除父
创建表的顺序?先创建父,再创建子
删除数据的顺序? 先删子,再删父
插入数据的顺序?先插入父,再插入子。

小插曲:
xxxx.sql这种文件被称为sql脚本文件。
sql脚本文件中编写了大量的sql语句。
我们执行sql脚本文件的时候,该文件中所有的sql语句会全部执行!
批量的执行sql语句,可以使用sql脚本文件。
在mysql当中怎么执行sql脚本呢?
mysql > source D:\course\03-MySQL\document\vip.sql

单表查询

数据处理函数又被称为单行处理函数

特点:单行处理函数的特点:一个输入对应一个输出。
多行处理函数特点:多个输入,对应一个输出
常见单行处理函数:
1 lower转换小写
2 upper转换大写
3 substr取子串(substr(被截取的字符串,起始下标,截取的长度))
4 length 取长度
5 trim 去空格
6 str_to_date 将字符串转换成日期
7 date_format 格式化日期
8 format设置千分位
9 round 四舍五入
10 rand()生成随机数
11 ifnull 可以将null转换成一个具体值

加密解密:不可逆
password() 在mysql 8.0中弃用
MD5()
SHA()
可逆
encode(‘atguigu’,‘mysql’),decode(encode(‘atguigu’,‘mysql’),‘mysql’)

mysql 信息函数
在这里插入图片描述
其他函数:
在这里插入图片描述
commit和rollback:在这里插入图片描述

分组函数(多行处理函数)

1 count 计数 2 sum 求和 3 avg 平均值 4 max 最大值 5 min 最小值
注意:分组函数在使用的时候必须先进行分组,然后才能用。如果你没有对数据进行分组,整张表默认一组。
例子:select count(ename) from emp;

分组函数在使用的时候需要注意那些?
第一点:分组函数自动忽略null,你不需要提前对null进行处理。
第二点:分组函数中count()和count(具体字段)有上面区别?
count(具体字段):表示统计该字段下所有不为null的元素的总数。
count(
):统计表当中的总行数。(只要有一行数据count则++)。因为每一行记录不可能都为null,一行数据中有一列不为null,则这行数据就是有效的。
第三点:分组函数不能直接使用在where子句中。
因为分组函数在使用的时候必须先分组之后才能使用。where执行的时候,还没有分组,所以where后面不能出现分组函数。
重要结论:
在一条select语句当中,如果有group by语句的话,select后面只能跟:参加分组的字段,以及分组函数。其他的一律不能跟。
优化策略:where和having,优先选择where,where实在完成不了了在选择having.

多表查询

根据年代分类:
SQL92:1992年的时候出现的语法
缺点:结构不清晰,表的连接条件,和后期进一步筛选的条件,都放到了where后面。
SQL99:1999年的时候出现的语法(重点)
优点:表连接的条件是独立的,连接之后,如果还需要进一步筛选,再往后继续添加where

根据表连接的方式分类:
内连接:等值连接,非等值连接,自连接
外连接:左外连接,右外连接
全连接(了解即可)

当两张表进行连接查询,没有任何条件限制的时候,最终查询结果条数,是两张表的乘积,这种现象被称为:笛卡尔积现象。
怎样避免笛卡尔积现象?
连接时加条件,满足这个条件的记录被帅筛选出来。
思考:最终查询的结构条数是14条,但是匹配的过程中,匹配的次数减少了吗?
还是56次,只不过进行了四选一。

内连接(特点:完成能够匹配上这个条件的数据查询出来)

内连接之等值连接
select 字段名 from 表名1 join 表名2 on e.deptno = d.deptno;

内连接之非等值连接(条件不是一个等量关系,称为非等值连接)
select e.name,e.sal,s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal

内连接之自连接(将一张表看成两张表)
select a.ename as “员工名”,b.ename as “领导名”
from emp a join emp b on a.mgr = b.empno;

外连接

//outer是可以省略的,带着可读性强
右外连接:select e.ename,d.dname from emp e right outer join dept d on e.deptno = d.deptno;
right代表上面:表示将join关键字右边的这张表看成主表,主要是为了将这张表的数据全部查询出来,捎带着关联查询左边的表。

外连接之左外连接
select e.ename,d.dname from dept d left outer join emp e on e.deptno =d.deptno

三张表,四张表怎么连接?
语法:
select … from a join a和b的连接条件 join c on a和c的连接条件 join d on a和d的连接条件

子查询

什么是子查询?
select语句中嵌套select语句,被嵌套的select语句称为子查询。
子查询都可以出现在哪里呢?
select …(select)
from …(select)
where … (select)

union合并查询结果集

union得效率要高一些。对于表连接来说,每连接一次新表,则匹配的次数满足笛卡尔积,

日期转换

mysql的日期格式:
%Y 年
%m 月
%d 日
%h 时
%i 分
%s 秒
1 str_to_data将字符串转换成日期对象
2 data_format将日期转换成字符串
date和datetime两个类型的区别?
date是短日期:只包括年月日信息。
datetime是长日期:包含年月日时分秒信息。
在mysql当中如何获取系统当前时间?
now()函数,并且获取的时间带有:时分秒信息是datatime类型的

例子

按照工作岗位分组,然后对工资求和。
select job,sum(sal) from emp group by job

找出每个部门,不同工作岗位的最高薪资?
技巧:两个字段联合成一个字段看。
select deptno,job,max(sal) from emp group by deptno,job

找出每个岗位的平均薪资,要求显示平均薪资大于1500的,除Manacer岗位之外,要求按照平均薪资降序排。
select job,avg(sal) as avgsal from emp where job <> ‘MANACER’ group by job avgsal desc;

把查询结构去除重复记录
注意:原表数据不会被修改,只是查询结果去重,distinct只能出现在所有字段的最前方。
select distinct job from emp;

表起别名很重要,效率问题
select emp,dept from emp,dept where emp.deptno = dept.deptno
优化:
select e.ename,d.dname from emp e,dept d where e.deptno = d.deptno(sql 92语法)

mysql高级

mysql的架构介绍

查看你的mysql当前默认的存储引擎
show variables like ‘%storage_engine%’
MyISAM和InnoDB对比:在这里插入图片描述

索引优化分析

力扣常用函数

DENSE_RANK() over

InnoDB中索引的推演:
在这里插入图片描述
常见索引概念:
1 聚簇索引:
2 二级索引:
3 联合索引:

回表:
我们根据这个以C2列大小排序的B+树只能确定我们要查找记录的主键值,所以如果我们想根据C2列的值查找到完整的用户记录的话,仍然需要到聚簇索引中再茶一遍,这个过程称为回表。也就是根据C2列的值查询一条完整的用户记录需要使用到2棵B+树
在这里插入图片描述
联合索引:

InnoDB的B+树索引的注意事项
1 根页面位置万年不变
2 内节点中目录项记录的唯一性
3 一个页面最少存储两条记录

mysql数据结构选择的合理性
1 全表遍历
2 Hash结构(等值查找 o1)
在这里插入图片描述
3 二叉搜索树

4 AVL树
5 B-Tree
在这里插入图片描述

6 B+Tree
在这里插入图片描述
R树:
在这里插入图片描述

BTree和B+Tree的区别:
在这里插入图片描述

InnoDB数据存储结构

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
数据库服务器的优化步骤:
在这里插入图片描述
在这里插入图片描述
Explain的概述与table,id字段刨析
在这里插入图片描述
查询优化器可能对涉及子查询的查询语句进行重写,转变为多表查询的操作
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六大日志文件的概述

查看通用日志是否打开:show variables like ‘%general%’;
启动日志:
方式一:永久性
修改my.cnf或者my.ini配置来设置。再【mysqld】组下加入log选项,并重启MYSQL服务。
【mysqld】
general_log=ON
general_log_file=[[path][filename]] #日志文件所在的目录抵制,filename为日志文件名
在这里插入图片描述
方式2:临时性方式
在这里插入图片描述
错误日志
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
二进制日志(bin log)
在这里插入图片描述
方式一
在这里插入图片描述
查看mysqlbinlog日志 mysqlbinlog “/var/lib/mysql/binlog/atguigu-bin”

show BINLOG EVENTS in ‘mysql-bin.000216’; 查看binlog日志
在这里插入图片描述
查看binlog的默认格式
在这里插入图片描述
恢复插入的数据
在这里插入图片描述
删除二进制日志:
在这里插入图片描述
在这里插入图片描述
使用场景:
在这里插入图片描述
再谈二进制日志
在这里插入图片描述
两阶段提交:

中继日志(relay log):
中继日志只在主从服务器架构的从服务器上存在。
在这里插入图片描述

主从复制

第一个作用:读写分离。
第二个作用:数据备份
第三个作用:高可用性
在这里插入图片描述
涉及的三个线程:
在这里插入图片描述
在这里插入图片描述
配置主从:
在这里插入图片描述
binlong格式设置:
格式1:STATEMENT模式(基于SQL语句的复制(statement-based replication,SBR))
在这里插入图片描述格式二:row模式(基于行的复制(row-based replication,RBR))
binlog_format = ROW
在这里插入图片描述
3 mixed模式(混合模式复制(mixed-based replication,MBR))
在这里插入图片描述
数据同步一致性:
方法一:异步复制
在这里插入图片描述
方式二:半同步复制
在这里插入图片描述
方式三:组复制
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值