值与平均值(值)之间的差异

xol*_*dec 2 mysql sql

我想知道是否可以像下面一样进行查询.

我有一个包含id 和的表value.Exapmle:

 table EXAMPLE
|id        |  value     |
|        1 |          65|
|        2 |          13|
|        3 |          22|
Run Code Online (Sandbox Code Playgroud)

我想要的是使得返回集合的查询如下:

|id        |  value     | average | difference|   
|        2 |          13|     33.3|       20.3|
|        3 |          22|     33.3|       11.3|
Run Code Online (Sandbox Code Playgroud)

问题是如何处理不同的栏目?

还有一个问题:如何在集合中仅包含比平均值更少或更大的值,

SELECT id,
       value,
       (SELECT AVG(value) FROM EXAMPLE ) as average
having 
       value <  average.
Run Code Online (Sandbox Code Playgroud)

我使用的原因having,而不是where在于where选择,因此我不能在它使用平均(平均被计算在查询执行的选择阶段)执行之前.

我还怀疑我不仅计算一次AVG(值),而且计算表中的每一行.我对吗 ?如果我,那是非常糟糕的,这肯定不是我想要的.

关于子查询的MySQL执行顺序,请给我一些启示,或者为这个主题分享一些链接.先感谢您.

And*_*rew 5

您必须单独计算总体平均值并强制交叉连接:

SQL小提琴

select
    id,
    value,
    avgValue,
    avgValue - value as Diff
from
    table1
  cross join
    ( 
      select
          avg(value) as AvgValue
      from
          table1
    ) t2
where
    value < avgValue
Run Code Online (Sandbox Code Playgroud)