兩個(gè)表需要有共同的字段用來(lái)做對(duì)應(yīng)關(guān)系,假定表a 的ab字段和表b 的bc字段意義是一樣的:
超過(guò)10年行業(yè)經(jīng)驗(yàn),技術(shù)領(lǐng)先,服務(wù)至上的經(jīng)營(yíng)模式,全靠網(wǎng)絡(luò)和口碑獲得客戶,為自己降低成本,也就是為客戶降低成本。到目前業(yè)務(wù)范圍包括了:成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè),成都網(wǎng)站推廣,成都網(wǎng)站優(yōu)化,整體網(wǎng)絡(luò)托管,微信小程序定制開(kāi)發(fā),微信開(kāi)發(fā),APP應(yīng)用開(kāi)發(fā),同時(shí)也可以讓客戶的網(wǎng)站和網(wǎng)絡(luò)營(yíng)銷(xiāo)和我們一樣獲得訂單和生意!
新建兩張表:
表a:ab ac ad
1 1 2
2 3 4
3 5 6
表b: bc bd be
1 7 8
3 9 10
4 11 12
(此時(shí)這樣建表只是為了演示連接SQL語(yǔ)句,當(dāng)然實(shí)際開(kāi)發(fā)中我們不會(huì)這樣建表,實(shí)際開(kāi)發(fā)中這兩個(gè)表會(huì)有自己不同的主鍵。)
一、外連接
外連接可分為:左連接、右連接、完全外連接。
1、左連接 left join 或 left outer join
SQL語(yǔ)句:select 表a.ab,表a.ac,表a.ad,表b.bc,表b.bd,表b.be from 表a left join 表b on 表a.ab=表b.bd執(zhí)行結(jié)果以ab行為準(zhǔn):
表:ab ac ad bc bd be
1 1 2 1 7 8
2 3 4 0 0 0
3 5 6 3 9 10
其中b表bc第二行的值在ab中沒(méi)有對(duì)應(yīng)的所以左連無(wú)法找出來(lái),同理右連會(huì)變成這樣:
SQL語(yǔ)句:select 表a.ab,表a.ac,表a.ad,表b.bc,表b.bd,表b.be from 表a left join 表b on 表a.ab=表b.bd執(zhí)行結(jié)果以bd行為準(zhǔn):
表:ab ac ad bc bd be
1 1 2 1 7 8
3 5 6 3 9 10
0 0 0 4 11 12
左外連接包含left join左表所有行,如果左表中某行在右表沒(méi)有匹配,則結(jié)果中對(duì)應(yīng)行右表的部分全部為0.
注:此時(shí)我們不能說(shuō)結(jié)果的行數(shù)等于左表數(shù)據(jù)的行數(shù)。當(dāng)然此處查詢結(jié)果的行數(shù)等于左表數(shù)據(jù)的行數(shù),因?yàn)樽笥覂杀泶藭r(shí)為一對(duì)一關(guān)系。
右外連接包含right join右表所有行,如果左表中某行在右表沒(méi)有匹配,則結(jié)果中對(duì)應(yīng)左表的部分全部為0。
注:同樣此時(shí)我們不能說(shuō)結(jié)果的行數(shù)等于右表的行數(shù)。當(dāng)然此處查詢結(jié)果的行數(shù)等于左表數(shù)據(jù)的行數(shù),因?yàn)樽笥覂杀泶藭r(shí)為一對(duì)一關(guān)系。
3、完全外連接 full join 或 full outer join
SQL語(yǔ)句:select 表a.ab,表a.ac,表a.ad,表b.bc,表b.bd,表b.be from 表a full join 表b on 表a.ab=表b.bd執(zhí)行結(jié)果:
表:ab ac ad bc bd be
1 1 2 1 7 8
2 3 4 0 0 0
3 5 6 3 9 10
0 0 0 4 11 12
完全外連接包含full join左右兩表中所有的行,如果右表中某行在左表中沒(méi)有匹配,則結(jié)果中對(duì)應(yīng)行右表的部分全部為0,如果左表中某行在右表中沒(méi)有匹配,則結(jié)果中對(duì)應(yīng)行左表的部分全部為0。
二、內(nèi)連接 join 或 inner join
SQL語(yǔ)句:select 表a.ab,表a.ac,表a.ad,表b.bc,表b.bd,表b.be from 表a inner join 表b on 表a.ab=表b.bdinner join 是比較運(yùn)算符,只返回符合條件的行。
表:ab ac ad bc bd be
1 1 2 1 7 8
3 5 6 3 9 10
三、交叉連接 cross join
1.概念:沒(méi)有 WHERE 子句的交叉聯(lián)接將產(chǎn)生連接所涉及的表的笛卡爾積。第一個(gè)表的行數(shù)乘以第二個(gè)表的行數(shù)等于笛卡爾積結(jié)果集的大小。
表a: ab
星期一
星期二
星期三
表b: cd
張三
李四
王五
SELECT a.ab,b.cd FROM 表a CROSS JOIN 表b
ab cd
星期一 張三
星期一 李四
星期一 王五
星期二 張三
星期二 李四
星期二 王五
星期三 張三
星期三 李四
星期三 王五
這個(gè)問(wèn)題是集合減的問(wèn)題
很可惜 你這個(gè)是mysql,只能用not in
select?id?from?客戶表
where?id?not?in?
(
select?id?from?數(shù)據(jù)表1?WHERE?上傳數(shù)據(jù)時(shí)間now()-7
union
select?id?from?數(shù)據(jù)表2?WHERE?上傳數(shù)據(jù)時(shí)間now()-7
union
select?id?from?數(shù)據(jù)表3?WHERE?上傳數(shù)據(jù)時(shí)間now()-7
union
select?id?from?數(shù)據(jù)表2?WHERE?上傳數(shù)據(jù)時(shí)間now()-7
)
如果你使用的是oracle,還有效率更高的方法,用關(guān)鍵字minus
select?id?from?客戶表
minus
select?id?from?數(shù)據(jù)表1?WHERE?上傳數(shù)據(jù)時(shí)間sysdate-7
minus
select?id?from?數(shù)據(jù)表2?WHERE?上傳數(shù)據(jù)時(shí)間sysdate-7
minus
select?id?from?數(shù)據(jù)表3?WHERE?上傳數(shù)據(jù)時(shí)間sysdate-7
minus
select?id?from?數(shù)據(jù)表2?WHERE?上傳數(shù)據(jù)時(shí)間sysdate-7
或者sqlserver使用關(guān)鍵字except
select?id?from?客戶表
except
select?id?from?數(shù)據(jù)表1?WHERE?上傳數(shù)據(jù)時(shí)間getdate()-7
except
select?id?from?數(shù)據(jù)表2?WHERE?上傳數(shù)據(jù)時(shí)間getdate()-7
except
select?id?from?數(shù)據(jù)表3?WHERE?上傳數(shù)據(jù)時(shí)間getdate()-7
except
select?id?from?數(shù)據(jù)表2?WHERE?上傳數(shù)據(jù)時(shí)間getdate()-7
以上
一使用SELECT子句進(jìn)行多表查詢SELECT 字段名 FROM 表1,表2 … WHERE 表1字段 = 表2字段 AND 其它查詢條件SELECT a.id,a.name,a.address,a.date,b.math,b.english,b.chinese FROM tb_demo065_tel AS b,tb_demo065 AS a WHERE a.id=b.id
注:在上面的的代碼中,以兩張表的id字段信息相同作為條件建立兩表關(guān)聯(lián),但在實(shí)際開(kāi)發(fā)中不應(yīng)該這樣使用,最好用主外鍵約束來(lái)實(shí)現(xiàn)。
1、聯(lián)合查詢可合并多個(gè)相似的選擇查詢的結(jié)果集。等同于將一個(gè)表追加到另一個(gè)表,從而實(shí)現(xiàn)將兩個(gè)表的查詢組合到一起,使用謂詞為UNION或UNION ALL。聯(lián)合查詢時(shí),查詢結(jié)果的列標(biāo)題為第一個(gè)查詢語(yǔ)句的列標(biāo)題。因此,要定義列標(biāo)題必須在第一個(gè)查詢語(yǔ)句中定義。要對(duì)聯(lián)合查詢結(jié)果排序時(shí),也必須使用第一查詢語(yǔ)句中的列名、列標(biāo)題或者列序號(hào)。
2、在使用UNION 運(yùn)算符時(shí),應(yīng)保證每個(gè)聯(lián)合查詢語(yǔ)句的選擇列表中有相同數(shù)量的表達(dá)式,并且每個(gè)查詢選擇表達(dá)式應(yīng)具有相同的數(shù)據(jù)類型,或是可以自動(dòng)將它們轉(zhuǎn)換為相同的數(shù)據(jù)類型。在自動(dòng)轉(zhuǎn)換時(shí),對(duì)于數(shù)值類型,系統(tǒng)將低精度的數(shù)據(jù)類型轉(zhuǎn)換為高精度的數(shù)據(jù)類型。
3、在包括多個(gè)查詢的UNION語(yǔ)句中,其執(zhí)行順序是自左至右,使用括號(hào)可以改變這一執(zhí)行順序。例如:查詢1 UNION (查詢2 UNION 查詢3)。