在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
答案 0 :(得分:3)
所有这些功能都相同。当完全使用INNER连接时,即使WHERE子句和JOIN条件之间的分离也不会改变结果(它可以与OUTER连接一起使用)。此外,所有这些都应该在完全相同的查询计划中实现(实际上是零性能差异)。包含商品的顺序无关紧要。查询引擎可以自由优化,因为它看起来最适合查询的功能规范。即使您确定了与订单有关的特定行为,也不应指望它。规范允许明天的补丁改变今天在这个领域的行为。请记住:SQL的重点是基于集合和声明性:您告诉数据库您希望它做什么,而不是如何你希望它能做到。
既然正确性和性能已不在考虑之中,我们就会遇到风格问题:程序员的工作效率和代码的可读性/可维护性等。在这方面,该列表中的选项#4是到目前为止的最佳选择,其次是#3,尤其是当您开始进入更复杂的查询时。只是不要再使用A,B
语法了;自1992年版的SQL标准以来,它已经过时了。始终写出完整的INNER JOIN
(或LEFT JOIN
/ RIGHT JOIN
/ CROSS JOIN
等)。
所有这一切,虽然订单确实(或者,至少应该)对性能无关紧要,但我确实发现在我编写SQL以在我的方法中使用约定来确定顺序时它很有用。这有助于我在以后进行调试和故障排除时识别错误或错误假设。我尝试遵循的这个一般指南就是表现得好像订单一样重要,然后考虑到这一点,尽量保持数据库所需的工作内存集尽可能地尽可能小地完成查询:首先从较小的表开始,然后加入较大的表;在考虑表大小时,请考虑WHERE子句中与索引匹配的条件;当你有选择时,更喜欢外部连接;列出连接条件以首先支持索引(尤其是主键/聚簇键),以及第二个连接条件的其他条件。