通過連接運算符可以實現多個表查詢。連接是關系數據庫模型的主要特點,也是它區別于其它類型數據庫管理系統的一個標志。
在關系數據庫管理系統中,表建立時各數據之間的關系不必確定,常把一個實體的所有信息存放在一個表中。當檢索數據時,通過連接操作查詢出存放在多個表中的不同實體的信息。連接操作給用戶帶來很大的靈活性,他們可以在任何時候增加新的數據類型。為不同實體創建新的表,爾后通過連接進行查詢。
連接可以在SELECT 語句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出連接時有助于將連接操作與WHERE子句中的搜索條件區分開來。所以,在Transact-SQL中推薦使用這種方法。
(無論哪種連接都不能對text、ntext和image數據類型列進行直接連接,但可以對這三種列進行間接連接。)
連接查詢實際上是通過各個表之間共同列的關聯性來查詢數據的,它是關系數據庫查詢最主要的特征.
select?表1.字段名1,表2.字段名2,...?
from?表1,表2
where?連接條件
SQL-92標準所定義的FROM子句的連接語法格式為:?
FROM?表名?join_type?表名?[ON (連接條件)]
連接操作中的ON (連接條件)?子句指出連接條件,它由被連接表中的列和比較運算符、邏輯運算符等構
成。?
連接查詢分類
(join_type):
1.自連接查詢,對同一個表進行連接操作(可以理解為兩個不同表的內連接,有時可與嵌套查詢等價)
2.內連接查詢,<又分為:自然連接、等值連接、不等值連接三種> ??(INNER JOIN)
3.外連接查詢,<又分為:左外連接、右外連接、全外連接三種>
4.交叉連接查詢,也作無條件查詢。
5.聯合查詢
inner join表示內連接、left join表示左外連接、right join表示右外連接、full join表示全連接;on用于指定連接條件。
注意:如果使用form內、外連接,則必須使用on操作符指定連接條件;如果使用(+)操作符連接,則必須使用where指定連接條件。
一.自連接查詢:
一個表自己與自己建立連接稱為自連接或自身連接。
?????進行自連接就如同兩個分開的表一樣,可以把一個表的某一行與同一表中的另一行連接起來。
例:
查詢選學“101”課程的成績高于“9505201”號學生成績的所有學生記錄,
并按成績從高到低排列。
select x.* from sclass x,sclass y
where x.cno=''101'' and x.degree>y.degree and y.sno=''9505201'' and y.cno=''101''
order by x.degree desc
二.?內連接查詢
內連接(INNER JOIN)使用比較運算符進行表間某(些)列數據的比較操作,并列出這些表中與連接條件相匹配的數據行。根據所使用的比較方式不同,內連接又分為等值連接、自然連接和不等連接三種。
1、等值連接:
在連接條件中使用等于號(=)運算符比較被連接列的列值
所謂等值連接,是指表之間通過“等于”關系連接起來,產生一個臨時表,
然后對該臨時表進行處理后生成最終結果。
其查詢結果中列出被連接表中的所有列,
包括其中的重復列
。
SELECT *?
FROM authors AS a INNER JOIN publishers AS p?
ON a.city=p.city
我們可以有兩種方式,這兩種是等效的?
一種是:SELECT e.employeeid,e.employeename,d.deptname FROM EmployeeTB AS e,DeptTB AS d WHERE e.deptid=d.deptid ? (使用“=”號連接)
另外一個是:SELECT e.employeeid,e.employeename,d.deptname FROM EmployeeTB AS e INNER JOIN DeptTB AS d ON e.deptid=d.deptid ? (使用關鍵字連接)
2、不等連接: 在連接條件使用除等于運算符以外的其它比較運算符比較被連接的列的列值。這些運算符包括>、>=、<=、<、!>、!<和<>。
3、自然連接:
在連接條件中使用等于(=)運算符比較被連接列的列值,但它使用選擇列表指出查詢結果集合中所包括的列,并刪除連接表中的重復列。
在等值連接中消除重復列就是自然連接。(state,city在兩個表中都存在)
SELECT a.*,p.pub_id,p.pub_name,p.country?
FROM authors AS a INNER JOIN publishers AS p?
ON a.city=p.city
三?外連接查詢?(左外連接、右外連接、全外連接)
內連接時,返回查詢結果集合中的僅是符合查詢條件( WHERE 搜索條件或 HAVING 條件)和連接條件的行。而采用外連接時,它返回到查詢結果集合中的不僅包含符合連接條件的行,而且還包括左表(左外連接時)、右表(右外連接時)或兩個邊接表(全外連接)中的所有數據行。
左向外聯接的結果集包括 ?LEFT OUTER?子句中指定的左表的所有行,而不僅僅是聯接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均為空值
右向外聯接是左向外聯接的反向聯接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。
A left join B 的連接的記錄數與A表的記錄數同
A right join B 的連接的記錄數與B表的記錄數同? 這種說法是錯誤的,只有當表A與表B是一對一時才成立。
首先我們做兩張表:員工信息表和部門信息表,在此,表的建立只為講述連接的概念,所以字段非常的簡單?
EmployeeTB(員工信息表):?
employeeid employeename deptid?
0001??張三? 01?
0002??李四? 01?
0003??王五? 02?
0004??趙六? 02?
0005??鄭七? NULL?
DeptTB(部門信息表)?
deptid? deptname?
01??技術部?
02??市場部?
03??工程部?
1左外聯結 ??(LEFT OUTER JOIN或LEFT JOIN)
但是有些情況下,我們需要知道所有員工的信息,即使他不屬于任何部門。這樣我們就可以采用外連接,在這里為左外連接,也就是連接中的左表的表中的記錄,無論能不能在右表中找到匹配的項,都要檢索,如果沒有匹配的項目,那么右表中的字段值為NULL(空),在這里就代表,此員工不屬于任何部門。?
檢索語句為:?
SELECT e.employeeid,e.employeename,d.deptname FROM EmployeeTB AS e LEFT OUTER JOIN DeptTB AS d ON e.deptid=d.deptid?
檢索的結果都是:?
employeeid employeename deptname?
0001??張三?技術部?
0002??李四?技術部?
0003??王五?市場部?
0004??趙六?市場部?
0005??鄭七? NULL?
但是在這里,工程部同樣不會被檢索,因為,deptname是在連接的右邊的表中,“工程部”在左表中不存在任何的記錄,所以不會被檢索。這里關注的是“連接中的左邊的表”?
例如:select?t1.name,t2.name?from?cip_temps?t1?left?join?cip_tmp?t2?on?t1.ID=t2.id;
2、右外連接 ??(RIGHT OUTER JOIN或RIGHT JOIN)
有時,我們需要知道,全部部門的信息,即使它沒有任何的員工。在我們的查詢中部門表在連接的右邊,如果我們想知道右邊表中的所有記錄信息,那么就可以采用右外連接,如果此記錄在左邊的表中找不到匹配項,則相應字段(employeeid,employeename)為NULL?
檢索語句為:?
SELECT e.employeeid,e.employeename,d.deptname FROM EmployeeTB AS e RIGHT OUTER JOIN DeptTB AS d ON e.deptid=d.deptid?
檢索的結果都是:?
employeeid employeename deptname?
0001??張三?技術部?
0002??李四?技術部?
0003??王五?市場部?
0004??趙六?市場部?
NULL? NULL??工程部?
但在這里,鄭七是不會被檢索了,因為它在右表中找不到匹配項,這里關注的是“連接中的右邊的表”?
例:select?t1.name,t2.name?from?cip_temps?t1?right?join?cip_tmp?t2?on?t1.ID=t2.id;
3、完全外連接 ??(FULL OUTER JOIN或FULL JOIN)
如果我們想知道所有的記錄呢?無論員工有沒有部門,部門有沒有員工,我們都需要檢索。這里就可以使用完全外連接。關注連接中的兩部分。如果沒有部門,部門為空,沒有員工,員工信息為空。?
檢索語句為:?
SELECT e.employeeid,e.employeename,d.deptname FROM EmployeeTB AS e FULL OUTER JOIN DeptTB AS d ON e.deptid=d.deptid?
檢索的結果都是:?
employeeid employeename deptname?
0001??張三?技術部?
0002??李四?技術部?
0003??王五?市場部?
0004??趙六?市場部?
0005??鄭七? NULL?
NULL? NULL??工程部?
內連接與外連接的區別就是:內連接用于返回滿足連接條件的記錄;而外連接則是內連接的擴展,它不僅會滿足連接條件的記錄,而且還會返回不滿足連接條件的記錄
例:select?t1.name,t2.name?from?cip_temps?t1?full?join?cip_tmp?t2?on?t1.ID=t2.id;
四.交叉連接 ?(CROSS JOIN)
交叉連接不帶WHERE?子句,它返回被連接的兩個表所有數據行的笛卡爾積,返回到結果集合中的數
據行數等于第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。
例,titles表中有6類圖書,而publishers表中有8家出版社,則下列交叉連接檢索到的記錄數將等
于6*8=48行。
SELECT type,pub_name
FROM titles CROSS JOIN publishers
ORDER BY type
?
摘抄文章來源: http://www.cnblogs.com/gaiyang/archive/2011/04/12/2013168.html
http://blog.163.com/iamlike@yeah/blog/static/169765352201072442920777/
http://blog.csdn.net/qfljg/article/details/4383043
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
