MYSQL大数据量下的,SQL练习,SQL常用高级关键字讲解

如果你没有数据练习,请看我这篇博客

https://blog.csdn.net/weixin_44012722/article/details/107974662

现在开始练习(以下练习都是以上面的数据集作为练习数据)

关键字 作用
JOIN 连接查询
UNION 合并表结果
EXPLAIN 查看SQL语句的执行计划
更多的关键字

1.JOIN

  1. left join
返回左表拥有的emp_no,
select e.emp_no,birth_date,first_name,last_name,gender,salary from employees e left join salaries s on e.emp_no = s.emp_no 

//返回左表有的emp_no,且右表没有的emp_no
select e.emp_no,birth_date,first_name,last_name,gender,salary from employees e left join salaries s on e.emp_no = s.emp_no where s.emp_no is null 
  1. right join
返回右表拥有的emp_no
select e.emp_no,birth_date,first_name,last_name,gender,salary from employees e right join salaries s on e.emp_no = s.emp_no 

//返回右表有的emp_no,且左表没有的emp_no
select e.emp_no,birth_date,first_name,last_name,gender,salary from employees e right join salaries s on e.emp_no = s.emp_no where s.emp_no is null 
  1. inner join
返回左右表都有的emp_no
select e.emp_no,birth_date,first_name,last_name,gender,salary from employees e inner join salaries s on e.emp_no = s.emp_no 
  1. full join / full outer join (Oracle数据库支持full join,mysql是不支持full join的,但仍然可以同过左外连接+ union+右外连接实现)
返回左表所有有的emp_no和右表所有的emp_no
//Oracle数据库支持full join
select e.emp_no,m.emp_no,first_name,last_name,motto from employees e full join motto m on e.emp_no = m.emp_no 

MYSQL大数据量下的,SQL练习,SQL常用高级关键字讲解_第1张图片

2.UNION

select e.emp_no,birth_date,first_name,last_name,gender,salary from employees e left join salaries s on e.emp_no = s.emp_no where s.emp_no is null 
union
select e.emp_no,birth_date,first_name,last_name,gender,salary from employees e right join salaries s on e.emp_no = s.emp_no 

3.EXPLAIN

在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看。所以我们深入了解MySQL的基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行SQL语句时哪种策略预计会被优化器采用。
执行EXPLAIN可以查询 到以下字段

在这里插入图片描述

字段名 意义
id 表示查询中执行select子句或操作表的顺序序列号( id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行)
select_type 查询类型
table 显示 这行数据关于哪一张表
type 访问类型
possible_keys 显示可能应用在这张表中索引,一个或多个,,但不一定被查询实际用到
key 实际用到的索引
key_len 表示索引中使用的字节数,查询中使用的索引长度,越短越好
ref 哪些列字段或常量被用于查找索引列上的值
rows 找出数据所需要读取的行数
extra(#extra) 额外的信息描述

- id

//id相同  id如果相同,可以认为是一组,从上往下顺序执行;
explain select t2.* from t1,t2,t3 where t1.id = t2.id and t1.id = t3.id and t1.col_1 = ''

在这里插入图片描述

//id不同 d值越大,优先级越高,越先执行
explain select t2.* from t2 where id = (select t1.id from t1 where id = (select t3.id from t3 where t3.col_1 = ''))

在这里插入图片描述

- select_type

查询类型只要区别,普通查询,联合查询,子查询的复杂查询
名字 介绍
SIMPLE 简单的select查询,查询中不包含子查询或者UNION
PRIMARY 查询中若包含任何复杂 的子部分,最外层查询则标记为PRIMARY
SUBQUERY 在SELECT或WHERE列表中包含子查询
DERIVED 在FROM列表中包含子查询,MYSQL会递归执行这些子查询把结果放在临时表
UNION 若在第二个SELECT出现UNION就标记为 UNION,若UNION包含在FROM子句的子查询中,外层SELECT将被标记为DERIVED

- type

全 部 访 问 类 型 \color{#FF0000}{全部访问类型} 访
system > const > eq_ref > ref > fulltext > ref_or_null > index-merge > unique_subquery > index_subquery > range > index > ALL
常 用 访 问 类 型 \color{#FF0000}{常用访问类型} 访
system > const > eq_ref > ref > range > index > ALL
一 般 来 说 至 少 要 达 到 r a n g e 级 别 为 好 , 最 好 到 达 r e f 级 别 \color{#FF0000}{一般来说至少要达到range级别为好,最好到达ref级别} rangeref
级别 描述
system 表只有一行数据(等于系统表),平时不会出现,可以忽略不计
const 表示通过一次索引就找到了,const常用于比较primary和unique索引,因为只匹配一行数据
eq_ref 常用于比较primary和unique索引,对于每个索引键,表中都只有 一条记录与之匹配
ref 用于非primary和unique索引,返回匹配某个单独的所有行
range 给定范围的索引查询,一般出现 关键字 between,>,<
index 读取全表,因为index只读取索引树,通常比all快,因为索引文件比数据文件小
all 读取全表,从硬盘中读取数据文件
const和eq_ref的区别 (刚开始我也分不清,后面知道了,分享一下)
两者相同都是用于比较primary和unique索引,不同地方是,const是通过一次索引比较,找出一条记录,而eq_ref是对于每个索引键,表中都只有 一条记录与之匹配,找出1条记录,看以下sql,品一下
const
explain select * from t1 where id = 1
eq_ref
explain select * from t1,t2  where t1.id = t2.id

- extra

名称 描述 SQL性能
Using filesort MYSQL无法利用索引完成的排序称作为“文件排序”
Using temporary 使用了临时表保存中间结果,MYSQL在对查询结果排序时使用了临时表 极差
Using index 表示索引被作为读取字段进行查找
Using where 表示索引被作为条件进行查找
Using join buffer 使用了join连接查询缓冲区 一般
impossible where 不可能的条件
select tables optimized away MySQL根本没有遍历表或索引就返回数据了
distinct 优化distinct操作,在找到第一个匹配的数据后停止查找
以上就是EXPLAIN关键字的介绍,想进行优化SQL练习的请看我这篇博客

4.更多关键字正在持续的更新中。。。

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