如何设计SQL子查询?

时间:2018-11-16 08:08:27

标签: mysql

有问题的问题指出:

  

返回所有有关画家绘画的可访问信息,这些信息比各自画家所有绘画的平均价格贵。在WHERE子句中使用相关查询。为简单起见,也请使用方便的视图,而不是外部查询中的联接。

Here is a link to the Schema

这是我得到的视图:

enter image description here

这是我目前拥有的部分解决方案:

SELECT
    *
FROM
    art
WHERE
    price > (SELECT AVG(price) AS 'avg_price'
        FROM
            art
        WHERE

        GROUP BY
            painter_id);

因此,我知道有一个查询,其返回基于子查询返回的一条信息,但是子查询返回一个信息表(在这种情况下,是特定画家创建的所有画作的平均价格,按painter_id分组)。我知道我需要根据相关绘画中的painter_id从该表中提取一个条目。我的问题是,我不知道如何进行比较。我是否正确实现了子查询?如果没有,我需要改变什么才能回到正轨;如果是这样,我想念什么?我需要第二个子查询来执行此操作,还是只用一个子查询即可?

我是SQL的新手,本周早些时候刚刚了解了子查询。我确实了解常规查询的基础知识,但是目前我对查询和子查询如何相互配合有一个模糊的想法。

编辑

这是结果网格中解决方案的外观:

enter image description here

1 个答案:

答案 0 :(得分:1)

您的查询非常接近,您只需要使用painter_id的值将子查询连接(关联)到主查询:

SELECT *
FROM art a1
WHERE price > (SELECT AVG(price)
               FROM art a2
               WHERE a2.painter_id = a1.painter_id);

请注意,由于您使用painter_id限定了子查询,因此不再需要GROUP BY子句。同样,您也不需要别名作为平均价格,因为您从未直接访问该列。

做同样事情的另一种方法是在平均价格表中使用JOIN

SELECT *
FROM art a1
JOIN (SELECT painter_id, AVG(price) AS avg_price
      FROM art
      GROUP BY painter_id) a2
ON a2.painter_id = a1.painter_id AND a1.price > a2.avg_price