外連結操作小結 inner join & left join & right join

日期:2008-07-03  作者:喜騰小二  來源:PHPChina


    資料庫操作陳述式

7. 外連線——交叉查詢
7.1 查詢
7.2 等值連線
7.3 右外連線
7.4 左外連線
7.5 更新操作

簡介:

外部連線和自聯接
inner join(等值連線) 隻返回兩個表中聯結欄位相等的行
left join(左聯接) 返回包括左表中的所有記錄和右表中聯結欄位相等的記錄
right join(右聯接) 返回包括右表中的所有記錄和左表中聯結欄位相等的記錄
on 指定表間聯結欄位及其關係的等號 "=" 運算式, 返回 true 或 false. 當運算式返回 true 時, 則查詢中包含該記錄.
! 外部連線隻能操作已存在於資料庫中的資料

CODE:

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 左連線中資料的篩選
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
//本陳述式功能為, 顯示主表的全部內容, 插入資料到副表中沒有的資料
//主要作用為: 讓資料減少冗餘

7.4.4.1 上例中的延續
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 顯示文章表中的全部, 調用類別表中的欄目
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
//作用, 有時在文章表中包含了在個別類別表中沒有的資料, 用這個語法可以讀出文章表的全部資料
//a 為 文章表, b 為主類別, c 為子類別

7.4.3 同上例, 選擇追加資料時加上空格
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個表, 並追加資料到其中一個表, 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 連線兩個表, 並追加資料到其中一個表
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 同步兩表的資料
UPDATE ctarticle a INNER JOIN cttag b ON a.articleid = b.articleid SET b.classid=a.classid, b.nclassid=a.nclassid;
//解讀
更新 表1 別名a 聯接 表2 別名2 在 別名a.欄1 等於 別名b.欄1 設定 別名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 表中的內容.

7.2.3 新增資料到連線表之一
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 實際應用中的變通
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 新增資料到其他表
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 聯接 表2 表名b 在 別名a.列c 等於 別名b.列c
在哪裡 別名a.列c 不等於 沒有

7.1.1 實際應用中的變通
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 聯接 表2 別名b 在 別名a.列c = 別名b.列c
在哪裡 別名a.列c 不等於 沒有
注: as 不是必要

7. 外連線——交叉查詢
提示: 注意表中相同的欄目

<<<返回技術中心

技術文章

站內新聞

我要啦免费统计