我正在使用 MySQL 并且我有以下表員工:table。
我有一個練習,我必須選擇最年長的人。我知道正確的方式做到這一點是一個子查詢:SELECT name, dob FROM employees WHERE dob = (SELECT MIN(dob) FROM employees)。
但是,我做到了,像這樣:SELECT name, dob FROM employees HAVING dob = MIN(dob)。現在這將回傳一個空集,但不會引發任何錯誤。那么它究竟有什么作用呢?我讀過 MySQL 允許在 HAVING 子句中參考 SELECT 子句中的列,而沒有任何 GROUP BY 子句。但是為什么它回傳一個空集?
uj5u.com熱心網友回復:
當您在 select 列或 having 子句中使用 MAX(或其他聚合函式)時,會導致隱式GROUP BY ()(即,所有行都組合到一個結果行中)。
并且在分組時(無論是所有行還是具有特定的GROUP BY),如果您在聚合函式(例如您的dob =)之外指定一列,該列不是被聚合的事物之一或在功能上依賴于它的事物(例如,其他一些當您按該表的主鍵分組時,表中的列),將發生以下兩種情況之一:
如果您啟用了 ONLY_FULL_GROUP_BY sql_mode(這是較新版本中的默認設定),您將收到錯誤訊息:
在沒有 GROUP BY 的聚合查詢中,運算式 ... 包含非聚合列 '...';這與 sql_mode=only_full_group_by 不兼容
如果您尚未啟用 ONLY_FULL_GROUP_BY,則將使用來自任意一個分組行的值。因此,您的dob = MIN(dob)意愿可能是真的(如果所有行都具有相同的 dob,那肯定是真的),但是您不能依賴它做任何有用的事情,應該避免這樣做。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/394506.html
上一篇:用php更新多個復選框
下一篇:異步函式回傳承諾
