子查询以及使用相关子查询引用外部的可能性

时间:2013-02-16 21:02:01

标签: mysql sql subquery correlated-subquery

我正在刷新我的SQL 我正在阅读关于子查询以及使用相关子查询引用外部的可能性 示例:

SELECT *  
FROM ORDERS O  
WHERE 'ROAD BIKE' =  
(SELECT DESCRIPTION FROM PART P WHERE P.PARTNUM = O.PARTNUM)  

这相当于一个连接:

SELECT O.ORDEREDON, O.NAME,  
O.PARTNUM, O.QUANTITY, O.REMARKS  
FROM ORDERS O, PART P  
WHERE P.PARTNUM = O.PARTNUM AND P.DESCRIPTION = 'ROAD BIKE'  

我的问题是我没有得到第一个表格以及何时/为什么我们使用它。外部引用查询何时有用?

3 个答案:

答案 0 :(得分:2)

订单引用了部件号,因此Orders表具有部件号的外键。

我们想要所有订购号为“公路自行车”的订单。

第一个表格首先对每个记录进行子查询,以检查O.PARTNUM是否是“公路自行车”的部件号。

想到它的方法是,主查询遍历Orders表中的每个记录。在每条记录上,它执行一个子查询,在查询中使用它的PARTNUM字段。因此,如果您在子查询中使用Orders记录的PARTNUM,请选择在PART表中找到包含该PARTNUM的记录,然后选择DESCRIPTION字段。然后检查主查询的where子句是否“Road Bike”等于从子查询返回的DESCRIPTION。

我建议不要使用第一个表单,因为它是一个相关查询,出于性能原因你应该避免相关查询,所以使用第二个表单。第一种形式的更好版本是:

SELECT *  
FROM ORDERS O  
WHERE O.PARTNUM =  
(SELECT P.PARTNUM FROM PART P WHERE DESCRIPTION = 'ROAD BIKE')

这不是相关查询。数据库可以执行子查询一次,获取带有“ROAD BIKE”作为描述的记录的PARTNUM,然后运行条件WHERE O.PARTNUM等于子查询结果的主查询。

答案 1 :(得分:2)

简而言之,你应该避免像瘟疫这样的相关子查询。

相关子查询对外部表中的每一行执行一次内部查询。这导致了糟糕的性能(100万行外表会导致内部查询执行100万次!)

另一方面,连接非常有效,数据库非常擅长优化它们。

如果可能,请始终将您的查询表示为优先于相关子查询的联接。

答案 2 :(得分:0)

子查询可能适合的场景是这样的:

select some fields
from some tables
where some conditions are met  
and somefield = (select min(something) from etc)

但是,我不知道这是否是一个相关的子查询。语义不是我的强项。