簡體   English   中英

在SQL中使用聚合函數時,是否會選擇關聯的列?

[英]When using an aggregate function in SQL, will the associated columns be selected?

我有以下查詢

SELECT
  day,
  category_id,
  name,
  qval
  MIN(CONCAT(category_id, qval))
FROM facts
WHERE
  day = CURDATE()
GROUP BY
  category_id

選擇的name將始終是與所標識的MIN記錄相關聯的name嗎?

絕對不。 沒有理由期望情況會如此。 這是您的查詢:

SELECT day, category_id, name, qval
       MIN(CONCAT(category_id, qval))
FROM facts
WHERE day = CURDATE()
GROUP BY category_id;

盡管沒有這樣標識,但該語法是MySQL。 您使用的是MySQL擴展,因為select中有一些列不是聚合函數的參數,也不在group by 這些值來自任意行。 以下是有關擴展名使用的一些相關文檔

MySQL擴展了GROUP BY的使用,以便選擇列表可以引用未在GROUP BY子句中命名的非聚合列。 這意味着前面的查詢在MySQL中是合法的。 您可以使用此功能來避免不必要的列排序和分組,從而獲得更好的性能。 但是,這主要在每個未聚合列中未在GROUP BY中命名的所有值對於每個組都相同時才有用。 服務器可以從每個組中自由選擇任何值,因此,除非它們相同,否則選擇的值是不確定的。

我相信此問題已在MySQL 5.7中解決,因為5.7檢測到功能依賴性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM