mysql 进阶查询
group by having用法
group by
是mysql中用来对by后面的单个或者多个字段进行分组的语法,可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表,用法比较灵活,常常和where
或者having
一起用。
group by的语法:
1 | select 字段 from 表名 group by 字段; |
注意:where 是先过滤,再分组;having 是分组后再过滤
Having子句(是对分组之后的数据进行过滤,所以使用having时必须用group by先分组),Having中的组函数可以不是select中的组函数
where子句和having子句都是用来筛选条件用的,不同的是,where子句只能对分组前的属性进行删选,而having子句只能对分组后的属性进行筛选。
group by经常会配合聚合函数一起用
比如常用的聚合函数:count() , sum() , avg() , max() , min(),可以这样用
1 | select 字段,count(字段2),sum(字段3) from 表名 group by 字段; |
select后面的字段必须包含在group by
后面字段之内
1 | select 字段1,字段2 from 表名 group by 字段1,字段2,字段3 |
select后有聚合函数例外:
1 | select 字段1,count(字段2),sum(字段3) from 表名 group by 字段1; |
join连接
mysql种共有7种join()
但实际上只有4种主要的:左外连接
,右外连接
,内连接
,全外连接
内连接
(inner join 可简写为join) 就是交集,也就是两张表的共同数据;
1 | select * from a [inner] join b on a.key = b.key |
左外连接
1 | select * from a left join b on a.key = b.key |
右外连接
1 | select * from a right join b on a.key = b.key |
全外连接
1 | select * from a full outer join b on a.key = b.key; |
注意:上面的sql只在Oracle中适用,MYSQL中不支持,因此在MYSQL中想要实现全外连接,得用联合查询(union)实现
什么是联合查询(union)
简单来说就是把两个sql语句的结果取并集(也就是去重复值)
1 | select * from a left join b on a.key = b.key |
慢查询日志
慢查询日志(slow query log):
用来记录在 MySQL 中执行时间超过指定时间的查询语句,在 SQL 优化过程中会经常使用到。
通过慢查询日志,我们可以查找出哪些查询语句的执行效率低,耗时严重。
开启慢查询日志
出于性能方面的考虑,一般只有在排查慢SQL、调试参数时才会开启,默认情况下,慢查询日志功能是关闭的。
可以通过以下命令查看是否开启慢查询日志:
1 | mysql> SHOW VARIABLES LIKE 'slow_query%'; |
通过如下命令开启慢查询日志后,我发现 iZ2zebfzaequ90bdlz820sZ-slow.log 日志文件里并没有内容啊,可能因为我执行的 SQL 都比较简单没有超过指定时间。
1 | mysql> SET GLOBAL slow_query_log=ON; |
指定超过时间设定
上边提到超过 指定时间 的查询语句才算是慢查询,那么这个时间阈值又是多少嘞?我们通过 long_query_time 参数来查看一下,发现默认是 10 秒。
1 | mysql> SHOW VARIABLES LIKE 'long_query_time'; |
这里我们将 long_query_time 参数改小为 0.001秒再次执行查询SQL,看看慢查询日志里是否有变化。
1 | mysql> SET GLOBAL long_query_time=0.001; |
bin log(归档日志)
bin log是一种数据库Server层(和什么引擎无关),以二进制形式存储在磁盘中的逻辑日志。
bin log记录了数据库所有DDL和DML操作(不包含 SELECT 和 SHOW等命令,因为这类操作对数据本身并没有修改)。
默认情况下,二进制日志功能是关闭的。可以通过以下命令查看二进制日志是否开启:
1 | mysql> SHOW VARIABLES LIKE 'log_bin'; |
bin log也被叫做归档日志,因为它不会像redo log那样循环写擦除之前的记录,而是会一直记录日志。
一个bin log日志文件默认最大容量1G(也可以通过max_binlog_size参数修改),单个日志超过最大值,则会新创建一个文件继续写。
1 | mysql> show binary logs; |
bin log日志的内容格式其实就是执行SQL命令的反向逻辑,这点和undo log有点类似。
一般来说开启bin log都会给日志文件设置过期时间(expire_logs_days参数,默认永久保存),要不然日志的体量会非常庞大。
1 | mysql> show variables like 'expire_logs_days'; |
bin log
主要应用于MySQL主从模式(master-slave)中,主从节点间的数据同步;以及基于时间点的数据还原。
主从同步
通过下图MySQL的主从复制过程,来了解下bin log在主从模式下的应用
基于时间点还原
我们看到bin log也可以做数据的恢复,而redo log也可以,那它们有什么区别?
返回 MySql 系列