二、 聯合查詢
UNION運算符可以將兩個或兩個以上上SELECT語句的查詢結果集合合并成一個結果集合顯示,即執行聯合查詢。UNION的語法格式為:
select_statement
UNION?[ALL]?selectstatement
[UNION?[ALL]?selectstatement][…n]
其中selectstatement為待聯合的SELECT查詢語句。
ALL選項表示將所有行合并到結果集合中。不指定該項時,被聯合查詢結果集合中的重復行將只保留一行。
聯合查詢時,查詢結果的列標題為第一個查詢語句的列標題。因此,要定義列標題必須在第一個查詢語句中定義。要對聯合查詢結果排序時,也必須使用第一查詢語句中的列名、列標題或者列序號。
在使用UNION 運算符時,應保證每個聯合查詢語句的選擇列表中有相同數量的表達式,并且每個查詢選擇表達式應具有相同的數據類型,或是可以自動將它們轉換為相同的數據類型。在自動轉換時,對于數值類型,系統將低精度的數據類型轉換為高精度的數據類型。
在包括多個查詢的UNION語句中,其執行順序是自左至右,使用括號可以改變這一執行順序。例如:
查詢1 UNION (查詢2 UNION 查詢3)
三、連接查詢
通過連接運算符可以實現多個表查詢。連接是關系數據庫模型的主要特點,也是它區別于其它類型數據庫管理系統的一個標志。
在關系數據庫管理系統中,表建立時各數據之間的關系不必確定,常把一個實體的所有信息存放在一個表中。當檢索數據時,通過連接操作查詢出存放在多個表中的不同實體的信息。連接操作給用戶帶來很大的靈活性,他們可以在任何時候增加新的數據類型。為不同實體創建新的表,爾后通過連接進行查詢。
連接可以在SELECT 語句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出連接時有助于將連接操作與WHERE子句中的搜索條件區分開來。所以,在Transact-SQL中推薦使用這種方法。
SQL-92標準所定義的FROM子句的連接語法格式為:
FROM?join_table?join_type?join_table
[ON?(join_condition)]
其中join_table指出參與連接操作的表名,連接可以對同一個表操作,也可以對多表操作,對同一個表操作的連接又稱做自連接。
join_type 指出連接類型,可分為三種:內連接、外連接和交叉連接。內連接(INNER JOIN)使用比較運算符進行表間某(些)列數據的比較操作,并列出這些表中與連接條件相匹配的數據行。根據所使用的比較方式不同,內連接又分為等值連接、自然連接和不等連接三種。外連接分為左外連接(LEFT OUTER JOIN或LEFT JOIN)、右外連接(RIGHT OUTER JOIN或RIGHT JOIN)和全外連接(FULL OUTER JOIN或FULL JOIN)三種。與內連接不同的是,外連接不只列出與連接條件相匹配的行,而是列出左表(左外連接時)、右表(右外連接時)或兩個表(全外連接時)中所有符合搜索條件的數據行。
交叉連接(CROSS JOIN)沒有WHERE 子句,它返回連接表中所有數據行的笛卡爾積,其結果集合中的數據行數等于第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。
連接操作中的ON (join_condition) 子句指出連接條件,它由被連接表中的列和比較運算符、邏輯運算符等構成。
無論哪種連接都不能對text、ntext和image數據類型列進行直接連接,但可以對這三種列進行間接連接。例如:
SELECT?p1.pub_id,p2.pub_id,p1.pr_info
FROM?pub_info?AS?p1?INNER?JOIN?pub_info?AS?p2
ON?DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)
(一)內連接
內連接查詢操作列出與連接條件匹配的數據行,它使用比較運算符比較被連接列的列值。內連接分三種:
1、等值連接:在連接條件中使用等于號(=)運算符比較被連接列的列值,其查詢結果中列出被連接表中的所有列,包括其中的重復列。
2、不等連接: 在連接條件使用除等于運算符以外的其它比較運算符比較被連接的列的列值。這些運算符包括>、>=、<=、<、!>、!<和<>。
3、自然連接:在連接條件中使用等于(=)運算符比較被連接列的列值,但它使用選擇列表指出查詢結果集合中所包括的列,并刪除連接表中的重復列。
例,下面使用等值連接列出authors和publishers表中位于同一城市的作者和出版社:
SELECT?*
FROM?authors?AS?a?INNER?JOIN?publishers?AS?p
ON?a.city=p.city
又如使用自然連接,在選擇列表中刪除authors 和publishers 表中重復列(city和state):
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 條件)和連接條件的行。而采用外連接時,它返回到查詢結果集合中的不僅包含符合連接條件的行,而且還包括左表(左外連接時)、右表(右外連接時)或兩個邊接表(全外連接)中的所有數據行。如下面使用左外連接將論壇內容和作者信息連接起來:
SELECT?a.*,b.*?FROM?luntan?LEFT?JOIN?usertable?as?b
ON?a.username=b.username
下面使用全外連接將city表中的所有作者以及user表中的所有作者,以及他們所在的城市:
SELECT?a.*,b.*
FROM?city?as?a?FULL?OUTER?JOIN?user?as?b
ON?a.username=b.username
(三)交叉連接
交叉連接不帶WHERE 子句,它返回被連接的兩個表所有數據行的笛卡爾積,返回到結果集合中的數據行數等于第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。例,titles表中有6類圖書,而publishers表中有8家出版社,則下列交叉連接檢索到的記錄數將等于6*8=48行。
SELECT?type,pub_name
FROM?titles?CROSS?JOIN?publishers
ORDER?BY?type

