MySQL非標準SQL寫法問題記錄

2021-09-02 13:56:54 字數 1199 閱讀 2905

如下sql:

上述執行結果總數是:2525行

但如果去掉最後面的:[color=blue]group by t.message_id,t.product_id[/color] 後執行結果卻只有一條記錄,這顯然不符合正常邏輯(正常情況下查詢結果是不低於2525行的),

造成此問題原因是上述sql是非標準sql,標準sql要求中要求 select後的查詢字段必須和group by後的字段是相同的,即不能多也不能少!

備註:1.在group by 裡的列,可以直接出現在結果列(也可以少)。

2.不在group by 裡的列,在經過聚合函式計算後可以出現在結果列(也可以多)。

ps:oracle中是不支援此非標準寫法的。

附加:根據sql92國際標準:

if t is a grouped table, then each in each that references a column of t shall reference a grouping

column or be specified within a .

簡單的說,如果乙個查詢用了 group by,那麼 select 可選擇的 列 有兩個可能 1. group by

中指定的列(或者其計算值),2. 聚合函式計算後的其它(非group by指定的)列。

而 mysql 自作聰明(關閉only_full_group_by),不符合國際標準,容忍了我們犯錯,這也是引起我們自己混亂的原因。

舉個例子:

gender age

男 11

女 22

男 33

這語句你們指望得到什麼結果?

select gender,age from user group by gender

是:男 11

女 22

還是:女 22

男 33

這本來就不是個正確的sql語句!

正確的語句應該改為這樣:

select gender,min(age) from user group by gender

也就是將非group by的列放入某個聚合函式裡。

建議以後寫語句嚴格要求自己,不要讓mysql將我們帶入歧途!

可能的話將only_full_group_by開啟。

[url=查詢原理及其慢查詢優化案例[/url]

非標準程式設計能力

一切的一切都基於我的個人經驗,歡迎拍磚和補充。想從coder稱為programmer嗎?想讓工資成幾何數的增長嗎?想。以下題目可以不完全地測試您系統程式設計功力,如果給了您丁點啟發或者幫助都是我的榮幸。一。windows和 nix作業系統的區別在 tips 答案不包括圖形使用者介面。二。什麼是記憶體...

處理非標準數字輸入問題

正式的acm,對於輸入一般都是比較標準的,不需要參賽人員考慮輸入的特殊情況,但也有一些比賽,對於輸入沒有嚴格控制,比如下面這個 輸入n個數字,可能以空格分隔,也可能以逗號分隔,不說明輸入的個數,也不說明輸入以什麼方式結束 換行還是eof 這時,對於輸入就比較坑爹,這裡寫了乙個簡單的輸入處理函式。如下...

非標準路徑的 CMAKE ROOT

由於系統本身的 cmake 版本太低,需要更新乙個。沒有管理員全限,只能在 home下安裝軟體。修改 bashrc,增加 export path home local bin path export ld library path home local lib ld library path 然後編...