前言
之所以去糾那么細節的問題,是因為之前有過一個這樣的場景:
有個同學,給了一條數據庫的語句給我,問,為啥這樣子的語句在oracle語句下執行不了。
select * from xx where xxx is not null group by yy;
拿到這條語句的第一時間,其實,我也並沒有看出是什么錯。仔細一想之后才想起,在基礎的SQL中包含該group by的select語句,select語句部分是有限制的,一般是聚合函數和group by 的字段。隨后,我就告訴他,這條語句本身是有錯的。
然而,我同學卻反駁說,這條語句他在其他數據庫中是能運行的。然后,就有了這篇博客
細說
為了詢證,我詢問了同學他說能運行的數據庫是什么數據庫。結果同學說是mysql。
如圖所示,相同類型的語句,在oracle和mysql執行,一個是可以正常運行的,而在oracle上,卻是沒能通過語句的校驗。為啥呢?
回過頭看看,現在市場上的關系型數據庫可謂不少,其實他們都在SQL語句的解析上,都遵循着SQL國際標准,只是各自遵循的嚴格程度不同而已,同時,各個數據庫也在SQL標准上擴展開了,有了自己支持的特色的數據庫語句,如mysql的limit。也就是這樣,才有了上述情況。SQL標准中,其實在包含group by 的 select 語句能查詢的數據是有限制的。Oracle比較嚴格的遵守了這一限制,而mysql 則並沒有,這樣才使得使用慣了mysql的朋友在剛開始的時候有這樣的錯覺,覺得明明正確的語句為啥就是執行不了。
思考
在標准這方面,要論對錯,其實是沒必要的。很多時候,標准制定出來,只是一種美好的期望而已。然而,作為技術,其實應該的更多的是回歸本質,更多的了解原理,就不會因為某個工具並沒嚴格要求的東西,養成不良的習慣。
此博文同步更新於 http://blog.e65535.com/2016/05/26/mysql-oracle-groupby/