MySQL 的不良用法 Group By
阿新 • • 發佈:2018-12-23
OneCoder最近打算堅持每週左右至少翻譯一篇技術文章,不管是從學習技術和學習英語的角度,對自己都會是一個提高。水平有限,如果您覺得翻譯太過粗糙,甚至錯誤,還望不吝指出,OneCoder必將虛心接受,努力學習改進。
MySQL是一個”容錯性”很強的資料庫。這種”容錯性”體現在既能作為生產環境中的關係型資料庫,又深受那些並不真正回寫SQL的各色hacker歡迎。也正式因為他們不是真正會寫SQL,所以他們選擇了MySQL,因為MySQL容錯性高。這種容錯性,就跟在他們最喜歡的PHP語言中的”magic quotes”特性一樣。MySQL可以允許你寫”錯誤”的SQL語言,仍可以執行它。我所說的”錯誤的”SQL
SELECT o.custid, c.name, MAX(o.payment)
FROM orders AS o, customers AS c
WHERE o.custid = c.custid
GROUP BY o.custid;
這條語句是出在MySQL的官方文件:
(OneCoder 注:應該看看這個文件的介紹,能更清楚的明白該文的作者想表達的意思。)
那麼,這條語句的含義是怎樣呢。c.name這個對映的返回結果是什麼?最大的(c.name)?任意的(c.name)?還是第一個(c.name)?還是NULL?還是42?根據文件,任意的c.name(ANY(c.name))
但是,對大部分MySQL的初學者來說,會對此感到迷惑:
- 首先,他們會迷惑於並沒有得到預期的c.name值。
- 其次,當他們最終將要遷移到另一個數據庫的時候,會再次遇到困境。會報一些有趣的語法錯誤,如:ORA-00979 not a GROUP BY expression
所以:
- MySQL的使用者,停止使用這個特性。他直接帶來痛苦和折磨,儘管你知道他是如何工作的。SQL語句中的GROUP BY不是被設計用於這種工作方式的。
- MySQL資料庫:廢棄這個特性。