從兩種SQL表連接寫法來了解過去
更新時(shí)間:2009年08月11日 11:08:37 作者:
如果想要優(yōu)雅而易于維護(hù)且不容易寫錯(cuò)的代碼,當(dāng)然用高標(biāo)準(zhǔn)的第二種方法。 如果必要考慮風(fēng)險(xiǎn)這個(gè)因素,比如涉及到多種平臺(tái)的遷移或者整合,你應(yīng)該用第一種,起碼在兩個(gè)表的情況下他還是比較安全的。
例如:一個(gè)二表連接的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
哪種寫法好呢?現(xiàn)在提倡用哪一種?
你喜歡用哪一種?
select * from a,b where a.id=b.id
select * from a inner join b on a.id=b.id
---這兩個(gè)哪個(gè)好?
其中11樓的回答最為深入。其實(shí)這個(gè)問題還是有一定的歷史原因的,不管你習(xí)慣什么樣的寫法只要知道來龍去脈就不會(huì)再被細(xì)枝末節(jié)來迷惑了。以下觀點(diǎn)為個(gè)人認(rèn)識(shí),如有偏差歡迎指正。
簡單的說,前者是ansi sql 86標(biāo)準(zhǔn)后者是ansi sql 92標(biāo)準(zhǔn)(*****) ,這個(gè)觀點(diǎn)最容易被人接受。
什么是ansi?美國國家標(biāo)準(zhǔn)局,iso的重要成員之一,1918年就有了。
什么是ansi sql?就是ansi注意到了sql的生產(chǎn)力,于是規(guī)范化了一下。
什么是sql?他是ibm發(fā)明的,oracle發(fā)揚(yáng)廣大的一門語言。
為什么是兩家公司?。
70年代初因?yàn)閕bm內(nèi)部各方利益斗爭激烈,導(dǎo)致某大牛的研究成果只能以論文方式發(fā)表。
70年代末某小公司把此技術(shù)用在商業(yè)領(lǐng)域就成了oracle,直到n年后ibm db2才出來。
所以,sql不是ansi 發(fā)明的,ansi 標(biāo)準(zhǔn)也不能通吃所有數(shù)據(jù)庫平臺(tái)。
比如下面這個(gè)是什么數(shù)據(jù)庫的語法?反正ansi 標(biāo)準(zhǔn)在他那里是報(bào)錯(cuò)的。
select * from (a inner join b on a.id=b.id) inner join c on a.id=c.id
那么在ansi86之前的數(shù)據(jù)庫有哪些?oracle和db2是肯定的了。另外還有一些當(dāng)時(shí)的小角色:Informix,dbase系列等。
而sybase的數(shù)據(jù)庫和SQLServer是86年之后出來的,而前面那個(gè)奇怪的join語法的access是90后的。
古老的sqlserver和oracle我都沒有用過,反正在02年用oracle8i時(shí)還不支持ansi 92的inner join,他是97年生的。一直到本世紀(jì)發(fā)布的oacle9i 才改了過來。用多了t-sql的人會(huì)問 left join咋辦,where a.id=b.id(+) 就可以了,人家沒那么笨的,t-sql以前還有*=這樣的表示。
那么這么看貌似ansi的規(guī)范力度不夠?其實(shí)不是,國際標(biāo)準(zhǔn)化也不可能一刀切,在ansi92 當(dāng)中定義了4個(gè)級(jí)別,n多條款。大意就是大家符合入門級(jí)就行了,其他高級(jí)別僅供參考,甚至iso根本不會(huì)驗(yàn)證其他級(jí)別..而諸如inner join和left join之類的都是過渡級(jí)的,囧。
所以我前面打了5個(gè)星星的那句話并不是完全正確的,正確的應(yīng)該是
前者符合ansi 86 標(biāo)準(zhǔn)和ansi 92入門級(jí)標(biāo)準(zhǔn),后者符合ansi92 過渡級(jí)標(biāo)準(zhǔn)。
不是oracle8i不符合ansi92,而是沒有符合ansi92的高級(jí)別規(guī)范,而完全實(shí)現(xiàn)高級(jí)別標(biāo)準(zhǔn)的數(shù)據(jù)庫系統(tǒng)是沒有的。
早在oracle7就已經(jīng)完全符合ansi92了,當(dāng)然是指入門級(jí),而且他就是ansi92 的模版范例。
--回到上面的話題,這兩個(gè)哪個(gè)好?
性能當(dāng)然完全一樣,區(qū)別只是習(xí)慣和喜好,但也因?yàn)闃?biāo)準(zhǔn)級(jí)別不同而具有不同的風(fēng)險(xiǎn)。
如果想要優(yōu)雅而易于維護(hù)且不容易寫錯(cuò)的代碼,當(dāng)然用高標(biāo)準(zhǔn)的第二種方法。
如果必要考慮風(fēng)險(xiǎn)這個(gè)因素,比如涉及到多種平臺(tái)的遷移或者整合,你應(yīng)該用第一種,起碼在兩個(gè)表的情況下他還是比較安全的。
----
順帶提一句,ansi標(biāo)準(zhǔn)一直在修訂:具體有多少版本就不列舉了,我們得到的好處自然是多多的,比如遞歸、對(duì)象、數(shù)組、xml等等在各主流數(shù)據(jù)庫的新版本中都陸續(xù)實(shí)現(xiàn)了
(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)在提倡用哪一種?
你喜歡用哪一種?
復(fù)制代碼 代碼如下:
select * from a,b where a.id=b.id
select * from a inner join b on a.id=b.id
---這兩個(gè)哪個(gè)好?
其中11樓的回答最為深入。其實(shí)這個(gè)問題還是有一定的歷史原因的,不管你習(xí)慣什么樣的寫法只要知道來龍去脈就不會(huì)再被細(xì)枝末節(jié)來迷惑了。以下觀點(diǎn)為個(gè)人認(rèn)識(shí),如有偏差歡迎指正。
簡單的說,前者是ansi sql 86標(biāo)準(zhǔn)后者是ansi sql 92標(biāo)準(zhǔn)(*****) ,這個(gè)觀點(diǎn)最容易被人接受。
什么是ansi?美國國家標(biāo)準(zhǔn)局,iso的重要成員之一,1918年就有了。
什么是ansi sql?就是ansi注意到了sql的生產(chǎn)力,于是規(guī)范化了一下。
什么是sql?他是ibm發(fā)明的,oracle發(fā)揚(yáng)廣大的一門語言。
為什么是兩家公司?。
70年代初因?yàn)閕bm內(nèi)部各方利益斗爭激烈,導(dǎo)致某大牛的研究成果只能以論文方式發(fā)表。
70年代末某小公司把此技術(shù)用在商業(yè)領(lǐng)域就成了oracle,直到n年后ibm db2才出來。
所以,sql不是ansi 發(fā)明的,ansi 標(biāo)準(zhǔn)也不能通吃所有數(shù)據(jù)庫平臺(tái)。
比如下面這個(gè)是什么數(shù)據(jù)庫的語法?反正ansi 標(biāo)準(zhǔn)在他那里是報(bào)錯(cuò)的。
select * from (a inner join b on a.id=b.id) inner join c on a.id=c.id
那么在ansi86之前的數(shù)據(jù)庫有哪些?oracle和db2是肯定的了。另外還有一些當(dāng)時(shí)的小角色:Informix,dbase系列等。
而sybase的數(shù)據(jù)庫和SQLServer是86年之后出來的,而前面那個(gè)奇怪的join語法的access是90后的。
古老的sqlserver和oracle我都沒有用過,反正在02年用oracle8i時(shí)還不支持ansi 92的inner join,他是97年生的。一直到本世紀(jì)發(fā)布的oacle9i 才改了過來。用多了t-sql的人會(huì)問 left join咋辦,where a.id=b.id(+) 就可以了,人家沒那么笨的,t-sql以前還有*=這樣的表示。
那么這么看貌似ansi的規(guī)范力度不夠?其實(shí)不是,國際標(biāo)準(zhǔn)化也不可能一刀切,在ansi92 當(dāng)中定義了4個(gè)級(jí)別,n多條款。大意就是大家符合入門級(jí)就行了,其他高級(jí)別僅供參考,甚至iso根本不會(huì)驗(yàn)證其他級(jí)別..而諸如inner join和left join之類的都是過渡級(jí)的,囧。
所以我前面打了5個(gè)星星的那句話并不是完全正確的,正確的應(yīng)該是
前者符合ansi 86 標(biāo)準(zhǔn)和ansi 92入門級(jí)標(biāo)準(zhǔn),后者符合ansi92 過渡級(jí)標(biāo)準(zhǔn)。
不是oracle8i不符合ansi92,而是沒有符合ansi92的高級(jí)別規(guī)范,而完全實(shí)現(xiàn)高級(jí)別標(biāo)準(zhǔn)的數(shù)據(jù)庫系統(tǒng)是沒有的。
早在oracle7就已經(jīng)完全符合ansi92了,當(dāng)然是指入門級(jí),而且他就是ansi92 的模版范例。
--回到上面的話題,這兩個(gè)哪個(gè)好?
性能當(dāng)然完全一樣,區(qū)別只是習(xí)慣和喜好,但也因?yàn)闃?biāo)準(zhǔn)級(jí)別不同而具有不同的風(fēng)險(xiǎn)。
如果想要優(yōu)雅而易于維護(hù)且不容易寫錯(cuò)的代碼,當(dāng)然用高標(biāo)準(zhǔn)的第二種方法。
如果必要考慮風(fēng)險(xiǎn)這個(gè)因素,比如涉及到多種平臺(tái)的遷移或者整合,你應(yīng)該用第一種,起碼在兩個(gè)表的情況下他還是比較安全的。
----
順帶提一句,ansi標(biāo)準(zhǔn)一直在修訂:具體有多少版本就不列舉了,我們得到的好處自然是多多的,比如遞歸、對(duì)象、數(shù)組、xml等等在各主流數(shù)據(jù)庫的新版本中都陸續(xù)實(shí)現(xiàn)了
相關(guān)文章
SQL Server存儲(chǔ)過程入門學(xué)習(xí)
存儲(chǔ)過程(Stored Procedure),是一組為了完成特定功能的SQL 語句,集經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫中,用戶通過指定存儲(chǔ)過程的名字并給出參數(shù),如果該存儲(chǔ)過程帶有參數(shù)來執(zhí)行2013-08-08解析SQL Server中datetimeset轉(zhuǎn)換datetime類型問題
這篇文章主要介紹了SQL Server中datetimeset轉(zhuǎn)換datetime類型問題淺析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12SQL Server誤區(qū)30日談 第29天 有關(guān)堆碎片的誤區(qū)
對(duì)堆建聚集索引再DROP在我看來是除了收縮數(shù)據(jù)庫之外最2的事了2013-01-01SQL SERVER 與ACCESS、EXCEL的數(shù)據(jù)轉(zhuǎn)換方法分享
熟悉SQL SERVER 2000的數(shù)據(jù)庫管理員都知道,其DTS可以進(jìn)行數(shù)據(jù)的導(dǎo)入導(dǎo)出,其實(shí),我們也可以使用Transact-SQL語句進(jìn)行導(dǎo)入導(dǎo)出操作2012-02-02SqlServer中用exec處理sql字符串中含有變量的小例子
這篇文章主要介紹了用exec處理sql字符串中含有變量的小例子,有需要的朋友可以參考一下2013-12-12