從兩種SQL表連接寫法來了解過去
發(fā)布日期:2022-01-31 17:46 | 文章來源:站長之家
(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 哪種寫法好呢?現(xiàn)在提倡用哪一種?
你喜歡用哪一種?
復制代碼 代碼如下:
select * from a,b where a.id=b.id
select * from a inner join b on a.id=b.id
什么是ansi sql?就是ansi注意到了sql的生產(chǎn)力,于是規(guī)范化了一下。 什么是sql?他是ibm發(fā)明的,oracle發(fā)揚廣大的一門語言。 為什么是兩家公司?。
70年代初因為ibm內(nèi)部各方利益斗爭激烈,導致某大牛的研究成果只能以論文方式發(fā)表。
70年代末某小公司把此技術用在商業(yè)領域就成了oracle,直到n年后ibm db2才出來。 所以,sql不是ansi 發(fā)明的,ansi 標準也不能通吃所有數(shù)據(jù)庫平臺。 比如下面這個是什么數(shù)據(jù)庫的語法?反正ansi 標準在他那里是報錯的。
select * from (a inner join b on a.id=b.id) inner join c on a.id=c.id 那么在ansi86之前的數(shù)據(jù)庫有哪些?oracle和db2是肯定的了。另外還有一些當時的小角色:Informix,dbase系列等。 而sybase的數(shù)據(jù)庫和SQLServer是86年之后出來的,而前面那個奇怪的join語法的access是90后的。 古老的sqlserver和oracle我都沒有用過,反正在02年用oracle8i時還不支持ansi 92的inner join,他是97年生的。一直到本世紀發(fā)布的oacle9i 才改了過來。用多了t-sql的人會問 left join咋辦,where a.id=b.id(+) 就可以了,人家沒那么笨的,t-sql以前還有*=這樣的表示。
那么這么看貌似ansi的規(guī)范力度不夠?其實不是,國際標準化也不可能一刀切,在ansi92 當中定義了4個級別,n多條款。大意就是大家符合入門級就行了,其他高級別僅供參考,甚至iso根本不會驗證其他級別..而諸如inner join和left join之類的都是過渡級的,囧。
所以我前面打了5個星星的那句話并不是完全正確的,正確的應該是 前者符合ansi 86 標準和ansi 92入門級標準,后者符合ansi92 過渡級標準。 不是oracle8i不符合ansi92,而是沒有符合ansi92的高級別規(guī)范,而完全實現(xiàn)高級別標準的數(shù)據(jù)庫系統(tǒng)是沒有的。 早在oracle7就已經(jīng)完全符合ansi92了,當然是指入門級,而且他就是ansi92 的模版范例。 --回到上面的話題,這兩個哪個好?
性能當然完全一樣,區(qū)別只是習慣和喜好,但也因為標準級別不同而具有不同的風險。 如果想要優(yōu)雅而易于維護且不容易寫錯的代碼,當然用高標準的第二種方法。
如果必要考慮風險這個因素,比如涉及到多種平臺的遷移或者整合,你應該用第一種,起碼在兩個表的情況下他還是比較安全的。 ----
順帶提一句,ansi標準一直在修訂:具體有多少版本就不列舉了,我們得到的好處自然是多多的,比如遞歸、對象、數(shù)組、xml等等在各主流數(shù)據(jù)庫的新版本中都陸續(xù)實現(xiàn)了
版權聲明:本站文章來源標注為YINGSOO的內(nèi)容版權均為本站所有,歡迎引用、轉載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權,請聯(lián)系alex-e#qq.com處理。
相關文章