共計 3655 個字符,預計需要花費 10 分鐘才能閱讀完成。
本篇內(nèi)容主要講解“SQL 中的連接操作”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓丸趣 TV 小編來帶大家學習“SQL 中的連接操作”吧!
利用連接操作,可以根據(jù)表與表之間的邏輯聯(lián)系從兩個或多個表中查詢數(shù)據(jù)。
早期的 SQL 版本,實現(xiàn)連接方法是在 from 子句中給出連接操作的表名,在 where 子句中
給出連接條件。
例如,從學生、課程和成績表中,產(chǎn)生課程的成績單。from 子句列出連接運算的
3 個表,where 子句給出連接條件。在 where 子句的條件表達式中包含了連接條件和選擇
條件。
例 1 從學生、課程和成績表中,產(chǎn)生數(shù)據(jù)庫課程的成績單。SQL 語句是:
select 姓名,課程名,分數(shù)
from 學生 S,課程 C,成績 G
where S. 學號 =G. 學號 AND G. 課程號 =C. 課程號 AND C. 課程名稱 = 數(shù)據(jù)庫
middot;SQL-92 提供更豐富的連接操作,包括:內(nèi)連接、條件連接、自然連接、左外
連接、右外連接、全連接,同時增加了在 from 子句定義連接條件的方法。SQL-92 中 from
子句連接的語法格式:
from 表 1 連接類型 表 2 [on ( 連接條件)]
因此,上述產(chǎn)生學生數(shù)據(jù)庫課程成績單的 SQL 語句可以寫成:
select 姓名,課程名,分數(shù)
from 學生 S join 成績 G on (S. 學號 =G. 學號)
join 課程 C on (G. 課程號 =C. 課程號)
where C. 課程名稱 = 數(shù)據(jù)庫
middot; 這種方法不僅簡化連接條件的表達方法,更重要是提高查詢效率。
SQL 系統(tǒng)處理的邏輯順序是:
1、from 子句中的連接條件
2、where 子句中的連接條件與選擇條件
3、having 子句中的篩選條件
所以,在使用支持 SQL-92 標準的系統(tǒng)時,建議用 from 子句定義連接條件。
關(guān)系 R 和 S 進行連接操作,且連接條件為 P。若連接的結(jié)果中只保含 R 與 S 在 P 上相匹
配的元組,這種連接屬于內(nèi)連接(inner join)。用 from 子句表示內(nèi)連接的方法:
from R [inner] join S [on ( 連接條件)] 其中,inner 可省略。
自然連接是等值連接的特例。
middot; 設關(guān)系 R 和 S 進行連接操作,其連接條件為 P。如果 P 是 R 與 S 中連接屬性的
等值比較,稱為等值連接。
middot; 若 R 與 S 進行等值連接,且 R 與 S 的連接屬性名相同,稱為自然連接。
middot; 自然連接的實現(xiàn)方法是在內(nèi)連接的基礎上,用 select 子句消除重復列。
有關(guān)系 R 和 S,R 與 S 的笛卡兒乘積稱為交叉連接。交叉連接的實現(xiàn)方法:在 from 子
句中定義交叉連接類型:from R cross join S。
關(guān)系 R 與 S 進行連接操作,連接條件為 P。若連接操作的結(jié)果中除了 R 與 S 在 P 上內(nèi)連
接結(jié)果之外,還包括左邊關(guān)系 R 在內(nèi)連接操作中不相匹配的元組,而其對應于 S 的屬性賦予
空值,這種連接稱為左外連接。左外連接的表示方法:from R left outer join S on
(連接條件)
關(guān)系 R 與 S 進行連接操作,連接條件為 P。若連接操作的結(jié)果中除了 R 與 S 在 P 上內(nèi)連接
結(jié)果之外,還包括右邊關(guān)系 S 在內(nèi)連接操作中不相匹配的元組,而其對應于 R 的屬性賦予空值
,這種連接稱為右外連接。右外連接的表示方法:from R right outer join S on (連
接條件 )
全外連接是左外連接和右外連接的組合應用。全外連接的表示方法:from R full
outer join S on (連接條件)
自連接:連接操作可以利用別名的方法實現(xiàn)一個表自身的連接。實質(zhì)上,這種自身連接方法與
兩個表的連接操作完全相似。
一、內(nèi)連接
關(guān)系 R 和 S 進行連接操作,且連接條件為 P。若連接操作的結(jié)果中只包含 R 與 S 在 P 上相匹
配的行,這種連接屬于內(nèi)連接(inner join)。用 from 子句表示內(nèi)連接的子句:
from R [inner] join S [on ( 連接條件)]
其中,inner 可省略。假設有導師與研究生 2 個表。
例 1 查詢研究生與其導師的情況。此查詢涉及教師和研究生 2 個表,連接條件是:
研究生. 導師號 = 教師. 教工號。SQL 語句是:
select *from 研究生 A inner join 教師 B on A. 導師號 = B. 教工號
也可以寫成等價的 SQL 語句:
select *
from 研究生 A,教師 B
where A. 導師號 = B. 教工號
說明:這是一個內(nèi)連接的例子,查詢結(jié)果中只包含滿足連接條件的 4 行。
二、自然連接
設關(guān)系 R 和 S 進行連接操作,其連接條件為 P。如果 P 是 R 與 S 中連接屬性的等值比較,
稱為等值連接。若 R 與 S 進行等值連接,且 R 與 S 的連接屬性名相同,稱為自然連接。自然連
接是等值連接的特例。自然連接的實現(xiàn)方法是在內(nèi)連接的基礎上,用 select 子句消除重復
列。
假設有學生、課程和成績 3 個表。例 1:根據(jù)學生、課程和成績表的信息,輸出 數(shù)
據(jù)庫 課程的成績單,包括姓名和分數(shù)。SQL 語句是:
select 姓名,分數(shù)
from 學生 A join 成績 B on(A. 學號 =B. 學號)join 課程 C on(B. 課號 =C. 課號)
where C. 課程名 = 數(shù)據(jù)庫
等價的 SQL 語句:
select 姓名,分數(shù)
from 學生 A,成績 B,課程 C
where A. 學號 =B. 學號 AND B. 課號 = C. 課號 AND C. 課程名 = 數(shù)據(jù)庫
這是一個自然連接的實例,查詢結(jié)果中包含滿足連接條件的 1 行,在查詢結(jié)果中沒有重復列。
三、交叉連接
設有關(guān)系 R 和 S,R 與 S 的笛卡兒乘積稱為交叉連接。在 SQL 中,實現(xiàn)交叉連接的方法是在 from
子句中定義交叉連接類型:from R cross join S
例 1 學生與課程的笛卡兒乘積。
select *
from 學生 cross join 課程
等價的 SQL 語句:
select *
from 學生, 課程
四、左外連接
關(guān)系 R 與 S 進行連接操作,連接條件為 P。若連接操作的結(jié)果中除了 R 與 S 在 P 上內(nèi)連接結(jié)果之外,
還包括左邊關(guān)系 R 在內(nèi)連接操作中不相匹配的元組,而其對應于 S 的屬性賦予空值,這種連接
稱為左外連接(left outer join)。
實現(xiàn)左外連接的 SQL 子句:from R left outer join S on (連接條件)
例 1:查詢學生選課情況,包括沒有選課的學生在內(nèi)。SQL 語句是:
select A. 學號, A. 姓名, B. 課號, B. 分數(shù)
from 學生 A left outer join 成績 B on(A. 學號 = B. 學號)
例 2:查詢教師指導研究生的情況,包括不指導研究生的教師。SQL 語句是:
select *
from 教師 A left outer join 研究生 B on(A. 教工號 = B. 導師號)
這是兩個左外連接的實例,查詢結(jié)果中除了滿足連接條件元組的之外,還包含左邊關(guān)系不滿足
連接條件的元組,而其對應的右邊屬性全部填充 NULL。
五、右外連接
關(guān)系 R 與 S 進行連接操作,連接條件為 P。若連接操作的結(jié)果中除了 R 與 S 在 P 上內(nèi)連接結(jié)果之外,
還包括右邊關(guān)系 S 在內(nèi)連接操作中不相匹配的元組,而其對應于 R 的屬性賦予空值,這種連接
稱為右外連接(right outer join)。
實現(xiàn)右外連接的 SQL 子句:from R right outer join S on (連接條件)
例 1:查詢所開課程的選修情況,包括沒有任何學生選修的課程。SQL 語句是:
select *
from 成績 A right outer join 課程 B on(A. 課號 =B. 課號)
例 2:查詢所開課程和學生的學習狀況(學號、課程名和分數(shù)),其中還包括沒有任何學生選修
的課。SQL 語句是:
select 學號, 課程名, 分數(shù)
from 成績 A right outer join 課程 B on(A. 課號 =B. 課號)
這是 2 個右外連接的實例,查詢結(jié)果中除了滿足連接條件元組之外,還包含右邊關(guān)系不滿足連接
條件的元組,而其對應的左邊屬性全部填充 NULL。
六、全外連接
全外連接(full outer join)是左外連接和右外連接的組合應用。實現(xiàn)全外連接的 SQL 子句:
from R full outer join S on (連接條件)
例 1:查詢研究生和教師的情況,包括沒有導師的研究生和沒有指導研究生的教師。
SQL 語句是:
select *
from 研究生 A full outer join 教師 B on (A. 導師號 =B. 教工號)
這是全外連接的實例,查詢結(jié)果中除了滿足連接條件元組之外,還包含 2 個關(guān)系中不滿足
連接條件的元組,并且這些元組對應的屬性全部填充 NULL。
七、自連接
連接操作可以利用別名的方法實現(xiàn)一個表自身的連接。實質(zhì)上,這種自身連接方法與兩個表的
連接操作完全相似。假設有教學進度表,其中先修列是本門課程的先修課程。例如,先學習
數(shù)據(jù)結(jié)構(gòu) 課程,再學習 數(shù)據(jù)庫 課程。例 1:查詢每一門課的先修課的先修課。例如,C5 的
先修課的先修課是 C6。用自連接實現(xiàn)查詢,連接條件是:
from 教學進度 A join 教學進度 B on (A. 先修 =B. 課號)
select A. 課號,B. 先修
from 教學進度 A join 教學進度 B
on (A. 先修 =B. 課號)
到此,相信大家對“SQL 中的連接操作”有了更深的了解,不妨來實際操作一番吧!這里是丸趣 TV 網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!