溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

SQL中的連接操作

發(fā)布時(shí)間:2021-08-16 21:52:02 來(lái)源:億速云 閱讀:195 作者:chen 欄目:數(shù)據(jù)庫(kù)

本篇內(nèi)容主要講解“SQL中的連接操作”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“SQL中的連接操作”吧!

利用連接操作,可以根據(jù)表與表之間的邏輯聯(lián)系從兩個(gè)或多個(gè)表中查詢(xún)數(shù)據(jù)。

早期的SQL版本,實(shí)現(xiàn)連接方法是在from子句中給出連接操作的表名,在where子句中

給出連接條件。

例如,從學(xué)生、課程和成績(jī)表中,產(chǎn)生課程的成績(jī)單。from子句列出連接運(yùn)算的

3個(gè)表,where子句給出連接條件。在where子句的條件表達(dá)式中包含了連接條件和選擇

條件。

      例1 從學(xué)生、課程和成績(jī)表中,產(chǎn)生數(shù)據(jù)庫(kù)課程的成績(jī)單。SQL語(yǔ)句是:

      select 姓名,課程名,分?jǐn)?shù)

      from學(xué)生S,課程C,成績(jī)G

      where S.學(xué)號(hào)=G.學(xué)號(hào)AND G.課程號(hào)=C.課程號(hào)AND C.課程名稱(chēng)='數(shù)據(jù)庫(kù)'

·SQL-92提供更豐富的連接操作,包括:內(nèi)連接、條件連接、自然連接、左外

連接、右外連接、全連接,同時(shí)增加了在from子句定義連接條件的方法。SQL-92中from

子句連接的語(yǔ)法格式:

      from <表1> <連接類(lèi)型> <表2> [on (<連接條件>)]

因此,上述產(chǎn)生學(xué)生數(shù)據(jù)庫(kù)課程成績(jī)單的SQL語(yǔ)句可以寫(xiě)成:

      select 姓名,課程名,分?jǐn)?shù)

      from 學(xué)生S join 成績(jī)G on (S.學(xué)號(hào)=G.學(xué)號(hào))

      join課程C on (G.課程號(hào)=C.課程號(hào))

      where C.課程名稱(chēng)='數(shù)據(jù)庫(kù)'

&middot; 這種方法不僅簡(jiǎn)化連接條件的表達(dá)方法,更重要是提高查詢(xún)效率。

   SQL系統(tǒng)處理的邏輯順序是:

          1、from子句中的連接條件

          2、where子句中的連接條件與選擇條件

          3、having子句中的篩選條件

所以,在使用支持SQL-92標(biāo)準(zhǔn)的系統(tǒng)時(shí),建議用from子句定義連接條件。

      關(guān)系R和S進(jìn)行連接操作,且連接條件為P。若連接的結(jié)果中只保含R與S在P上相匹

配的元組,這種連接屬于內(nèi)連接(inner join)。用from子句表示內(nèi)連接的方法:

from R [inner] join S [on (<連接條件>)] 其中,inner可省略。

      自然連接是等值連接的特例。

          &middot;設(shè)關(guān)系R和S進(jìn)行連接操作,其連接條件為P。如果P是R與S中連接屬性的

等值比較,稱(chēng)為等值連接。

          &middot;若R與S進(jìn)行等值連接,且R與S的連接屬性名相同,稱(chēng)為自然連接。

          &middot;自然連接的實(shí)現(xiàn)方法是在內(nèi)連接的基礎(chǔ)上,用select子句消除重復(fù)列。

      有關(guān)系R和S,R與S的笛卡兒乘積稱(chēng)為交叉連接。交叉連接的實(shí)現(xiàn)方法:在from子

句中定義交叉連接類(lèi)型:from R cross join S。

      關(guān)系R與S進(jìn)行連接操作,連接條件為P。若連接操作的結(jié)果中除了R與S在P上內(nèi)連

接結(jié)果之外,還包括左邊關(guān)系R在內(nèi)連接操作中不相匹配的元組,而其對(duì)應(yīng)于S的屬性賦予

空值,這種連接稱(chēng)為左外連接。左外連接的表示方法:from R left outer join S on

(<連接條件>)

      關(guān)系R與S進(jìn)行連接操作,連接條件為P。若連接操作的結(jié)果中除了R與S在P上內(nèi)連接

