SQL 外鏈接操作小結(jié) inner join left join right join
7. 外連接——交叉查詢
7.1 查詢
7.2 等值連接
7.3 右外連接
7.4 左外連接
7.5 更新操作
簡(jiǎn)介:
外部連接和自聯(lián)接
inner join(等值連接) 只返回兩個(gè)表中聯(lián)結(jié)字段相等的行
left join(左聯(lián)接) 返回包括左表中的所有記錄和右表中聯(lián)結(jié)字段相等的記錄
right join(右聯(lián)接) 返回包括右表中的所有記錄和左表中聯(lián)結(jié)字段相等的記錄
on 指定表間聯(lián)結(jié)字段及其關(guān)系的等號(hào) "=" 表達(dá)式, 返回 true 或 false. 當(dāng)表達(dá)式返回 true 時(shí), 則查詢中包含該記錄.
! 外部連接只能操作已存在于數(shù)據(jù)庫中的數(shù)據(jù)
7.5.2
程序代碼
Update (ctarticle AS a LEFT JOIN ctclass AS c ON a.classid = c.classid) LEFT JOIN cttag AS b ON a.articleid = b.articleid
SET tag=tag+' ', b.articleid=a.articleid, b.classid=a.classid, b.nclassid=a.nclassid
Where a.classid=23 AND a.nclassid=0 AND tagid is not null
7.5.1
程序代碼
Update (ctarticle AS a LEFT JOIN (ctnclass AS c LEFT JOIN ctclass AS d ON c.classid = d.classid) ON a.nclassid = c.nclassid AND a.classid = c.classid) LEFT JOIN cttag AS b ON a.articleid = b.articleid SET tag=d.class+' '+c.nclass, b.articleid=a.articleid, b.classid=a.classid, b.nclassid=a.nclassid Where a.classid=23 AND a.nclassid=197;
7.5 更新操作
74.5 左連接中數(shù)據(jù)的篩選
程序代碼
Insert INTO cttag(articleid,classid,nclassid) Select a.articleid,a.classid,a.nclassid from ctarticle a left join cttag b on a.articleid=b.articleid where b.articleid is null
//本語句功能為, 顯示主表的全部?jī)?nèi)容, 插入數(shù)據(jù)到副表中沒有的數(shù)據(jù)
//主要作用為: 讓數(shù)據(jù)減少冗余
7.4.4.1 上例中的延續(xù)
程序代碼
Select a.*, b.*, c.*, d.*
FROM cttag as d left join ((ctarticle AS a LEFT JOIN ctclass AS b ON a.classid=b.classid) LEFT JOIN ctnclass AS c ON a.nclassid=c.nclassid) on d.articleid=a.articleid;
7.4.4 顯示文章表中的全部, 調(diào)用類別表中的欄目
程序代碼
select a.*, b.*, c.* from (ctarticle a left join ctclass b on a.classid=b.classid) left join ctnclass c on a.nclassid=c.nclassid
//作用, 有時(shí)在文章表中包含了在個(gè)別類別表中沒有的數(shù)據(jù), 用這個(gè)語法可以讀出文章表的全部數(shù)據(jù)
//a 為 文章表, b 為主類別, c 為子類別
7.4.3 同上例, 選擇追加數(shù)據(jù)時(shí)加上空格
程序代碼
Insert INTO cttag(articleid,classid,nclassid,tag)
Select a.articleid,a.classid,a.nclassid,d.class+' '+c.nclass
FROM (ctarticle AS a left join (ctnclass c left join ctclass d on c.classid=d.classid) on a.classid=c.classid and a.nclassid=c.nclassid) LEFT JOIN cttag AS b ON a.articleid = b.articleid where a.classid=4 and a.nclassid=154;
7.4.2 連接N個(gè)表, 并追加數(shù)據(jù)到其中一個(gè)表, N=4
程序代碼
Insert INTO cttag(articleid,classid,nclassid,tag)
Select a.articleid,a.classid,a.nclassid,d.class+c.nclass
FROM (ctarticle AS a left join (ctnclass c left join ctclass d on c.classid=d.classid) on a.classid=c.classid and a.nclassid=c.nclassid) LEFT JOIN cttag AS b ON a.articleid = b.articleid where a.classid=1 and a.nclassid=1;
//解讀
插入到 表2(欄1,欄2,欄3,欄4)
選擇 別名a.欄1, 別名a.欄2, 別名a.欄3, 別名d.欄4 加上 別名c.欄5
從 (表1 別名a 左連接 (表3 別名c 左連接 表4 別名d 在 別名c.欄2 等于 別名d.欄2) 在 別名a.欄2 等于 別名c.欄2 和 別名a.欄3=別名c.欄3) 左連接 表2 別名b 在 別名a.欄1 等于 別名b.欄1 在那里 別名a.欄2=1 和 別名a.欄3=1
7.4.1 連接兩個(gè)表, 并追加數(shù)據(jù)到其中一個(gè)表
程序代碼
Insert INTO cttag(articleid,classid,nclassid)
Select a.articleid,a.classid,a.nclassid
FROM ctarticle AS a LEFT JOIN cttag AS b ON a.articleid = b.articleid where a.classid=1 and a.nclassid=1;
//解讀
插入到 表2(欄1,欄2,欄3)
選擇 別名a.欄1, 別名a.欄2, 別名a.欄3
從 表1 別名a 左連接 表2 別名b 在 別名a.欄1 等于 別名b.欄1 在那里 別名a.欄4=1 和 別名a.欄5=1
7.4. 左連接
7.3.1 同步兩表的數(shù)據(jù)
程序代碼
Update ctarticle a INNER JOIN cttag b ON a.articleid = b.articleid SET b.classid=a.classid, b.nclassid=a.nclassid;
//解讀
更新 表1 別名a 聯(lián)接 表2 別名2 在 別名a.欄1 等于 別名b.欄1 設(shè)置 別名b.欄2 更新為 別名a.欄2, 別名b.欄3 更新為 別名a.欄3
7.3 右外連接
程序代碼
select a.*, b.* from bunclass a right join ctclass b on a.classid=b.classid where a.nclassid=20
查詢別名 a,b 表, 只匹配 b 表中的內(nèi)容.
7.2.3 添加數(shù)據(jù)到連接表之一
程序代碼
Insert INTO cttag ( tag, articleid ) Select top 1 b.tag, a.articleid FROM ctarticle AS a left JOIN cttag AS b ON a.articleid = b.articleid Where a.articleid order by a.articleid desc;
7.2.2 變通中的用法二
程序代碼
Insert INTO bureply
Select b.*, a.classid, a.nclassid
FROM article AS a INNER JOIN reply AS b ON a.articleid = b.articleid
Where classid=50;
7.2.1 實(shí)際應(yīng)用中的變通
程序代碼
Insert INTO butag ( tag, articleid, classid, nclassid)
Select b.tag, a.articleid, a.classid, a.nclassid
FROM article AS a INNER JOIN tag AS b ON a.articleid = b.articleid
Where classid=24;
7.2 添加數(shù)據(jù)到其他表
程序代碼
Insert INTO butag ( tag, articleid )
Select b.tag, a.articleid
FROM article AS a INNER JOIN tag AS b ON a.articleid = b.articleid
Where a.articleid<>False;
//解讀
添加到 接收表(列1,列2)
選擇 別名b.列1, 別名a.列2
從 表1 表名a 聯(lián)接 表2 表名b 在 別名a.列c 等于 別名b.列c
在哪里 別名a.列c 不等于 沒有
7.1.1 實(shí)際應(yīng)用中的變通
程序代碼
Select b.tag, a.articleid, a.classid, a.nclassid
FROM article AS a INNER JOIN tag AS b ON a.articleid = b.articleid
Where a.classid=24;
7.1 查詢
程序代碼
Select b.tag, a.articleid
FROM article AS a INNER JOIN tag AS b ON a.articleid = b.articleid
Where a.articleid<>False;
//解讀
選擇 別名b.列, 別名a.列
從 表1 別名a 聯(lián)接 表2 別名b 在 別名a.列c = 別名b.列c
在哪里 別名a.列c 不等于 沒有
注: as 不是必要
7. 外連接——交叉查詢
提示: 注意表中相同的欄目
相關(guān)文章
SQL SERVER中SELECT和SET賦值相同點(diǎn)與不同點(diǎn)(推薦)
SELECT和SET在SQL SERVER中都可以用來對(duì)變量進(jìn)行賦值,但其用法和效果在一些細(xì)節(jié)上有些不同。今天小編給大家分享SQL SERVER中SELECT和SET賦值相同點(diǎn)與不同點(diǎn),感興趣的朋友一起看看吧2019-12-12SQL Server 遠(yuǎn)程更新目標(biāo)表數(shù)據(jù)的存儲(chǔ)過程
這篇文章主要介紹了SQL Server 遠(yuǎn)程更新目標(biāo)表數(shù)據(jù)的存儲(chǔ)過程,適用于更新列名一致,主鍵為Int類型,具體實(shí)例代碼大家參考下本文2018-05-05學(xué)會(huì)sql數(shù)據(jù)庫關(guān)系圖(Petshop)
花了這么多時(shí)間最終還是回到了數(shù)據(jù)庫,但是數(shù)據(jù)庫中一張一張的表格找不到腳本,也不是自己設(shè)計(jì)的數(shù)據(jù)庫,完全沒有一點(diǎn)頭緒,后來突然想起來sql有個(gè)數(shù)據(jù)庫關(guān)系圖,可以很快的適合數(shù)據(jù)庫程序員很快的掌握數(shù)據(jù)庫表之間的關(guān)系2012-08-08SQL Server 作業(yè)同步 (結(jié)合備份作業(yè))
昨天發(fā)了篇 SQL Server 作業(yè)備份,今天就加上powershell 把 作業(yè)同步 完善起來,方便需要的朋友2012-06-06SQL Server數(shù)據(jù)庫入門學(xué)習(xí)總結(jié)
經(jīng)過一段時(shí)間的學(xué)習(xí),也對(duì)數(shù)據(jù)庫有了一些認(rèn)識(shí),數(shù)據(jù)庫基本是由表,關(guān)系,操作組成;對(duì)于初學(xué)者首先要學(xué)的2012-08-08SQL Server 使用觸發(fā)器(trigger)發(fā)送電子郵件步驟詳解
本文分步驟給大家詳細(xì)介紹了SQL Server 使用觸發(fā)器(trigger)發(fā)送電子郵件的方法,需要的朋友可以參考下2017-04-04SQL Server 日期函數(shù)CAST 和 CONVERT 以及在業(yè)務(wù)中的使用介紹
。最近時(shí)間剛從客戶端轉(zhuǎn)入后臺(tái)寫服務(wù),對(duì)于后臺(tái)數(shù)據(jù)庫以及服務(wù)的書寫完全是個(gè)小白,所以最近寫的肯定沒有太多技術(shù)含量2013-01-01