关联子查询会在细分的组内进行比较时使用。
关联子查询和GROUP BY子句一样,也可以对表中的数据进行切分。
关联子查询的结合条件如果未出现在子查询之中就会发生错误。
按照商品种类和该种类的平均单价进行比较
SELECT
product_type,
product_name,
sale_price
FROM
product AS p1
WHERE
sale_price > (
SELECT
AVG(sale_price)
FROM
product AS p2
WHERE
p1.product_type = p2.product_type
/* 这里的GROUP BY也可以不要
因为在WHERE字句中有了product_type相等的条件
使得AVG函数按照商品种类进行了平均值计算
*/
GROUP BY
product_type
);
关联子查询也是用来对集合进行切分的
其实关联子查询和GROUP BY一样,可以对结合进行切分。
内部执行情况
对于初学者,关联子查询可能比较难理解,但记住这种分组效应,就好理解很多。结合上图去看一下DBMS到底是怎么来执行关联子查询的。
关联子查询和GROUP BY都可以进行分组,但在应用场景上,也有明显的不同。有GROUP BY的SELECT字句中,只能选择被GROUP BY的列,也就是分组列或者聚合函数操作的结果;但是关联子查询则相当于进行一次GROUP BY再JOIN回去一样的。在有关联子查询的query里,SELECT的列是不受限制的。这一点可以在练习题5.4中看的更清楚。关联子查询的分组,只是将分组查询出来的信息作为新列加上去,不对分组内容进行聚合。
SELECT
product_id,
product_name,
product_type,
sale_Price,
(
SELECT
avg(sale_price)
FROM
product AS p2
WHERE
p1.product_type = p2.product_type
) AS avg_sale_price
FROM
product AS p1;
执行结果
网友评论