轉(zhuǎn)載自:http://cnjava.blog.51cto.com/1208887/434223
SQL中的聯(lián)接類型可以分為如下幾種:
1)內(nèi)聯(lián)接?? 僅顯示兩個聯(lián)接表中的匹配行的聯(lián)接喘先。
2)外聯(lián)接?? 甚至包括在聯(lián)接表中沒有相關(guān)行的行的聯(lián)接∥木ぃ可以創(chuàng)建外聯(lián)接的三個變化形式來指定所包括的不匹配行:
其中值得補(bǔ)充的是自聯(lián)接
表可以通過自聯(lián)接與自身聯(lián)接格嗅。例如,可以使用自聯(lián)接 查 找一張表 使用相同Email的用戶臭脓。
現(xiàn)在students表數(shù)據(jù)如下:
Stuid?????? Sname????? semail
----------- ---------- --------------------------------------------------
1?????????? 張飛???????? zhangfei@sanguo.com
2?????????? 劉備???????? liubei@sanguo.com
3?????????? 關(guān)羽???????? guanyu@sanguo.com
4?????????? 趙云???????? zhaoyun@sanguo.com
5?????????? 趙小云??????? zhaoyun@sanguo.com
如何找出具有相同email的用戶姓名呢酗钞?
由于此查詢涉及 students表與其自身的聯(lián)接,因此 students表以兩種角色顯示。若要區(qū)分這兩個角色砚作,必須在 FROM 子句中為 students表提供兩個不同的別名(st1 和 st2)窘奏。這些別名用來限定其余查詢中的列名。
select st1.sname,st2.sname,st1.semail
from students st1?? inner join students st2
on st1.stuid=st2.stuid
where st1.semail=st2.semail
以下是結(jié)果集:
sname????? sname????? semail
---------- ---------- --------------------------------------------------
張飛???????? 張飛???????? zhangfei@sanguo.com
劉備???????? 劉備???????? liubei@sanguo.com
關(guān)羽???????? 關(guān)羽???????? guanyu@sanguo.com
趙云???????? 趙云???????? zhaoyun@sanguo.com
趙小云??????? 趙小云??????? zhaoyun@sanguo.com
(5 行受影響)
若要消除完全相同的行葫录,那么必須要這樣
select st1.sname,st2.sname,st1.semail
from students st1?? inner join students st2
on st1.stuid<>st2.stuid? --注意這里的不等號
where st1.semail=st2.semail
以下是結(jié)果集:
sname????? sname????? semail
---------- ---------- --------------------------------------------------
趙小云??????? 趙云???????? zhaoyun@sanguo.com
趙云???????? 趙小云??????? zhaoyun@sanguo.com
(2 行受影響)
若要消除結(jié)果中用戶姓名完全順序顛倒相同的行(順序顛倒)
select st1.sname,st2.sname,st1.semail
from students st1?? inner join students st2
on st1.stuid>st2.stuid
where st1.semail=st2.semail
以下是結(jié)果集:
sname????? sname????? semail
---------- ---------- --------------------------------------------------
趙小云??????? 趙云???????? zhaoyun@sanguo.com
(1 行受影響)
這樣就達(dá)到目標(biāo)了