3

我正在刷新我的 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'  

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

4

3 回答 3

2

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

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

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

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

于 2013-02-16T21:33:15.177 回答
2

Orders 具有对零件号的引用,因此 Orders 表具有零件号的外键。

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

第一个表单首先对每条记录进行子查询,以检查 O.PARTNUM 是否是“Road Bike”的零件号。

可以这样想,主要查询是遍历 Orders 表中的每条记录。在每条记录上,它执行一个子查询,其中它的 PARTNUM 字段在查询中使用。因此,如果您在子查询中使用 Orders 记录的 PARTNUM,请选择在 PART 表中查找具有该 PARTNUM 的记录,然后选择 DESCRIPTION 字段。然后主查询的 where 子句检查“公路自行车”是否等于从子查询返回的说明。

我建议不要使用第一种形式,因为它是关联查询,出于性能原因,您应该避免关联查询,因此请使用第二种形式。第一种形式的更好版本是:

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

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

于 2013-02-16T21:23:21.630 回答
0

可能适合子查询的场景如下所示:

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

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

于 2013-02-16T22:08:52.980 回答