深入sql多表差異化聯(lián)合查詢的問題詳解
本章簡略講述本人在實例開發(fā)中遇到的多表查詢的問題
其中主要講述
select A.*,B.*,C.* from A,B,C
和
select A.*,B.*,C.* from 表A inner join 表B on A.id=B.id inner join 表C on A.code=C.code
的區(qū)別
最近遇到一個這樣的項目需求——要求頁面集合顯示三個關(guān)聯(lián)表的信息。
由于實際項目里出現(xiàn)的字段比較多,現(xiàn)在簡化說明如下:
table A 含有字段 UserName,CardCode,ItamCode
table B 含有字段 CardCode,CardName
table C 含有字段 ItamCode,ItamName
其中界面要在一個數(shù)據(jù)集里同時出現(xiàn)UserName,CardName,ItamName
話說雖然學過SQL 內(nèi)聯(lián),外聯(lián)的問題,但是以前的項目基本出現(xiàn)的都是兩個表的關(guān)聯(lián)實現(xiàn),現(xiàn)在是第一次用到超過兩個表的關(guān)聯(lián)實現(xiàn)問題。在百度找了一下資料,才發(fā)現(xiàn)原來基本原理是一樣的。哈,本人去年才入職,經(jīng)驗不足,大神們,請別見笑哈!
呃,如果讀者暫時還不熟悉SQL基本內(nèi)聯(lián),外聯(lián)的相關(guān)知識,請自覺找度娘面壁去哈,筆者在這里不熬述了。長話短說,現(xiàn)在進入正題……
發(fā)現(xiàn)要實現(xiàn)上面的功能有兩種方法,分別是
select A.UserName,B.CardName,C.ItamName from A,B,C
和
select A.UserName,B.CardName,C.ItamName from 表A inner join 表B on A.CardCode=B.CardCode inner join 表C on A.ItamCode=C.ItamCode
(如果字段是差異化的話,可以略寫表名)
就上面的語法來說,其實兩種實現(xiàn)方法的效果是一樣的,但如果真要較真細說優(yōu)劣的話,還是第二種實現(xiàn)方法比較實用的。
用inner join(全外聯(lián))的寫法, 不僅可以按照實際需求自由轉(zhuǎn)化left join(左外聯(lián))和right join(右外聯(lián)),而且注明了結(jié)合的順序, 特別是支持了SQL文優(yōu)化的方便。
還有一個就是說當我某個字段可以為null的時候,第一種查詢方法得出的值其實是不完全的。比如說我上面的例子中當table C 的ItanName 并非必填的時候,只能通過左外連接(left join)來實現(xiàn)我們需要的效果。
有興趣的同學可以自己操作一下,驗證下兩種方法的不同。
相關(guān)文章
Mysql數(shù)據(jù)庫中的redo?log?寫入策略和binlog?寫入策略
這篇文章主要介紹了Mysql?redo?log?寫入策略和binlog?寫入策略,通過本文學習可以了解redo?log的寫入策略是由InnoDB提供了innodb_flush_log_at_trx_commit參數(shù),binlog的寫入策略,write?和fsync的時機,是由參數(shù)sync_binlog控制的,需要的朋友可以參考下2022-04-04