標籤:
前言
之所以去糾那麼細節的問題,是因為之前有過一個這樣的情境:
有個同學,給了一條資料庫的語句給我,問,為啥這樣子的語句在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/
mysql與oracle在groupby語句上的細節差異