我在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);
有很大的不同。如果works_for
中的多行与employee
中的特定行匹配,则inner join
返回多行。 exists
仅返回一行。
由于存在这种差异,所以两个查询可能具有完全不同的执行路径和时序。这样的差异将在比您的示例更大的表上显示。
但是,实际上,性能差异并不明显。两者都可以利用基础索引和表统计信息。因此,在许多情况下,使用哪种选择只是样式问题。
因为您仅从第一张表中选择行,所以我首选使用exists
。
两个查询都为您提供相同的结果。
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
为您提供了良好的性能。