Ineer Join x存在-有区别吗

时间:2019-02-09 12:31:55

标签: sql join

我在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);

2 个答案:

答案 0 :(得分:0)

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

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

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

因为您只从第一张表中选择行,所以我更喜欢使用exists

答案 1 :(得分: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的性能更好。

谢谢