在mysql中哪个内部连接sql最有效且最好?

时间:2015-08-07 03:07:39

标签: mysql sql

在mysql中哪个内部连接sql最有效且最好?
1。

select t01.uname, t02.deptname
from   user t01,  department t02
where  t01.deptid = t02.deptid
and    t01.uid    = '001'

2

select t01.uname, t02.deptname
from   user t01,  department t02
where  t01.uid    = '001' 
and    t01.deptid = t02.deptid

3

select t01.uname, t02.deptname
from   user t01 inner join department t02 on t01.deptid = t02.deptid
                                         and t01.uid = '001'

4

select t01.uname, t02.deptname
from   user t01 inner join department t02 on t01.deptid = t02.deptid
where  t01.uid = '001'

我的mysql是5.1

1 个答案:

答案 0 :(得分:3)

所有这些功能都相同。当完全使用INNER连接时,即使WHERE子句和JOIN条件之间的分离也不会改变结果(它可以与OUTER连接一起使用)。此外,所有这些都应该在完全相同的查询计划中实现(实际上是零性能差异)。包含商品的顺序无关紧要。查询引擎可以自由优化,因为它看起来最适合查询的功能规范。即使您确定了与订单有关的特定行为,也不应指望它。规范允许明天的补丁改变今天在这个领域的行为。请记住:SQL的重点是基于集合和声明性:您告诉数据库您希望它做什么,而不是如何你希望它能做到。

既然正确性和性能已不在考虑之中,我们就会遇到风格问题:程序员的工作效率和代码的可读性/可维护性等。在这方面,该列表中的选项#4是到目前为止的最佳选择,其次是#3,尤其是当您开始进入更复杂的查询时。只是不要再使用A,B语法了;自1992年版的SQL标准以来,它已经过时了。始终写出完整的INNER JOIN(或LEFT JOIN / RIGHT JOIN / CROSS JOIN等)。

所有这一切,虽然订单确实(或者,至少应该)对性能无关紧要,但我确实发现在我编写SQL以在我的方法中使用约定来确定顺序时它很有用。这有助于我在以后进行调试和故障排除时识别错误或错误假设。我尝试遵循的这个一般指南就是表现得好像订单一样重要,然后考虑到这一点,尽量保持数据库所需的工作内存集尽可能地尽可能小地完成查询:首先从较小的表开始,然后加入较大的表;在考虑表大小时,请考虑WHERE子句中与索引匹配的条件;当你有选择时,更喜欢外部连接;列出连接条件以首先支持索引(尤其是主键/聚簇键),以及第二个连接条件的其他条件。