首页 > 编程知识 正文

数据库左查询和右查询的区别,左连接和子查询的效率

时间:2023-05-05 03:02:04 阅读:42954 作者:2591

mysql通过以下方式实现A left join B连接条件:

1、表格b设定为依存于表格a和a依存的所有表格

2、表a设定为依赖于使用left join条件的所有表。 b除外

3,left join条件用于确定如何从表b中检索数据行。 换句话说,不使用WHERE子句中的任何条件。

4 )执行所有标准连接的优化。 有例外。 一个表总是在所有依赖的表之后读取表数据。 (个人补充:也就是说,谦让的客户采用连接查询时,总是在连接所有依赖的表之后读取数据。 如果存在循环依赖关系,则会发生错误。

5、执行所有标准where优化

6 )即使表a中有一行与WHERE子句匹配的数据,但表b中这样的行与on条件不匹配。 将创建其他行,输入数据为空

7,如果使用LEFT JOIN查找某些表中不存在的行,在WHERE子句中指定col_name IS NULL,并将col_name声明为NOT NULL列,则MySQL将一行数据满足LEFT JOIN的条件

RIGHT JOIN的实现与LEFT JOIN类似,但表的作用相反。 右联接转换为等效的左联接。 详情请参阅8.2.1.9简化的外部链接

连接优化程序计算连接表的顺序。 由左连接或STRAIGHT_JOIN强制的表读取顺序有助于更快地完成连接优化程序的工作。 这是因为对表的数组检查很少。 这意味着,在执行以下类型的查询时,MySQL将完全扫描b : 这是因为左连接强制在d之前读取。

选择*

fromajoinbleftjoincon (rz DLS=a.key ) )。

lftjoindon(d.key=a.key ) )。

WHERE b.key=d.key; 要改变这种情况,请反转FROM子句中的a和b顺序。

选择*

frombjoinaleftjoincon (rz DLS=a.key ) ) )。

lftjoindon(d.key=a.key ) )。

WHERE b.key=d.key; 对于左连接,如果生成的空行的WHERE条件始终为false,则左连接将更改为常规连接。 例如,如果t2.column1为NULL,则WHERE子句在以下查询中为false :

select * from t1 left joint2on (列1 ) WHERE t2.column2=5;

因此,将查询转换为常规连接是安全的。

SELECT * FROM t1,T2 wheret2. column2=5and t1.column1=T2.column 1;

优化程序现在可以在表t1之前使用表t2。 这将生成更好的查询计划。 要提供有关表连接顺序的提示,请使用STRAIGHT_JOIN。 但是,STRAIGHT_JOIN会禁用半连接转换,因此可能会禁止使用索引

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。