主頁(yè) > 知識(shí)庫(kù) > SQL查詢?nèi)腴T(中篇)

SQL查詢?nèi)腴T(中篇)

熱門標(biāo)簽:最新人工智能電銷機(jī)器人 成都電話外呼系統(tǒng)一般多少錢 數(shù)字匠心電銷機(jī)器人 al智能電話機(jī)器人 蘭州語(yǔ)音外呼系統(tǒng)運(yùn)營(yíng)商 如何做地圖標(biāo)注圖鋪 沒(méi)聽見電話機(jī)器人幫你接 陜西電銷外呼系統(tǒng)好用嗎 銀川高頻外呼回?fù)芟到y(tǒng)多少錢
引言
在前篇文章中(SQL查詢?nèi)腴T(上篇),我對(duì)數(shù)據(jù)庫(kù)查詢的基本概念以及單表查詢做了詳細(xì)的解釋,本篇文章中,主要說(shuō)明SQL中的各種連接以及使用范圍,以及更進(jìn)一步的解釋關(guān)系代數(shù)法和關(guān)系演算法對(duì)在同一條查詢的不同思路。

多表連接簡(jiǎn)介
在關(guān)系數(shù)據(jù)庫(kù)中,一個(gè)查詢往往會(huì)涉及多個(gè)表,因?yàn)楹苌儆袛?shù)據(jù)庫(kù)只有一個(gè)表,而如果大多查詢只涉及到一個(gè)表的,那么那個(gè)表也往往低于第三范式,存在大量冗余和異常。

因此,連接(Join)就是一種把多個(gè)表連接成一個(gè)表的重要手段.

比如簡(jiǎn)單兩個(gè)表連接學(xué)生表(Student)和班級(jí)(Class)表,如圖: 
   12

     進(jìn)行連接后如圖:

     3

笛卡爾積
      笛卡爾積在SQL中的實(shí)現(xiàn)方式既是交叉連接(Cross Join)。所有連接方式都會(huì)先生成臨時(shí)笛卡爾積表,笛卡爾積是關(guān)系代數(shù)里的一個(gè)概念,表示兩個(gè)表中的每一行數(shù)據(jù)任意組合,上圖中兩個(gè)表連接即為笛卡爾積(交叉連接)

      在實(shí)際應(yīng)用中,笛卡爾積本身大多沒(méi)有什么實(shí)際用處,只有在兩個(gè)表連接時(shí)加上限制條件,才會(huì)有實(shí)際意義,下面看內(nèi)連接

內(nèi)連接
      如果分步驟理解的話,內(nèi)連接可以看做先對(duì)兩個(gè)表進(jìn)行了交叉連接后,再通過(guò)加上限制條件(SQL中通過(guò)關(guān)鍵字on)剔除不符合條件的行的子集,得到的結(jié)果就是內(nèi)連接了.上面的圖中,如果我加上限制條件

      對(duì)于開篇中的兩個(gè)表,假使查詢語(yǔ)句如下:

復(fù)制代碼 代碼如下:

SELECT *
  FROM [Class] c
       inner join
       [Student] s
       on c.ClassID=s.StudentClassID

  可以將上面查詢語(yǔ)句進(jìn)行分部理解,首先先將Class表和Student表進(jìn)行交叉連接,生成如下表:
5

     然后通過(guò)on后面的限制條件,只選擇那些StudentClassID和ClassID相等的(上圖中劃了綠色的部分),最終,得到選擇后的表的子集

     4

當(dāng)然,內(nèi)連接on后面的限制條件不僅僅是等號(hào),還可以使用比較運(yùn)算符,包括了>(大于)、>=(大于或等于)、=(小于或等于)、(小于)、!>(不大于)、!(不小于)和>(不等于)。當(dāng)然,限制條件所涉及的兩個(gè)列的數(shù)據(jù)類型必須匹配.

對(duì)于上面的查詢語(yǔ)句,如果將on后面限制條件由等于改為大于:

復(fù)制代碼 代碼如下:

SELECT *
FROM [Class] c
inner join
[Student] s
on c.ClassID>s.StudentClassID

則結(jié)果從第一步的笛卡爾積中篩選出那些ClassID大于StudentClassID的子集:

6

雖然上面連接后的表并沒(méi)有什么實(shí)際意義,但這里僅僅作為DEMO使用:-)

關(guān)系演算
上面笛卡爾積的概念是關(guān)系代數(shù)中的概念,而我在前一篇文章中提到還有關(guān)系演算的查詢方法.上面的關(guān)系代數(shù)是分布理解的,上面的語(yǔ)句推導(dǎo)過(guò)程是這樣的:“對(duì)表Student和Class進(jìn)行內(nèi)連接,匹配所有ClassID和StudentClassID相等行,選擇所有的列”

而關(guān)系演算法,更多關(guān)注的是我想要什么,比如說(shuō)上面同樣查詢,用關(guān)系演算法思考的方式是“給我找到所有學(xué)生的信息,包括他們的班級(jí)信息,班級(jí)ID,學(xué)生ID,學(xué)生姓名”

用關(guān)系演算法的SQL查詢語(yǔ)句如下:

復(fù)制代碼 代碼如下:

SELECT *
FROM [Class] c
,
[Student] s
where c.ClassID=s.StudentClassID

當(dāng)然,查詢后返回的結(jié)果是不會(huì)變的:

4 
外連接
假設(shè)還是上面兩個(gè)表,學(xué)生和班級(jí).我在學(xué)生中添加一個(gè)名為Eric的學(xué)生,但出于某種原因忘了填寫它的班級(jí)ID:
7 2

當(dāng)我想執(zhí)行這樣一條查詢:給我取得所有學(xué)生的姓名和他們所屬的班級(jí):

標(biāo)簽:巴彥淖爾 本溪 通化 宜春 鹽城 遼源 邢臺(tái) 朔州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《SQL查詢?nèi)腴T(中篇)》,本文關(guān)鍵詞  SQL,查詢,入門,中篇,SQL,查詢,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《SQL查詢?nèi)腴T(中篇)》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于SQL查詢?nèi)腴T(中篇)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章