我有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'条件匹配的行。自然的运作方式与内联的运作方式相同吗?内联查询如何比连接更有效?
答案 0 :(得分:0)
这三个查询应该做同样的事情。您可以通过检查执行计划进行验证,但它们之间的任何差异都应该可以忽略不计。
答案 1 :(得分:0)
与USING
的自然连接和连接(包括外连接变体)根据SQL:2003标准进行处理。根据SQL:2003,目标是根据NATURAL JOIN
和JOIN ... USING
调整MySQL的语法和语义。但是,联接处理中的这些更改可能会导致某些联接的输出列不同。此外,一些似乎在旧版本(5.0.12之前)中正常工作的查询必须重写以符合标准 这些变化有五个主要方面:
- MySQL确定
NATURAL
或USING
连接操作的结果列的方式(以及整个FROM
子句的结果)。- 将
SELECT *
和SELECT tbl_name.*
扩展为所选列的列表。- 解决
NATURAL
或USING
联接中的列名称。- 将
NATURAL
或USING
联接转换为JOIN ... ON.
- 在
的ON
JOIN ... ON.
条件下解析列名称
另外,请注意:
与conditional_expr
一起使用的ON
是可以在WHERE
子句中使用的表单的任何条件表达式。通常,您应该将ON
子句用于指定如何连接表的条件,并使用WHERE
子句来限制您在结果集中需要哪些行。
最后从Rewriting Subqueries as Joins:
回答有关子查询的问题
LEFT [OUTER] JOIN
可能比等效子查询更快,因为服务器可能能够更好地优化它 - 这一事实并非仅针对MySQL Server。在SQL-92之前,外连接不存在,因此子查询是执行某些操作的唯一方法。今天,MySQL Server和许多其他现代数据库系统提供了广泛的外连接类型。