mysql总结

mysql总结

  • 执行顺序
  • 约束
  • 单表查询
    • 数据处理函数又被称为单行处理函数
    • 分组函数(多行处理函数)
  • 多表查询
    • 内连接(特点:完成能够匹配上这个条件的数据查询出来)
    • 外连接
    • 子查询
    • union合并查询结果集
  • 日期转换
  • 例子
  • mysql高级
    • mysql的架构介绍
    • 索引优化分析
  • 力扣常用函数
  • InnoDB数据存储结构
  • 六大日志文件的概述
  • 主从复制

执行顺序

将之前的关键字全部组合在一起,来看他们的执行顺序?
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 信息函数
mysql总结_第1张图片
其他函数:
mysql总结_第2张图片
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对比:mysql总结_第3张图片

索引优化分析

力扣常用函数

DENSE_RANK() over

InnoDB中索引的推演:
mysql总结_第4张图片
常见索引概念:
1 聚簇索引:
2 二级索引:
3 联合索引:

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

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

mysql数据结构选择的合理性
1 全表遍历
2 Hash结构(等值查找 o1)
mysql总结_第6张图片
3 二叉搜索树

4 AVL树
5 B-Tree
mysql总结_第7张图片

6 B+Tree
mysql总结_第8张图片
R树:
mysql总结_第9张图片

BTree和B+Tree的区别:
mysql总结_第10张图片

InnoDB数据存储结构

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

六大日志文件的概述

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

show BINLOG EVENTS in ‘mysql-bin.000216’; 查看binlog日志
mysql总结_第24张图片
查看binlog的默认格式
mysql总结_第25张图片
恢复插入的数据
mysql总结_第26张图片
删除二进制日志:
mysql总结_第27张图片
mysql总结_第28张图片
使用场景:
mysql总结_第29张图片
再谈二进制日志
mysql总结_第30张图片
两阶段提交:

中继日志(relay log):
中继日志只在主从服务器架构的从服务器上存在。
mysql总结_第31张图片

主从复制

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

你可能感兴趣的:(mysql,数据库,sql)