關(guān)聯(lián)兩個(gè)表的方式包含內(nèi)連接,外連接(左外連接,右外連接),交叉連接。
按需定制可以根據(jù)自己的需求進(jìn)行定制,網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)構(gòu)思過程中功能建設(shè)理應(yīng)排到主要部位公司網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)的運(yùn)用實(shí)際效果公司網(wǎng)站制作網(wǎng)站建立與制做的實(shí)際意義
參考語句:
內(nèi)連接
select * from student a
inner join stuMarks b
on a.stuid=b.stuid
外連接
select * from student a
inner join stuMarks b
on a.stuid=b.stuid
交叉連接
select * from student a
crossjoin stuMarks b
JOIN 分為內(nèi)連接,外連接(左外連接,右外連接,全外連接)
內(nèi)連接: SELECT A.* FROM A INNER JOIN B ON A.ID=B.ID
左外連接: SELECT A.* FROM A LEFT JOIN B ON A.ID = B.ID
右外連接: SELECT A.* FROM A RIGHT JOIN B ON A.ID = B.ID
全外連接: SELECT A.*, B.* FROM A FULL OUTER JOIN B ON A.ID = B.ID
具體可參考:
SQL的四種連接-左外連接、右外連接、內(nèi)連接、全連接
今天在看一個(gè)遺留系統(tǒng)的數(shù)據(jù)表的時(shí)候發(fā)現(xiàn)平時(shí)查找的視圖是FULL OUT JOIN的,導(dǎo)致平時(shí)的數(shù)據(jù)記錄要進(jìn)行一些限制性處理,其實(shí)也可以設(shè)置視圖各表為右外連接并在視圖上設(shè)置各列的排序和篩選條件就可以達(dá)到效果。
聯(lián)接條件可在FROM或WHERE子句中指定,建議在FROM子句中指定聯(lián)接條件。WHERE和HAVING子句也可以包含搜索條件,以進(jìn)一步篩選聯(lián)接條件所選的行。
聯(lián)接可分為以下幾類:
1、內(nèi)聯(lián)接(典型的聯(lián)接運(yùn)算,使用像 = 或 之類的比較運(yùn)算符)。包括相等聯(lián)接和自然聯(lián)接。
內(nèi)聯(lián)接使用比較運(yùn)算符根據(jù)每個(gè)表共有的列的值匹配兩個(gè)表中的行。例如,檢索 students和courses表中學(xué)生標(biāo)識(shí)號(hào)相同的所有行。
2、外聯(lián)接。外聯(lián)接可以是左向外聯(lián)接、右向外聯(lián)接或完整外部聯(lián)接。
在 FROM子句中指定外聯(lián)接時(shí),可以由下列幾組關(guān)鍵字中的一組指定:
1)LEFT JOIN或LEFT OUTER JOIN
左向外聯(lián)接的結(jié)果集包括 LEFT OUTER子句中指定的左表的所有行,而不僅僅是聯(lián)接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關(guān)聯(lián)的結(jié)果集行中右表的所有選擇列表列均為空值。
2)RIGHT JOIN 或 RIGHT OUTER JOIN
右向外聯(lián)接是左向外聯(lián)接的反向聯(lián)接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。
3)FULL JOIN 或 FULL OUTER JOIN
完整外部聯(lián)接返回左表和右表中的所有行。當(dāng)某行在另一個(gè)表中沒有匹配行時(shí),則另一個(gè)表的選擇列表列包含空值。如果表之間有匹配行,則整個(gè)結(jié)果集行包含基表的數(shù)據(jù)值。
3、交叉聯(lián)接
交叉聯(lián)接返回左表中的所有行,左表中的每一行與右表中的所有行組合。交叉聯(lián)接也稱作笛卡爾積。
FROM 子句中的表或視圖可通過內(nèi)聯(lián)接或完整外部聯(lián)接按任意順序指定;但是,用左或右向外聯(lián)接指定表或視圖時(shí),表或視圖的順序很重要。有關(guān)使用左或右向外聯(lián)接排列表的更多信息,請(qǐng)參見使用外聯(lián)接。
例子:
-------------------------------------------------
a表 id name b表 id job parent_id
1 張3 1 23 1
2 李四 2 34 2
3 王武 3 34 4
a.id同parent_id 存在關(guān)系
--------------------------------------------------
1) 內(nèi)連接
select a.*,b.* from a inner join b on a.id=b.parent_id
結(jié)果是
1 張3 1 23 1
2 李四 2 34 2
2)左連接
select a.*,b.* from a left join b on a.id=b.parent_id
結(jié)果是
1 張3 1 23 1
2 李四 2 34 2
3 王武 null
3) 右連接
select a.*,b.* from a right join b on a.id=b.parent_id
結(jié)果是
1 張3 1 23 1
2 李四 2 34 2
null 3 34 4
4) 完全連接
select a.*,b.* from a full join b on a.id=b.parent_id
結(jié)果是
1 張3 1 23 1
2 李四 2 34 2
null 3 34 4
3 王武 null
可以用左連接(left join)查詢出未匹配的數(shù)據(jù)。原理是左連接時(shí),將輸出左表的所有記錄,如果右表沒有匹配的記錄,則用null替代右表的字段值,這樣在where子句里篩選出這些右表字段值為null記錄,即可查詢出未匹配的數(shù)據(jù)。請(qǐng)參考下列實(shí)例:
查出沒有參加課程號(hào)為"A01"考試的學(xué)生資料
數(shù)據(jù)結(jié)構(gòu)
student(sid,sname)
score(sid,cid,grade)
SQL語句
select?a.*?from?student?a?left?join?
(select?distinct?sid?from?score?where?cid='A01')?b?
on?a.sid=b.sid?where?b.sid?is?null;
inner join 是內(nèi)連接,left join 是左連接。
舉例:
a表,有數(shù)據(jù) id1(1,2,3,4,5)
b表,有數(shù)據(jù) id2(1,3,5,6,7)
select a.* from a inner join b on a.id1 = b.id2 結(jié)果,是id1(1,3,5)
select a.* from a left join b on a.id1 = b.id2 結(jié)果,是 id1(1,2,3,4,5)
1.用"a"是為了方便你輸入,a就是authors,你不用a也可以,但用到authors 的地方你都得輸這個(gè)字段,感覺麻煩?!癮uthors as a ”的意思就是用 a替代 authors.
2.join 就是進(jìn)行連接。
jion 語句有三種,inner join, left outer join 和 right outer join 都可以簡(jiǎn)寫,分別為jion,left join,right jion。
jion語句可以用來組合兩個(gè)表中的記錄,只要在公共字段之中有相符的值即可,該語句聯(lián)合兩個(gè)表查詢得到的結(jié)果是可以添加新的數(shù)據(jù),可以把它看成將兩個(gè)具有相關(guān)內(nèi)容的表聯(lián)接在一起新生成的表,而一般的select 語句沒有這個(gè)功能。
1) 內(nèi)連接,inner join ... on
語句格式:
FROM (((表1 INNER JOIN 表2 ON 表1.字段號(hào)=表2.字段號(hào)) INNER JOIN 表3 ON 表1.字段號(hào)=表3.字段號(hào)) INNER JOIN 表4 ON Member.字段號(hào)=表4.字段號(hào)) INNER JOIN 表X ON Member.字段號(hào)=表X.字段號(hào)
例子:
SELECT *
FROM (((Member INNER JOIN MemberSort ON Member.MemberSort=MemberSort.MemberSort) INNER JOIN MemberLevel ON Member.MemberLevel=MemberLevel.MemberLevel) INNER JOIN MemberIdentity ON Member.MemberIdentity=MemberIdentity.MemberIdentity) INNER JOIN Wedlock ON Member.Wedlock=Wedlock.Wedlock
ORDER BY MemberDate DESC
內(nèi)連接的功能是,把兩個(gè)表相關(guān)聯(lián)的記錄列出來,必須是相關(guān)聯(lián)的記錄。
2) 左外連接,left outer join ... on
語句格式:
FROM [表名1] LEFT JOIN [表名2]
ON [表名1.字段A] 〈關(guān)系運(yùn)算符〉[表名2.字段B]
其實(shí)LEFT JOIN 的功能就是將LEFT左邊的表名1中的所有記錄全部保留,而將右邊的表名2中的字段B與表名1.字段A相對(duì)應(yīng)的記錄顯示出來(當(dāng)使用SELECT * 時(shí))。而RIGHT JOIN 和LEFT JOIN 相反。
外連接的功能是,把LEFT左邊的表中的所有記錄保留,而右邊表只保留相關(guān)聯(lián)的記錄,也就是先執(zhí)行一次INNER JOIN,然后把LEFT左邊的表中的與右邊表沒有任何關(guān)聯(lián)的記錄也保留,而右邊表的字段為null.
3) 右外連接,right outer join ... on
與 left join左右相反。
4) 全連接,full join ... on(不常使用,只能用于outer)
功能結(jié)合了以上三種聯(lián)軍,先執(zhí)行一次inner join,然后把兩個(gè)表的多余字段都保留,但連接的對(duì)應(yīng)字段為null.
如果想將幾個(gè)表聯(lián)接起來,在JOIN操作中我們可以進(jìn)行嵌套操作,有三個(gè)表:表1、表2、表3,現(xiàn)在將三個(gè)表聯(lián)接起來:
FROM (表1 INNER JOIN 表2 ON 表1.序號(hào)=表2.序號(hào))
INNER JOIN 表3 ON 表1.序號(hào)=表3.序號(hào)