Ineer Join x存在-有区别

问题描述 投票:0回答:2

我在MySQL数据库上有两个表:

mysql> select * from employee;
+------+---------+
| id   | name    |
+------+---------+
|    2 | Olavo   |
|    3 | Ricardo |
|    1 | Ricardo |
+------+---------+
3 rows in set (0,00 sec)

mysql> select * from works_for;
+-------------+--------------+
| employee_no | company_name |
+-------------+--------------+
|           2 | Luz          |
|           1 | Vale         |
+-------------+--------------+
2 rows in set (0,00 sec)

我需要知道这两个查询之间是否有区别。在这种情况下,我应该使用每个?

select e.name
from employee e inner join
     works_for w
     on (e.id=w.employee_no);

select e.name
from employee e
where exists (select 1 from works_for w where w.employee_no=e.id);
sql join
2个回答
0
投票

有很大的不同。如果works_for中的多行与employee中的特定行匹配,则inner join返回多行。 exists仅返回一行。

由于存在这种差异,所以两个查询可能具有完全不同的执行路径和时序。这样的差异将在比您的示例更大的表上显示。

但是,实际上,性能差异并不明显。两者都可以利用基础索引和表统计信息。因此,在许多情况下,使用哪种选择只是样式问题。

因为您仅从第一张表中选择行,所以我首选使用exists


0
投票

两个查询都为您提供相同的结果。

  1. Join为您提供了从两个表中获取数据的功能。尝试下面的查询以了解。

    select *
    from employee e inner join
     works_for w
     on (e.id=w.employee_no);
    
  2. 可以使用
  3. EXISTS or IN条件或子查询来检查主表中的数据在子查询提供的表中是否可用。与Join无关,它仅从主表中获取记录。尝试下面的查询以了解

       select *
       from employee e
       where exists (select 1 from works_for w where w.employee_no=e.id);
    

也使用JoinSubquery取决于您的要求和查询性能。与子查询相比,Join为您提供了良好的性能。

© www.soinside.com 2019 - 2024. All rights reserved.