效率这些sql查询的区别?

时间:2015-10-08 07:43:17

标签: mysql

我有2个表customer和order1。我想知道以下哪个查询更有效

select cust_name,ISBN from customer,order1 where customer.cust_no=order1.cust_no;

select cust_name,ISBN from customer inner join order1 on customer.cust_no=order1.cust_no;

select cust_name,ISBN from customer natural join order1;

我已经读过内连接采用两个表的笛卡尔积,然后只返回与'on'条件匹配的行。自然的运作方式与内联的运作方式相同吗?内联查询如何比连接更有效?

2 个答案:

答案 0 :(得分:0)

这三个查询应该做同样的事情。您可以通过检查执行计划进行验证,但它们之间的任何差异都应该可以忽略不计。

答案 1 :(得分:0)

根据MySQL 5.7 Reference Manual

USING的自然连接和连接(包括外连接变体)根据SQL:2003标准进行处理。根据SQL:2003,目标是根据NATURAL JOINJOIN ... USING调整MySQL的语法和语义。但是,联接处理中的这些更改可能会导致某些联接的输出列不同。此外,一些似乎在旧版本(5.0.12之前)中正常工作的查询必须重写以符合标准 这些变化有五个主要方面:
  • MySQL确定NATURALUSING连接操作的结果列的方式(以及整个FROM子句的结果)。
  • SELECT *SELECT tbl_name.*扩展为所选列的列表。
  • 解决NATURALUSING联接中的列名称。
  • NATURALUSING联接转换为JOIN ... ON.
  • ON
  • JOIN ... ON.条件下解析列名称

另外,请注意:

conditional_expr一起使用的 ON 是可以在WHERE子句中使用的表单的任何条件表达式。通常,您应该将ON子句用于指定如何连接表的条件,并使用WHERE子句来限制您在结果集中需要哪些行。

最后从Rewriting Subqueries as Joins:

回答有关子查询的问题
LEFT [OUTER] JOIN可能比等效子查询更快,因为服务器可能能够更好地优化它 - 这一事实并非仅针对MySQL Server。在SQL-92之前,外连接不存在,因此子查询是执行某些操作的唯一方法。今天,MySQL Server和许多其他现代数据库系统提供了广泛的外连接类型。