1. 程式人生 > >MySQL 的不良用法 Group By

MySQL 的不良用法 Group By

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))

,應該是最合理的可能。這種特殊的語法大概對那些少數的真正瞭解這種語法什麼時候是有用的人是非常的智慧的一種方式。也就是當他們確切的知道,o.custidc.name需要是1對1的關係是,他們可以省略掉一些沒有必要的語句,例如Max(c.name)或者在Group by 子句中加上c.name。(是的,節省了8個字元。)

但是,對大部分MySQL的初學者來說,會對此感到迷惑:

  • 首先,他們會迷惑於並沒有得到預期的c.name值。
  • 其次,當他們最終將要遷移到另一個數據庫的時候,會再次遇到困境。會報一些有趣的語法錯誤,如:ORA-00979 not a GROUP BY expression

所以:

  • MySQL的使用者,停止使用這個特性。他直接帶來痛苦和折磨,儘管你知道他是如何工作的。SQL語句中的GROUP BY不是被設計用於這種工作方式的。
  • MySQL資料庫:廢棄這個特性。