【数据结构】----利用join进行查询优化

1.如何正确使用join从句

1.Inner join

内连接Inner join基于连接谓词将两张表AB的列组合在一起取它们的交集,产生新的结果表
在这里插入图片描述
内连接子句出现在FROM子句之后。 在ON关键字之后指定表A和表B之间匹配的条件。这种情况称为连接条件,即B.n = A.n

2.left join

LEFT JOIN左外连接子句出现在FROM子句之后。 ON关键字后面的条件称为连接条件B.n = A.n。左连接将返回左表中的所有行,而不管右表中是否存在匹配的行,右表中的非匹配行使用NULL值填充,因此可以将LEFT JOIN子句应用于查询右表中的未匹配行(其值为null)
在这里插入图片描述
利用左表的优化:
利用left join加上where子句条件限定左表查询的列不为null可以查询出存在于左表而没有在右表的数据,因此就可以对not子句进行优化,not子句没有利用索引查询,效率较低。
在这里插入图片描述

right out join

RIGHT JOIN右连接将返回右表中的所有行,而不管左表中是否存在匹配的行,左表中的非匹配行使用NULL值填充
在这里插入图片描述

4.full out join

FULL JOIN完整外连接,包括连接表中的所有行,无论另一个表是否具有匹配的行,如果连接表中的行不匹配,则完整外连接的结果集包含缺少匹配行的表的每列都会使用NULL值.
但是mysql中,并不支持full join,会报出1064的错误,因此要想达到full join 的效果,可以通过union all关键字连接多个结果集
在这里插入图片描述

5.cross join

CROSS JOIN交叉连接,是一种连接操作,它生成两个或多个表的笛卡尔积:SELECT column_list FROM A CROSS JOIN B;

MySQL不支持对出现在from语句中的表进行更新。因此可以采用join语句更新使用在过滤条件中的表。
如: update user1 a join(select b.user_name from user1 a join user2 b on a.user_name=b.user_name) b on a.user_name=b.user_name set a.over='XXX';

利用JOIN的查询优化

1.利用left join on 语句代替where 子句中的匹配查询
2.利用join优化聚合子查询
常规查询语句:
在这里插入图片描述
利用join 优化后的查询:
在这里插入图片描述
3.利用join实现分组选择
一般的分组查询语句:
在这里插入图片描述
优化方式一:
在这里插入图片描述