?
相關內容:(來自csdn論壇)
關于inner join,full outer join,left join,right jion的具體實現含義
--查詢分析器中執行:
--建表table1,table2:
create?table?table1(id?int,name?varchar(10))
create?table?table2(id?int,score?int)
insert?into?table1?select?1,'lee'
insert?into?table1?select?2,'zhang'
insert?into?table1?select?4,'wang'
insert?into?table2?select?1,90
insert?into?table2?select?2,100
insert?into?table2?select?3,70
如表
-------------------------------------------------
table1|table2|
-------------------------------------------------
idname|idscore|
1lee|190|
2zhang|2100|
4wang|370|
-------------------------------------------------
以下均在查詢分析器中執行
一、外連接
1.概念:包括左向外聯接、右向外聯接或完整外部聯接
2.左連接:left join 或 left outer join
(1)左向外聯接的結果集包括 LEFT OUTER 子句中指定的左表的所有行,而不僅僅是聯接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均為空值(null)。
(2)sql語句
select?*?from?table1?left?join?table2?on?table1.id=table2.id
-------------結果-------------
idnameidscore
------------------------------
1lee190
2zhang2100
4wangNULLNULL
------------------------------
注釋:包含table1的所有子句,根據指定條件返回table2相應的字段,不符合的以null顯示
3.右連接:right join 或 right outer join
(1)右向外聯接是左向外聯接的反向聯接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。
(2)sql語句
select?*?from?table1?right?join?table2?on?table1.id=table2.id
-------------結果-------------
idnameidscore
------------------------------
1lee190
2zhang2100
NULLNULL370
------------------------------
注釋:包含table2的所有子句,根據指定條件返回table1相應的字段,不符合的以null顯示
4.完整外部聯接:full join 或 full outer join
(1)完整外部聯接返回左表和右表中的所有行。當某行在另一個表中沒有匹配行時,則另一個表的選擇列表列包含空值。如果表之間有匹配行,則整個結果集行包含基表的數據值。
(2)sql語句
select?*?from?table1?full?join?table2?on?table1.id=table2.id
-------------結果-------------
idnameidscore
------------------------------
1lee190
2zhang2100
4wangNULLNULL
NULLNULL370
------------------------------
注釋:返回左右連接的和(見上左、右連接)
二、內連接
1.概念:內聯接是用比較運算符比較要聯接列的值的聯接
2.內連接:join 或 inner join
3.sql語句
select?*?from?table1?join?table2?on?table1.id=table2.id
-------------結果-------------
idnameidscore
------------------------------
1lee190
2zhang2100
------------------------------
注釋:只返回符合條件的table1和table2的列
4.等價(與下列執行效果相同)
A:select?a.*,b.*?from?table1?a,table2?b?where?a.id=b.id
B:select?*?from?table1?cross?join?table2?where?table1.id=table2.id
?(注:cross join后加條件只能用where,不能用on)
三、交叉連接(完全)
1.概念:沒有 WHERE 子句的交叉聯接將產生聯接所涉及的表的笛卡爾積。第一個表的行數乘以第二個表的行數等于笛卡爾積結果集的大小。(table1和table2交叉連接產生3*3=9條記錄)
2.交叉連接:cross join (不帶條件where...)
3.sql語句
select?*?from?table1?cross?join?table2
-------------結果-------------
idnameidscore
------------------------------
1lee190
2zhang190
4wang190
1lee2100
2zhang2100
4wang2100
1lee370
2zhang370
4wang370
------------------------------
注釋:返回3*3=9條記錄,即笛卡爾積
4.等價(與下列執行效果相同)
A:select?*?from?table1,table2?
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1376243