軟件測試數據庫中SQL Join連接詳解
SQL是高級的非過(guò)程化編程語(yǔ)言,允許用戶(hù)在高層數據結構上工作。它不要求用戶(hù)指定對數據的存放方法,也不需要用戶(hù)了解具體的數據存放方式,所以具有完全不同底層結構的不同數據庫系統,可以使用相同的SQL語(yǔ)言作為數據輸入與管理的 SQL
接口。它以記錄集合作為操作對象,所有SQL語(yǔ)句接受集合作為輸入,返回集合作為輸出,這種集合特性允許一條SQL語(yǔ)句的輸出作為另一條SQL語(yǔ)句的輸入,所以SQL語(yǔ)句可以嵌套,這使他具有極大的靈活性和強大的功能,在多數情況下,在其他語(yǔ)言中需要一大段程序實(shí)現的功能只需要一個(gè)SQL語(yǔ)句就可以達到目的,這也意味著(zhù)用SQL語(yǔ)言可以寫(xiě)出非常復雜的語(yǔ)句。 結構化查詢(xún)語(yǔ)言(Structured Query Language)最早是IBM的圣約瑟研究實(shí)驗室為其關(guān)系數據庫管理系統SYSTEM R開(kāi)發(fā)的一種查詢(xún)語(yǔ)言,它的前身是SQUARE語(yǔ)言。SQL語(yǔ)言結構簡(jiǎn)潔,功能強大,簡(jiǎn)單易學(xué),所以自從IBM公司1981年推出以來(lái),SQL語(yǔ)言得到了廣泛的應用。如今無(wú)論是像Oracle、Sybase、Informix、SQL Server這些大型的數據庫管理系統,還是像Visual Foxpro、PowerBuilder這些PC上常用的數據庫開(kāi)發(fā)系統,都支持SQL語(yǔ)言作為查詢(xún)語(yǔ)言。 美國國家標準局(ANSI)與國際標準化組織(ISO)已經(jīng)制定了SQL標準。ANSI是一個(gè)美國工業(yè)和商業(yè)集團組織,負責開(kāi)發(fā)美國的商務(wù)和通訊標準。ANSI同時(shí)也是ISO和International Electrotechnical Commission(IEC)的成員之一。ANSI 發(fā)布與國際標準組織相應的美國標準。1992年,ISO和IEC發(fā)布了SQL國際標準,稱(chēng)為SQL-92。ANSI隨之發(fā)布的相應標準是ANSI SQL-92。ANSI SQL-92有時(shí)被稱(chēng)為ANSI SQL。盡管不同的關(guān)系數據庫使用的SQL版本有一些差異,但大多數都遵循 ANSI SQL 標準。SQL Server使用ANSI SQL-92的擴展集,稱(chēng)為T(mén)-SQL,其遵循ANSI制定的 SQL-92標準。 SQL語(yǔ)言包含4個(gè)部分: ※ 數據定義語(yǔ)言(DDL),例如:CREATE、DROP、ALTER等語(yǔ)句。 ※ 數據操作語(yǔ)言(DML),例如:INSERT(插入)、UPDATE(修改)、DELETE(刪除)語(yǔ)句。 ※ 數據查詢(xún)語(yǔ)言(DQL),例如:SELECT語(yǔ)句。 ※ 數據控制語(yǔ)言(DCL),例如:GRANT、REVOKE、COMMIT、ROLLBACK等語(yǔ)句。 SQL語(yǔ)言包括三種主要程序設計語(yǔ)言類(lèi)別的語(yǔ)句:數據定義語(yǔ)言(DDL),數據操作語(yǔ)言(DML)及數據控制語(yǔ)言(DCL)。 SQL 是用于訪(fǎng)問(wèn)和處理數據庫的標準的計算機語(yǔ)言。 SQL 指結構化查詢(xún)語(yǔ)言 SQL 使我們有能力訪(fǎng)問(wèn)數據庫 SQL 是一種 ANSI 的標準計算機語(yǔ)言 編者注:ANSI,美國國家標準化組織
接下來(lái)給大家說(shuō)一下有關(guān)SQL Join連接詳解
連接類(lèi)型
在關(guān)系代數中,連接運算是由一個(gè)笛卡爾積運算和一個(gè)選取運算構成的。首先用笛卡爾積完成對兩個(gè)數據集合的乘運算,然后對生成的結果集合進(jìn)行選取運算,確保只把分別來(lái)自?xún)蓚(gè)數據集合并且具有重疊部分的行合并在一起。連接的全部意義在于在水平方向上合并兩個(gè)數據集合(通常是表),并產(chǎn)生一個(gè)新的結果集合,其方法是將一個(gè)數據源中的行于另一個(gè)數據源中和它匹配的行組合成一個(gè)新元組。
SQL提供了多種類(lèi)型的連接方式,它們之間的區別在于:從相互交疊的不同數據集合中選擇用于連接的行時(shí)所采用的方法不同。
連接類(lèi)型 定義
內連接 只連接匹配的行
左外連接 包含左邊表的全部行(不管右邊的表中是否存在與它們匹配的行),以及右邊表中全部匹配的行
右外連接 包含右邊表的全部行(不管左邊的表中是否存在與它們匹配的行),以及左邊表中全部匹配的行
全外連接 包含左、右兩個(gè)表的全部行,不管另外一邊的表中是否存在與它們匹配的行。
(H)(theta)連接 使用等值以外的條件來(lái)匹配左、右兩個(gè)表中的行
交叉連接 生成笛卡爾積-它不使用任何匹配或者選取條件,而是直接將一個(gè)數據源中的每個(gè)行與另一個(gè)數據源的每個(gè)行都一一匹配
在INFORMIX中連接表的查詢(xún)
如果FROM子句指定了多于一個(gè)表引用,則查詢(xún)會(huì )連接來(lái)自多個(gè)表的行。連接條件指定各列之間(每個(gè)表至少一列)進(jìn)行連接的關(guān)系。因為正在比較連接條件中的列,所以它們必須具有一致的數據類(lèi)型。
SELECT語(yǔ)句的FROM子句可以指定以下幾種類(lèi)型的連接
FROM子句關(guān)鍵字 相應的結果集
CROSS JOIN 笛卡爾乘積(所有可能的行對)
INNER JOIN 僅對滿(mǎn)足連接條件的CROSS中的列
LEFT OUTER JOIN 一個(gè)表滿(mǎn)足條件的行,和另一個(gè)表的所有行
RIGHT OUTER JOIN 與LEFT相同,但兩個(gè)表的角色互換
FULL OUTER JOIN LEFT OUTER 和 RIGHT OUTER中所有行的超集
2.2 內連接(Inner Join)
內連接是最常見(jiàn)的一種連接,它頁(yè)被稱(chēng)為普通連接,而E.FCodd最早稱(chēng)之為自然連接。
下面是ANSI SQL-92標準
select *
from t_institution i
inner join t_teller t
on i.inst_no = t.inst_no
where i.inst_no = "5801"
其中inner可以省略。
等價(jià)于早期的連接語(yǔ)法
select *
from t_institution i, t_teller t
where i.inst_no = t.inst_no
and i.inst_no = "5801"
2.3 外連接
2.3.1 左外連接(Left Outer Jion)
select *
from t_institution i
left outer join t_teller t
on i.inst_no = t.inst_no
其中outer可以省略。
2.3.2 右外連接(Rigt Outer Jion)
select *
from t_institution i
right outer join t_teller t
on i.inst_no = t.inst_no
2.3.3 全外連接(Full Outer)
全外連接返回參與連接的兩個(gè)數據集合中的全部數據,無(wú)論它們是否具有與之相匹配的行。在功能上,它等價(jià)于對這兩個(gè)數據集合分別進(jìn)行左外連接和右外連接,然后再使用消去重復行的并操作將上述兩個(gè)結果集合并為一個(gè)結果集。
在現實(shí)生活中,參照完整性約束可以減少對于全外連接的使用,一般情況下左外連接就足夠了。在數據庫中沒(méi)有利用清晰、規范的約束來(lái)防范錯誤數據情況下,全外連接就變得非常有用了,你可以使用它來(lái)清理數據庫中的數據。
select *
from t_institution i
full outer join t_teller t
on i.inst_no = t.inst_no
2.3.4 外連接與條件配合使用
當在內連接查詢(xún)中加入條件是,無(wú)論是將它加入到j(luò )oin子句,還是加入到where子句,其效果是完全一樣的,但對于外連接情況就不同了。當把條件加入到j(luò )oin子句時(shí),SQL Server、Informix會(huì )返回外連接表的全部行,然后使用指定的條件返回第二個(gè)表的行。如果將條件放到where子句中,SQL Server將會(huì )首先進(jìn)行連接操作,然后使用where子句對連接后的行進(jìn)行篩選。下面的兩個(gè)查詢(xún)展示了條件放置位子對執行結果的影響:
條件在join子句
select *
from t_institution i
left outer join t_teller t
on i.inst_no = t.inst_no
and i.inst_no = “5801”
結果是:
inst_no inst_name inst_no teller_no teller_name
5801 天河區 5801 0001 tom
5801 天河區 5801 0002 david
5802 越秀區
5803 白云區
條件在where子句
select *
from t_institution i
left outer join t_teller t
on i.inst_no = t.inst_no
where i.inst_no = “5801”
結果是:
inst_no inst_name inst_no teller_no teller_name
5801 天河區 5801 0001 tom
5801 天河區 5801 0002 david
2.4 自身連接
自身連接是指同一個(gè)表自己與自己進(jìn)行連接。這種一元連接通常用于從自反關(guān)系(也稱(chēng)作遞歸關(guān)系)中抽取數據。例如人力資源數據庫中雇員與老板的關(guān)系。
下面例子是在機構表中查找本機構和上級機構的信息。
select s.inst_no superior_inst, s.inst_name sup_inst_name, i.inst_no, i.inst_name
from t_institution i
join t_institution s
on i.superior_inst = s.inst_no
結果是:
superior_inst sup_inst_name inst_no inst_name
800 廣州市 5801 天河區
800 廣州市 &nbs
文章來(lái)源于領(lǐng)測軟件測試網(wǎng) http://kjueaiud.com/