OneCoder翻譯-MySQL 的不良用法 Group By

  OneCoder 最近打算堅持每週左右至少翻譯一篇技術文章,不管是從學習技術和學習英語的角度,對自己都會是一個提高。

水平有限,如果您覺得翻譯太過粗糙,甚至錯誤,還望不吝指出, OneCoder 必將虛心接受,努力學習改進。
MySQL是一個“容錯性”很強的數據庫。這種“容錯性”體現在既能作爲生產環境中的關係型數據庫,又深受那些並不真正回寫SQL的各色hacker歡迎。也正式因爲他們不是真正會寫SQL,所以他們選擇了MySQL,因爲MySQL容錯性高。這種容錯性,就跟在他們最喜歡的PHP語言中的“magic quotes”特性一樣。MySQL可以允許你寫“錯誤”的SQL語言,仍可以運行它。我所說的“錯誤的”SQL是這樣的:
 
  1. SELECT o.custid, c.nameMAX(o.payment) 
  2.   FROM orders AS o, customers AS c 
  3.   WHERE o.custid = c.custid 
  4.   GROUP BY o.custid; 
 
這條語句是出在MySQL的官方文檔:
http://dev.mysql.com/doc/refman/5.6/en/group-by-hidden-columns.html(OneCoder注:應該看看這個文檔的介紹,能更清楚的明白該文的作者想表達的意思。)
 
那麼,這條語句的含義是怎樣呢。c.name這個映射的返回結果是什麼?最大的(c.name)?任意的(c.name)?還是第一個(c.name)?還是NULL?還是42?根據文檔,任意的c.name(ANY(c.name)),應該是最合理的可能。這種特殊的語法大概對那些少數的真正瞭解這種語法什麼時候是有用的人是非常的智能的一種方式。也就是當他們確切的知道,o.custid和c.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數據庫:廢棄這個特性。
 
感謝支持老婆小站:8無聊(http://8wuliao.net)
OneCoder 原創,轉載請務必註明作者和原始出處。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章