chi*_*NUT 6 mysql sql performance inner-join
我今天错误地输入了一个查询,但它仍然有效,并给出了预期的结果.我打算运行这个查询:
SELECT e.id FROM employees e JOIN users u ON u.email=e.email WHERE u.id='139840'
Run Code Online (Sandbox Code Playgroud)
但我不小心跑了这个查询
SELECT e.id FROM employees e JOIN users u ON u.email=e.email AND u.id='139840'
Run Code Online (Sandbox Code Playgroud)
(注意AND而不是WHERE在最后一个子句中)
并且都从用户ID返回了正确的员工ID.
这两个查询有什么区别?第二种形式是否只加入满足条件的2个表的成员,而第一个表是否会加入整个表,然后运行查询?一个比另一个更有效还是更低效?这是我缺少的其他东西吗?
谢谢!
对于这样的内连接,它们在逻辑上是等价的.但是,您可以运行join子句中的条件意味着与where子句中的条件不同的情况.
作为一个简单的例子,假设您像这样进行左连接;
select x.id
from x
left join y
on x.id = y.id
;
Run Code Online (Sandbox Code Playgroud)
这里我们将从x中获取所有行,无论y中是否存在匹配的id.现在让我们假设我们的连接条件增长 - 我们不只是根据id而是在id_type上查找y中的匹配.
select x.id
from x
left join y
on x.id = y.id
and y.id_type = 'some type'
;
Run Code Online (Sandbox Code Playgroud)
无论y中是否存在匹配(id,id_type),这都会给出x中的所有行.
但这是非常不同的:
select x.id
from x
left join y
on x.id = y.id
where y.id_type = 'some type'
;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我们选择x的所有行并尝试匹配y中的行.现在对于y中没有匹配的行,y.id_type将为null.因此,不满足y.id_type ='some type',因此丢弃那些没有匹配的行,这有效地将其转换为内连接.
长话短说:对于内连接而言,条件在哪里并不重要,但对于外连接它可以.
| 归档时间: |
|
| 查看次数: |
3704 次 |
| 最近记录: |