相关子查询是包含对也出现在外部查询中的表的引用的子查询。 通俗地说,子查询指的是主查询的数据。
用一个实际的例子来理解相关子查询
left join:左连接,返回左表中所有记录以及右表中连接字段相等的记录。
right join:右连接,返回右表中的所有记录以及左表中连接字段相等的记录。
内连接:内连接也称为等连接,只返回两个表中连接字段相等的行。
full join:外连接,从两个表返回行:左连接+右连接
交叉连接:结果是笛卡尔积,即第一个表中的行数乘以第二个表中的行数。
代码如下所示
@a 表(a int,b int)
@b表(a int,b int)
@a (1,1)
@a (2,2)
@b (1,1)
@b (3,3)
*来自@a
*来自@b
- 左边:
* 从 @a Aa 左端加入 @b Bb 在 Aa.a=Bb.a 上
- 正确的:
* 从 @a Aa 右加入 @b Bb on Aa.a=Bb.a
- 里面
* 从 @a Aa 内部加入 @b Bb on Aa.a=Bb.a
- 外部:
* 从@a Aa 完全加入@b Bb on Aa.a=Bb.a
- 交叉连接
* 来自@a交叉连接@b
相关子查询效率
显然,相关子查询的效率总体上比较低。 事实上,本例中的相关子查询示例只是为了演示相关子查询的原理和用法。 如果可能,尝试使用 JOIN 或其他查询来代替相关子查询。 在这个例子中,被 INNER JOIN 替换的 SQL 是:
代码如下所示
.* FROM INNER JOIN 用户 ON .uid = user.uid
注意:这只是为了演示用 INNER JOIN 替换相关子查询的示例。 并不意味着表名的这种处理是最优的处理。