從兩種SQL表銜接寫法來懂得曩昔。本站提示廣大學習愛好者:(從兩種SQL表銜接寫法來懂得曩昔)文章只能為提供參考,不一定能成為您想要的結果。以下是從兩種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
哪一種寫法好呢?如今倡導用哪種?
你愛好用哪種?
select * from a,b where a.id=b.id
select * from a inner join b on a.id=b.id
---這兩個哪一個好?
個中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等等在各主流數據庫的新版本中都陸續完成了