MariaDB(MySQL)“;平均;不工作与拥有

MariaDB(MySQL)“;平均;不工作与拥有,mysql,mariadb,having,Mysql,Mariadb,Having,我的问题是:为什么以下两条SQL语句产生不同的结果(我在后面解释这两条语句。用XAMPP 7.0.8测试了MariaDB bundeled) (一) (二) 这些查询的结果: (1) 会给你一套空的(我不明白为什么) (2) 将给您两行,这是正确的答案 对2条Select语句的解释: SELECT STOCK_EXCHANGE_CODE, sum(SHARE_PRICE * SHARE_CNT) AS summed FROM LISTED_AT WHERE D

我的问题是:为什么以下两条SQL语句产生不同的结果(我在后面解释这两条语句。用XAMPP 7.0.8测试了MariaDB bundeled)

(一)

(二)

这些查询的结果: (1) 会给你一套空的(我不明白为什么) (2) 将给您两行,这是正确的答案

对2条Select语句的解释:

  SELECT
     STOCK_EXCHANGE_CODE,
     sum(SHARE_PRICE * SHARE_CNT) AS summed
   FROM LISTED_AT
   WHERE DATE_VALID = STR_TO_DATE('04-12-2015', '%d-%m-%Y')
   GROUP BY STOCK_EXCHANGE_CODE
这是Select语句的一部分,它汇总了特定证券交易所的所有股票价值。 输出为:

BRX 122653.50

L&S 275000.00

500000.00墨西哥克朗

斯图140415.00

XETRA 254610.00

平均值(总和)=258535.6

对于语句(1)[我首先尝试过]我使用了一个select around来确定group by是全局的。现在来看,有一个不必要的“按名称选择所有列”,但这在这里并不重要。对于外部select,我尝试应用“HAVING”子句

我确实希望所有股票交易所在特定日期的总价值(=>“总和”)高于平均值。据我所知,它应该计算上述5家股票交易所的全球平均值(=>),并进行核对

我不知道这为什么不起作用。将
summared>avg(summared)
更改为
summared avg(summared)
将产生一行结果(BRX 122653.50)。
summated>0
返回所有5行的结果。 这就是为什么我认为平均数和拥有无关,反之亦然

(二) 这与第一个完全相同,将HAVING子句替换为更明确的平均值计算。正如您所看到的,有两个子查询的名称为“a”,两者都相同(第二个查询缺少
stock\u exchange\u code
字段。实际上,此查询与第一个查询相同,代码质量比第一个查询差(重复)

我的问题是:对我来说,这两个查询应该有相同的结果。为什么它们有不同的结果

博士


Average或having子句在MySQL(MariaDB)中似乎不起作用。为什么开头的两条SQL语句返回的结果不相同?

使用聚合触发器将整个表分组为一行。也就是说,
having summed>avg(summed)
使其成为一行,而不是行集合的某个子集。因此,#1可能没有用处

在第二个查询中,将
avg(summated)
拼写为
SELECT…
将生成一个值,然后用于每一行

在这两个查询中,似乎都有一个额外级别的
SELECTs


您可以使用
EXPLAIN SELECT…
获取更多关于正在发生的事情的线索。

使用聚合触发器将整个表分组为一行。也就是说,
have summated>avg(summated)
使其成为一行,而不是行集合的某个子集。因此,#1可能没有用处

在第二个查询中,将
avg(summated)
拼写为
SELECT…
将生成一个值,然后用于每一行

在这两个查询中,似乎都有一个额外级别的
SELECTs


你可以使用
EXPLAIN SELECT…
来获取更多关于发生了什么的线索。

我同意没有分组依据是无效的:@SIDU:你想说,没有分组依据是无效的吗?这是没有意义的,因为count和所有其他aggreation函数都在没有分组依据的情况下工作。(“没有分组依据”->“一组,整张桌子”).对我来说,有克劳斯这样的限制是没有意义的。我怀疑你可以用更少的文字来表达你的困惑。我同意没有分组依据是无效的:@SIDU:你想说,没有分组依据是无效的吗?这对计数和所有其他聚集功能都没有意义在没有分组人的情况下工作。(“没有分组人”->“有一个分组,整张表”)。对我来说,有这样的限制是没有意义的。我怀疑你可以用更少的文本行来表达你的困惑。
SELECT
stock_exchange_code,
summed
FROM (
   SELECT
     STOCK_EXCHANGE_CODE,
     sum(SHARE_PRICE * SHARE_CNT) AS summed
   FROM LISTED_AT
   WHERE DATE_VALID = STR_TO_DATE('04-12-2015', '%d-%m-%Y')
   GROUP BY STOCK_EXCHANGE_CODE
 ) a
WHERE summed > (SELECT avg(a.summed)
            FROM (SELECT
                    sum(SHARE_PRICE * SHARE_CNT) AS summed
                  FROM LISTED_AT
                  WHERE DATE_VALID = STR_TO_DATE('04-12-2015', '%d-%m-%Y')
                  GROUP BY STOCK_EXCHANGE_CODE) a)
  SELECT
     STOCK_EXCHANGE_CODE,
     sum(SHARE_PRICE * SHARE_CNT) AS summed
   FROM LISTED_AT
   WHERE DATE_VALID = STR_TO_DATE('04-12-2015', '%d-%m-%Y')
   GROUP BY STOCK_EXCHANGE_CODE