三張表關(guān)聯(lián)查詢
在蘄春等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需規(guī)劃網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),營銷型網(wǎng)站建設(shè),外貿(mào)營銷網(wǎng)站建設(shè),蘄春網(wǎng)站建設(shè)費(fèi)用合理。
使用場(chǎng)景:A\B\C 三張表,現(xiàn)在要查詢并展示A表和C表中的某些字段,但是A、C兩表沒有相同字段,無法關(guān)聯(lián),此時(shí)有B表恰好有兩個(gè)字段,一個(gè)字段和A表一個(gè)字段相同,一個(gè)字段和C表一個(gè)字段相同,我們稱B表為“中間表”,因此通過B表把A、C表關(guān)聯(lián)起來
SELECT A1,A2,C1,C2 --展示A表中的A1\A2字段和C表中的C1\C2
FROM B --中間表
INNER JOIN A ON A.A1 = B.B1 --A表中的與B表中相同的字段
INNER JOIN C ON C.C1 = B.B1 --C表中的與B表中相同的字段
where xxxxx ---條件你自己按照需求來加,沒有條件就不寫where了
select?*?--*換成你要查的前綴+.+字段名(類似這個(gè)a.id,就代表storespeciffication?表的ID字段)
from?storespeciffication?a,storespecifficationvalue?b,storeinfo?c?where?a.id=b.storeinfoid?and?b.storeinfoid=c.id
SQL使用(一)——聯(lián)合查詢
1.聯(lián)合查詢分類
內(nèi)連接(inner Join 或 Join)
外連接(outer Join)
左外連接(left outer Join 或 left Join)
右外連接(right outer Join 或 right Join)
全外連接(full outer Join 或 full Join)
交叉連接 (cross Join)
結(jié)果集鏈接 (union 和 union all)
2.聯(lián)合查詢介紹
相關(guān)數(shù)據(jù)表如下:
A表
B表
C表
2.1內(nèi)連接(Inner Join)
內(nèi)連接:僅顯示兩個(gè)表中匹配行,即兩表中都有才顯示。
SQL如下:
SELECT? A.id? AS? AID,? ? A.content? AS? AContent,? ? B.id? AS? BID,? ? B.content? AS? BContent? FROM? A? INNERJOIN? B? ON? (A.id = B.id);
1
2
3
4
5
6
7
8
查詢結(jié)果:
由查詢結(jié)果可以看出,內(nèi)連接根據(jù)連接條件(A.id=B.id)查詢出了A、B兩表中都存在的數(shù)據(jù)信息。2個(gè)表的聯(lián)合查詢結(jié)果如此,那么3個(gè)表甚至更多表聯(lián)合查詢的結(jié)果呢?
A、B、C三表聯(lián)合內(nèi)查詢SQL
SELECTA.idASAID,? ? A.contentASAContent,? ? B.idASBID,? ? B.contentASBContent,? ? C.idASCID,? ? C.contentASCContentFROMAINNERJOINBON(A.id = B.id)INNERJOINCON(A.id = C.id)
1
2
3
4
5
6
7
8
9
10
11
查詢結(jié)果:
???怎么多了一行數(shù)據(jù)?不用驚訝,其實(shí)C表中有2個(gè)id為1的記錄,然而我們?cè)趺蠢斫獾玫降牟樵兘Y(jié)果呢?
可以把A、B兩表的查詢結(jié)果作為T表(中間結(jié)果表),然后T表內(nèi)連接C表,連接條件為T.A.id=C.id。
簡(jiǎn)單來說n(n=2)都可以看做兩張表的聯(lián)合查詢,后面的小節(jié)將只介紹兩個(gè)表的聯(lián)合查詢。
2.2外連接(Outer Join)
2.2.1左外連接(Left outer Join)
左外連接:左表有就顯示,不論右表。
SQL:
SELECTA.idASAID,? ? A.contentASAContent,? ? B.idASBID,? ? B.contentASBContentFROMALEFTJOINBON(A.id = B.id);
1
2
3
4
5
6
7
8
查詢結(jié)果:
左連接并不是把B表左連接到A表上,而是把A表作為基準(zhǔn)表。由查詢結(jié)果可以看出,A、B兩表左連接,只要A中有結(jié)果,無論B表中有無結(jié)果,都會(huì)被查詢出來。
2.2.2右外連接(Right outer Join)
右外連接:右表有就顯示,不論左表。
SQL:
SELECTA.idASAID,? ? A.contentASAContent,? ? B.idASBID,? ? B.contentASBContentFROMARIGHTJOINBON(A.id = B.id);
1
2
3
4
5
6
7
8
9
查詢結(jié)果:
右連接和左連接類似,只是把B表(連接的表)作為基準(zhǔn)表。由查詢結(jié)果可以看出,無論A表是否存在其他數(shù)據(jù),只要B表數(shù)據(jù)存在就會(huì)被查詢出來。
2.2.3全外連接(Full outer Join)
全外連接:左表/右表,有一個(gè)有就顯示。
SQL:
SELECTA.idASAID,? ? A.contentASAContent,? ? B.idASBID,? ? B.contentASBContentFROMAFULLOUTERJOINBON(A.id = B.id);
1
2
3
4
5
6
7
8
9
查詢結(jié)果:
全外連接查詢就字面意思也不難看出是查詢出兩表(A、B)中的所有記錄信息。
注:MySQL中不支持全外連接(但是可以u(píng)nion來實(shí)現(xiàn),后面會(huì)介紹)。
2.2交叉連接(Cross Join)
SQL:
SELECTA.idASAID,? ? A.contentASAContent,? ? B.idASBID,? ? B.contentASBContentFROMACROSSJOINB;
1
2
3
4
5
6
7
8
9
查詢結(jié)果:
由結(jié)果可以看出,交叉連接是對(duì)A、B量表進(jìn)行笛卡爾積的結(jié)果查詢出來。即A的每條記錄都有和B中所有記錄相對(duì)應(yīng)的信息。
2.3 SQL Union
SQL Union用于將多個(gè)select結(jié)果集進(jìn)行合并。值得注意的是,UNION 內(nèi)部的 SELECT 語句必須擁有相同數(shù)量的列。列也必須擁有相似的數(shù)據(jù)類型。同時(shí),每條 SELECT 語句中的列的順序必須相同。
SQL:
SELECT*FROMAUNIONSELECT*fromB;
1
查詢結(jié)果:
Union是把2個(gè)Select結(jié)果集進(jìn)行合并,由查詢結(jié)果也不難看出,A、B兩表的結(jié)果數(shù)據(jù)進(jìn)行了合并,并且都被查詢出來了。
如果2個(gè)Select結(jié)果集中存在相同的結(jié)果,用Union則會(huì)把相同的記錄進(jìn)行合并,查詢結(jié)果中僅僅會(huì)顯示一條。那么如果想都顯示出來,把Union換成Union All 即可。
Union實(shí)現(xiàn)Full outer Join:
1.首先獲取A、B表中id的不同組合。
SQL:
CREATEVIEWvasSELECTA.idfromAUNIONSELECTB.idfromB;
1
視圖內(nèi)存如下:
2.以視圖V為基本表,Left Join A、B表即可。
SQL:
SELECTA.id,? ? A.content,? ? B.id,? ? B.contentFROMvLEFTJOINAON(A.id = v.id)LEFTJOINBON(B.id = v.id);
1
2
3
4
5
6
7
8
9
查詢結(jié)果如下:
假設(shè)學(xué)生表叫student,課程表叫class,選課表叫choose
1.三層嵌套的問題
select student.name from student where student.id IN
(select choose.sid from choose where choose.cid NOT IN
(select class.id from class where class.teacher='李明'))
2.一個(gè)內(nèi)連接,一個(gè)嵌套
select student.name,avg(choose.score) from
student inner join choose on student.id=choose.sid
where student.id IN
(select choose.sid from choose
where choose.score'60'
group by choose.sid
having count(choose.sid)=2)
gruop by student.id
3.一個(gè)聯(lián)合查詢,一個(gè)嵌套查詢
select student.name from student
where student.id IN
(select c1.sid from choose c1 where choose.cid='1'
union
select c2.sid from choose c2 where choose.cid='2'
on c1.sid=c2.sid
)
4.其實(shí)就是自連接查詢和行列交換的問題:
select student.id,
(case choose.id when '1' then choose.score end) as 1號(hào)課成績(jī),
(case choose.id when '2' then choose.score end) as 2號(hào)課成績(jī),
from student inner join choose on student.id=choose.sid sc1,
student inner join choose on student.id=choose.sid sc2
where sc1.id='1'
and sc2.id='2'
and sc1.scoresc2.score