兩表串連的SQL語句

來源:互聯網
上載者:User

兩表串連的SQL語句:這兩種寫法哪種好?現在提倡用哪一種呢?

例如:一個二表串連的SQL,有兩種寫法:
(1)select A.c1,A.c2,B.c1,B.c2
from table1 A,table2 B
where A.id=B.id

(2)select A.c1,A.c2,B.c1,B.c2
from table1 A join table2 B
on A.id=B.id

哪種寫法好呢?現在提倡用哪一種?
你喜歡用哪一種?

我習慣用(1)

---這兩個哪個好?

其中11樓的回答最為深入。其實這個問題還是有一定的曆史原因的,不管你習慣什麼樣的寫法只要知道來龍去脈就不會再被細枝末節來迷惑了。以下觀點為個人認識,如有偏差歡迎指正。

簡單的說,前者是ansi sql 86標準後者是ansi sql 92標準(*****) ,這個觀點最容易被人接受。

什麼是ansi?美國國家標準局,iso的重要成員之一,1918年就有了。
什麼是ansi sql?就是ansi注意到了sql的生產力,於是正常化了一下。

什麼是sql?他是ibm發明的,oracle發揚廣大的一門語言。

為什麼是兩家公司?。
70年代初因為ibm內部各方利益鬥爭激烈,導致某大牛的研究成果只能以論文方式發表。
70年代末某小公司把此技術用在商業領域就成了oracle,直到n年後ibm db2才出來。

所以,sql不是ansi 發明的,ansi 標準也不能通吃所有資料庫平台。

比如下面這個是什麼資料庫的文法?反正ansi 標準在他那裡是報錯的。
select * from  (a inner join b on a.id=b.id) inner join c on a.id=c.id

那麼在ansi86之前的資料庫有哪些?oracle和db2是肯定的了。另外還有一些當時的小角色:Informix,dbase系列等。

而sybase的資料庫和SQLServer是86年之後出來的,而前面那個奇怪的join文法的access是90後的。

古老的sqlserver和oracle我都沒有用過,反正在02年用oracle8i時還不支援ansi 92的inner join,他是97年生的。一直到本世紀發布的oacle9i 才改了過來。用多了t-sql的人會問 left join咋辦,where a.id=b.id(+) 就可以了,人家沒那麼笨的,t-sql以前還有*=這樣的表示。


那麼這麼看貌似ansi的規範力度不夠?其實不是,國際標準化也不可能一刀切,在ansi92 當中定義了4個層級,n多條款。大意就是大家符合入門級就行了,其他進階別僅供參考,甚至iso根本不會驗證其他層級..而諸如inner join和left join之類的都是過渡級的,囧。


所以我前面打了5個星星的那句話並不是完全正確的,正確的應該是

前者符合ansi 86 標準和ansi 92入門級標準,後者符合ansi92 過渡級標準。

不是oracle8i不符合ansi92,而是沒有符合ansi92的進階別規範,而完全實現進階別標準的資料庫系統是沒有的。

早在oracle7就已經完全符合ansi92了,當然是指入門級,而且他就是ansi92 的模版範例。

--回到上面的話題,這兩個哪個好?
效能當然完全一樣,區別只是習慣和喜好,但也因為標準層級不同而具有不同的風險。

如果想要優雅而易於維護且不容易寫錯的代碼,當然用高標準的第二種方法。
如果必要考慮風險這個因素,比如涉及到多種平台的遷移或者整合,你應該用第一種,起碼在兩個表的情況下他還是比較安全的。

----
順帶提一句,ansi標準一直在修訂:具體有多少版本就不列舉了,我們得到的好處自然是多多的,比如遞迴、對象、數組、xml等等在各主流資料庫的新版本中都陸續實現了



相關文章

Alibaba Cloud 10 Year Anniversary

With You, We are Shaping a Digital World, 2009-2019

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。