Mysql 如何使用';table.column=t.column';(当t是table的缩写时)
底部的代码有效,这让我很困惑。我不明白这个表达:Mysql 如何使用';table.column=t.column';(当t是table的缩写时),mysql,sql,Mysql,Sql,底部的代码有效,这让我很困惑。我不明白这个表达: where wands_property.age = p.age 因为p是wands\u属性的缩写,所以该表达式看起来像: wands_property.age = wands_property.age 这是重言式 当给表赋予别名p时,wands\u属性有何不同 代码: 表别名p(它是外部查询中的一个表)和表名wands\u属性(它是子查询中的一个表)表示对同一物理表的不同传递,因此表达式可能会比较其中不同行的列值 这与引用具有完全相同的架构
where wands_property.age = p.age
因为p
是wands\u属性的缩写,所以该表达式看起来像:
wands_property.age = wands_property.age
这是重言式
当给表赋予别名p
时,wands\u属性
有何不同
代码:
表别名p
(它是外部查询中的一个表)和表名wands\u属性
(它是子查询中的一个表)表示对同一物理表的不同传递,因此表达式可能会比较其中不同行的列值
这与引用具有完全相同的架构和数据的完全不同的表完全相同。我们为所有表引用指定了唯一的别名,并用这些别名限定了所有列引用,这将减少混淆
这里为相关子查询内的表引用添加别名mp
和mw
:
SELECT w.id
, p.age
, w.coins_needed
, w.power
FROM wands w
JOIN wands_property p
ON p.code = w.code
WHERE p.is_evil = 0
AND w.coins_needed =
(
SELECT MIN(mw.coins_needed)
FROM wands mw
JOIN wands_property mp
ON mw.code = mp.code
WHERE mp.age = p.age
AND mw.power = w.power
)
ORDER
BY w.power DESC
, p.age DESC
请注意,子查询(在参数内部)中的引用p.age
和w.power
是对参数外部表的引用。和mw.
和mp.
是对参数内表格的引用
原始查询很好,没有别名,因为(对于MySQL)引用的表并不含糊。我们遵循的模式是为所有表引用提供唯一别名,并限定所有列引用,以帮助读者(并避免在向表中添加新列时引入“不明确的列”错误)
如果这还不能消除混淆,那么我们需要了解相关子查询是如何工作的
对于外部查询处理的每一行,MySQL(实际上)在参数内运行查询,将p.age
和w.power
的值代入,从外部查询的当前行中获取这些值
假设外部查询正在处理一行,其中p.age的值为7,w.power的值为42
子查询是有效的
SELECT MIN(mw.coins_needed)
FROM wands mw
JOIN wands_property mp
ON mw.code = mp.code
WHERE mp.age = 7
AND mw.power = 42
我们称之为相关子查询,因为子查询中的p.age
和w.power
引用的是外部查询中正在处理的行。也就是说,子查询与外部查询正在处理的当前行相关。谢谢您的回答,但我不明白,您能解释一下吗?不同的过程是什么意思?为什么它所比较的行在每种情况下都会不同?请你用一个真实的例子,比如我问题中的例子,还是你自己的表格?比如,在上面的代码中,子查询的这一部分发生了什么?谢谢。@tom当一个表再次出现在查询中时,它将被重新访问,并被认为是查询中完全不同的表。这在查询中经常发生。我解释得不太清楚。考虑如何从第一个字母相同的用户表返回所有名称组合。自己编写查询,完成后您将理解这个概念。查找子查询,然后查找相关子查询。谢谢Spencer,示例非常清楚地说明了这一点。顺便说一句,这是否意味着如果不首先使用别名,这种查询是不可能的?我这样说是因为如果你不使用别名,它将是“wands.power=wands.power”。是的。如果对wands
表的引用之一没有别名,则无法进行原始查询。如果没有别名,则无法在子查询中引用wands
表,也无法在外部查询中引用wands
表。子查询中的“wands.power=wands.power
”条件将仅引用子查询中的表。将该条件等效于“wands.power不为NULL”
”。我遵循的模式是为每个表引用指定唯一的别名,并使用表别名限定所有列引用。
SELECT MIN(mw.coins_needed)
FROM wands mw
JOIN wands_property mp
ON mw.code = mp.code
WHERE mp.age = 7
AND mw.power = 42