我在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);
答案 0 :(得分:0)
有很大的不同。如果works_for
中的多行与employee
中的特定行匹配,则inner join
返回多行。 exists
仅返回一行。
由于存在这种差异,所以这两个查询可能具有完全不同的执行路径和时序。这样的差异将在比您的示例更大的表上显示。
但是,实际上,性能差异并不明显。两者都可以利用基础索引和表统计信息。因此,在许多情况下,使用哪种选择只是样式问题。
因为您只从第一张表中选择行,所以我更喜欢使用exists
。
答案 1 :(得分:0)
两个查询都为您提供相同的结果。
Join
为您提供了从两个表中获取数据的功能。请尝试以下查询来了解。
select *
from employee e inner join
works_for w
on (e.id=w.employee_no);
EXISTS or IN
条件或子查询来检查主查询中的数据是否在子查询提供的表中可用。与Join
无关,它仅从主表中获取记录。请尝试以下查询来了解
select *
from employee e
where exists (select 1 from works_for w where w.employee_no=e.id);
是否也使用Join
或Subquery
取决于您的要求和查询性能。与子查询相比,Join
的性能更好。
谢谢