結(jié)果之外,還包括右邊關(guān)系S在內(nèi)連接操作中不相匹配的元組,而其對(duì)應(yīng)于R的屬性賦予空值

,這種連接稱(chēng)為右外連接。右外連接的表示方法:from R right outer join S on (<連

接條件>)

      全外連接是左外連接和右外連接的組合應(yīng)用。全外連接的表示方法:from R full

outer join S on (<連接條件>)

自連接:連接操作可以利用別名的方法實(shí)現(xiàn)一個(gè)表自身的連接。實(shí)質(zhì)上,這種自身連接方法與

兩個(gè)表的連接操作完全相似。

      一、內(nèi)連接

      關(guān)系R和S進(jìn)行連接操作,且連接條件為P。若連接操作的結(jié)果中只包含R與S在P上相匹

配的行,這種連接屬于內(nèi)連接(inner join)。用from子句表示內(nèi)連接的子句:

from R [inner] join S [on (<連接條件>)]

其中,inner可省略。假設(shè)有導(dǎo)師與研究生2個(gè)表。

例1 查詢(xún)研究生與其導(dǎo)師的情況。此查詢(xún)涉及教師和研究生2個(gè)表,連接條件是:

<研究生.導(dǎo)師號(hào)=教師.教工號(hào)>。SQL語(yǔ)句是:

      select *from 研究生A inner join教師B on A.導(dǎo)師號(hào)= B.教工號(hào)

  也可以寫(xiě)成等價(jià)的SQL語(yǔ)句:

      select *

      from 研究生A,教師B

      where A.導(dǎo)師號(hào)= B.教工號(hào)

      說(shuō)明:這是一個(gè)內(nèi)連接的例子,查詢(xún)結(jié)果中只包含滿(mǎn)足連接條件的4行。

      二、自然連接

      設(shè)關(guān)系R和S進(jìn)行連接操作,其連接條件為P。如果P是R與S中連接屬性的等值比較,

稱(chēng)為等值連接。若R與S進(jìn)行等值連接,且R與S的連接屬性名相同,稱(chēng)為自然連接。自然連

接是等值連接的特例。自然連接的實(shí)現(xiàn)方法是在內(nèi)連接的基礎(chǔ)上,用select子句消除重復(fù)

列。

      假設(shè)有學(xué)生、課程和成績(jī)3個(gè)表。例1:根據(jù)學(xué)生、課程和成績(jī)表的信息,輸出"數(shù)

據(jù)庫(kù)"課程的成績(jī)單,包括姓名和分?jǐn)?shù)。SQL語(yǔ)句是:

      select 姓名,分?jǐn)?shù)

      from 學(xué)生A join 成績(jī)B on(A.學(xué)號(hào)=B.學(xué)號(hào))join 課程C on(B.課號(hào)=C.課號(hào))

      where C.課程名='數(shù)據(jù)庫(kù)'

等價(jià)的SQL語(yǔ)句:

      select 姓名,分?jǐn)?shù)

      from 學(xué)生A,成績(jī)B,課程C

      where A.學(xué)號(hào)=B.學(xué)號(hào)AND B.課號(hào)= C.課號(hào)AND C.課程名='數(shù)據(jù)庫(kù)'

這是一個(gè)自然連接的實(shí)例,查詢(xún)結(jié)果中包含滿(mǎn)足連接條件的1行,在查詢(xún)結(jié)果中沒(méi)有重復(fù)列。

      三、交叉連接

設(shè)有關(guān)系R和S,R與S的笛卡兒乘積稱(chēng)為交叉連接。在SQL中,實(shí)現(xiàn)交叉連接的方法是在from

子句中定義交叉連接類(lèi)型:from R cross join S

例1 學(xué)生與課程的笛卡兒乘積。

      select *

      from 學(xué)生cross join 課程

等價(jià)的SQL語(yǔ)句:

      select *

      from 學(xué)生, 課程

      四、左外連接

關(guān)系R與S進(jìn)行連接操作,連接條件為P。若連接操作的結(jié)果中除了R與S在P上內(nèi)連接結(jié)果之外,

還包括左邊關(guān)系R在內(nèi)連接操作中不相匹配的元組,而其對(duì)應(yīng)于S的屬性賦予空值,這種連接

稱(chēng)為左外連接(left outer join)。

實(shí)現(xiàn)左外連接的SQL子句:from R left outer join S on (<連接條件>)

