我正在刷新我的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'
我的问题是我没有得到第一个表格以及何时/为什么我们使用它。外部引用查询何时有用?
答案 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)
但是,我不知道这是否是一个相关的子查询。语义不是我的强项。