将之前的关键字全部组合在一起,来看他们的执行顺序?
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得效率要高一些。对于表连接来说,每连接一次新表,则匹配的次数满足笛卡尔积,
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当前默认的存储引擎
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 二叉搜索树
数据库服务器的优化步骤:
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))
数据同步一致性:
方法一:异步复制
方式二:半同步复制
方式三:组复制
在这里插入图片描述