例1:查詢(xún)學(xué)生選課情況,包括沒(méi)有選課的學(xué)生在內(nèi)。SQL語(yǔ)句是:

      select A.學(xué)號(hào), A.姓名, B.課號(hào), B.分?jǐn)?shù)

      from 學(xué)生A left outer join成績(jī)B on (A.學(xué)號(hào)= B.學(xué)號(hào))

例2:查詢(xún)教師指導(dǎo)研究生的情況,包括不指導(dǎo)研究生的教師。SQL語(yǔ)句是:

      select *

      from 教師A left outer join研究生B on (A.教工號(hào)= B.導(dǎo)師號(hào))

這是兩個(gè)左外連接的實(shí)例,查詢(xún)結(jié)果中除了滿(mǎn)足連接條件元組的之外,還包含左邊關(guān)系不滿(mǎn)足

連接條件的元組,而其對(duì)應(yīng)的右邊屬性全部填充N(xiāo)ULL。

      五、右外連接

關(guān)系R與S進(jìn)行連接操作,連接條件為P。若連接操作的結(jié)果中除了R與S在P上內(nèi)連接結(jié)果之外,

還包括右邊關(guān)系S在內(nèi)連接操作中不相匹配的元組,而其對(duì)應(yīng)于R的屬性賦予空值,這種連接

稱(chēng)為右外連接(right outer join)。

實(shí)現(xiàn)右外連接的SQL子句:from R right outer join S on (<連接條件>)

例1:查詢(xún)所開(kāi)課程的選修情況,包括沒(méi)有任何學(xué)生選修的課程。SQL語(yǔ)句是:

      select *

      from 成績(jī)A right outer join 課程B on(A.課號(hào)=B.課號(hào))

例2:查詢(xún)所開(kāi)課程和學(xué)生的學(xué)習(xí)狀況(學(xué)號(hào)、課程名和分?jǐn)?shù)),其中還包括沒(méi)有任何學(xué)生選修

的課。SQL語(yǔ)句是:

      select 學(xué)號(hào), 課程名, 分?jǐn)?shù)

      from 成績(jī)A right outer join 課程B on(A.課號(hào)=B.課號(hào))

這是2個(gè)右外連接的實(shí)例,查詢(xún)結(jié)果中除了滿(mǎn)足連接條件元組之外,還包含右邊關(guān)系不滿(mǎn)足連接

條件的元組,而其對(duì)應(yīng)的左邊屬性全部填充N(xiāo)ULL。

      六、全外連接

全外連接(full outer join)是左外連接和右外連接的組合應(yīng)用。實(shí)現(xiàn)全外連接的SQL子句:

      from R full outer join S on (<連接條件>)

      例1:查詢(xún)研究生和教師的情況,包括沒(méi)有導(dǎo)師的研究生和沒(méi)有指導(dǎo)研究生的教師。

SQL語(yǔ)句是:

      select *

      from研究生A full outer join 教師B on (A.導(dǎo)師號(hào)=B.教工號(hào))

    這是全外連接的實(shí)例,查詢(xún)結(jié)果中除了滿(mǎn)足連接條件元組之外,還包含2個(gè)關(guān)系中不滿(mǎn)足

連接條件的元組,并且這些元組對(duì)應(yīng)的屬性全部填充N(xiāo)ULL。

      七、自連接

連接操作可以利用別名的方法實(shí)現(xiàn)一個(gè)表自身的連接。實(shí)質(zhì)上,這種自身連接方法與兩個(gè)表的

連接操作完全相似。假設(shè)有教學(xué)進(jìn)度表,其中先修列是本門(mén)課程的先修課程。例如,先學(xué)習(xí)

"數(shù)據(jù)結(jié)構(gòu)"課程,再學(xué)習(xí)"數(shù)據(jù)庫(kù)"課程。例1:查詢(xún)每一門(mén)課的先修課的先修課。例如,C5的

先修課的先修課是C6。用自連接實(shí)現(xiàn)查詢(xún),連接條件是:

from 教學(xué)進(jìn)度A join 教學(xué)進(jìn)度B on (A.先修=B.課號(hào))

      select A.課號(hào),B.先修

      from 教學(xué)進(jìn)度A join 教學(xué)進(jìn)度B

      on (A.先修=B.課號(hào))

到此,相信大家對(duì)“SQL中的連接操作”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

sql
AI