旗下產(chǎn)業(yè): A產(chǎn)業(yè)/?A實(shí)習(xí)/?A計(jì)劃
全國統(tǒng)一咨詢熱線:010-5367 2995
首頁 > 熱門文章 > 大數(shù)據(jù)分析 > 大數(shù)據(jù)分析中關(guān)系數(shù)據(jù)庫SQL的設(shè)計(jì)思想

大數(shù)據(jù)分析中關(guān)系數(shù)據(jù)庫SQL的設(shè)計(jì)思想

時(shí)間:2020-12-16來源:lb577.com點(diǎn)擊量:作者:Sissi
時(shí)間:2020-12-16點(diǎn)擊量:作者:Sissi



  數(shù)據(jù)分析中關(guān)系數(shù)據(jù)庫的設(shè)計(jì)思想介紹關(guān)系數(shù)據(jù)庫的設(shè)計(jì)思想:在 SQL 中,一切皆關(guān)系。關(guān)系數(shù)據(jù)庫同樣也有自己的設(shè)計(jì)思想:在 SQL 中,一切皆關(guān)系。
 

一、關(guān)系模型
 

  關(guān)系模型(Relational model)由 E.F.Codd 博士于 1970 年提出,以集合論中的關(guān)系概念為基礎(chǔ);無論是現(xiàn)實(shí)世界中的實(shí)體對(duì)象還是它們之間的聯(lián)系都使用關(guān)系表示。我們?cè)跀?shù)據(jù)庫系統(tǒng)中看到的關(guān)系就是二維表(Table),由行(Row)和列(Column)組成。因此,也可以說關(guān)系表是由數(shù)據(jù)行構(gòu)成的集合。

大數(shù)據(jù)分析中關(guān)系數(shù)據(jù)庫SQL的設(shè)計(jì)思想
 

  關(guān)系模型由數(shù)據(jù)結(jié)構(gòu)、關(guān)系操作、完整性約束三部分組成。
 

  1)關(guān)系模型中的數(shù)據(jù)結(jié)構(gòu)就是關(guān)系表,包括基礎(chǔ)表、派生表(查詢結(jié)果)和虛擬表(視圖)。
 

  2)常用的關(guān)系操作包括增加、刪除、修改和查詢(CRUD),使用的就是 SQL 語言。其中查詢操作最為復(fù)雜,包括選擇(Selection)、投影(Projection)、并集(Union)、交集(Intersection)、差集(Exception)以及笛卡兒積(Cartesian product)等。
 

  3)完整性約束用于維護(hù)數(shù)據(jù)的完整性或者滿足業(yè)務(wù)約束的需求,包括實(shí)體完整性(主鍵約束)、參照完整性(外鍵約束)以及用戶定義的完整性(非空約束、唯一約束、檢查約束和默認(rèn)值)。
 

  我們今天的主題是關(guān)系操作語言,也就是 SQL。
 

二、面向集合
 

  SQL(結(jié)構(gòu)化查詢語言)是操作關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)語言。SQL 非常接近英語,使用起來非常簡單。它在設(shè)計(jì)之初就考慮了非技術(shù)人員的使用需求,我們通常只需說明想要的結(jié)果(What),而將數(shù)據(jù)處理的過程(How)交給數(shù)據(jù)庫管理系統(tǒng)。所以說,SQL才是真正給人用的編程語言!
 

  接下來我們具體分析一下關(guān)系的各種操作語句;目的是為了讓大家能夠了解 SQL 是一種面向集合的編程語言,它的操作對(duì)象是集合,操作的結(jié)果也是集合。
 

  在關(guān)系數(shù)據(jù)庫中,關(guān)系、表、集合三者通常表示相同的概念。
 

三、SELECT
 

  下面是一個(gè)簡單的查詢語句:

大數(shù)據(jù)分析中關(guān)系數(shù)據(jù)庫SQL的設(shè)計(jì)思想
 

  它的作用就是從 employees 表中查詢員工信息。
 

  顯然,我們都知道 FROM 之后是一個(gè)表(關(guān)系、集合)。不僅如此,整個(gè)查詢語句的結(jié)果也是一個(gè)表。
 

  所以,我們可以將上面的查詢作為表使用:

大數(shù)據(jù)分析中關(guān)系數(shù)據(jù)庫SQL的設(shè)計(jì)思想
 

  括號(hào)內(nèi)的查詢語句被稱為派生表,我們給它指定了一個(gè)別名叫做t。同樣,整個(gè)查詢結(jié)果也是一個(gè)表;這就意味著我們可以繼續(xù)嵌套,雖然這么做很無聊。
 

  我們?cè)倏匆粋€(gè)PostgreSQL中的示例:

大數(shù)據(jù)分析中關(guān)系數(shù)據(jù)庫SQL的設(shè)計(jì)思想
 

  upper()是一個(gè)大寫轉(zhuǎn)換的函數(shù)。它出現(xiàn)再FROM子句中,意味著它的結(jié)果也是一個(gè)表,只不過是1行1列的特殊表。
 

  SELECT 子句用于指定需要查詢的字段,可以包含表達(dá)式、函數(shù)值等。SELECT 在關(guān)系操作中被稱為投影(Projection),看下面的示意圖應(yīng)該就比較好理解了。

大數(shù)據(jù)分析中關(guān)系數(shù)據(jù)庫SQL的設(shè)計(jì)思想
 

  除了SELECT之外,還有一些常用的 SQL 子句。
 

  WHERE用于指定數(shù)據(jù)過濾的條件,在關(guān)系運(yùn)算中被稱為選擇(Selection),示意圖如下:

大數(shù)據(jù)分析中關(guān)系數(shù)據(jù)庫SQL的設(shè)計(jì)思想
大數(shù)據(jù)分析中關(guān)系數(shù)據(jù)庫SQL的設(shè)計(jì)思想
 

  ORDER BY用于對(duì)查詢的結(jié)果進(jìn)行排序,示意圖如下:

大數(shù)據(jù)分析中關(guān)系數(shù)據(jù)庫SQL的設(shè)計(jì)思想

  總之,SQL 可以完成各種數(shù)據(jù)操作,例如過濾、分組、排序、限定數(shù)量等;所有這些操作的對(duì)象都是關(guān)系表,結(jié)果也是關(guān)系表。

大數(shù)據(jù)分析中關(guān)系數(shù)據(jù)庫SQL的設(shè)計(jì)思想
 

  在這些關(guān)系操作中,有一個(gè)比較特殊,就是分組。
 

四、GROUP BY
 

  分組( GROUP BY)操作和其他的關(guān)系操作不同,因?yàn)樗淖兞岁P(guān)系的結(jié)構(gòu)。來看下面的示例:

大數(shù)據(jù)分析中關(guān)系數(shù)據(jù)庫SQL的設(shè)計(jì)思想
 

  該語句的目的是按照部門統(tǒng)計(jì)員工的數(shù)量,但是存在一個(gè)語法錯(cuò)誤,就是 first_name 不能出現(xiàn)在查詢列表中。原因在于按照部門進(jìn)行分組的話,每個(gè)部門包含多個(gè)員工;無法確定需要顯示哪個(gè)員工的姓名,這是一個(gè)邏輯上的錯(cuò)誤。
 

  所以說,GROUP BY 改變了集合元素(數(shù)據(jù)行)的結(jié)構(gòu),創(chuàng)建了一個(gè)全新的關(guān)系。
 

  分組操作的示意圖如下:

大數(shù)據(jù)分析中關(guān)系數(shù)據(jù)庫SQL的設(shè)計(jì)思想
 

  盡管如此,GROUP BY 的結(jié)果仍然是一個(gè)集合。
 

五、UNION
 

  SQL 面向集合特性最明顯的體現(xiàn)就是:
 

  1)UNION(并集運(yùn)算)

  2)INTERSECT(交集運(yùn)算)

  3)EXCEPT/MINUS(差集運(yùn)算)
 

  這些集合運(yùn)算符的作用都是將兩個(gè)集合并成一個(gè)集合,因此需要滿足以下條件:
 

  1)兩邊的集合中字段的數(shù)量和順序必須相同;

  2)兩邊的集合中對(duì)應(yīng)字段的類型必須匹配或兼容。
 

  具體來說,UNION 和 UNION ALL 用于計(jì)算兩個(gè)集合的并集,返回出現(xiàn)在第一個(gè)查詢結(jié)果或者第二個(gè)查詢結(jié)果中的數(shù)據(jù)。
 

  它們的區(qū)別在于 UNION排除了結(jié)果中的重復(fù)數(shù)據(jù),UNION ALL保留了重復(fù)數(shù)據(jù)。
 

  下面是 UNION 操作的示意圖:

大數(shù)據(jù)分析中關(guān)系數(shù)據(jù)庫SQL的設(shè)計(jì)思想
 

  INTERSECT 操作符用于返回兩個(gè)集合中的共同部分,即同時(shí)出現(xiàn)在第一個(gè)查詢結(jié)果和第二個(gè)查詢結(jié)果中的數(shù)據(jù),并且排除了結(jié)果中的重復(fù)數(shù)據(jù)。
 

  INTERSECT 運(yùn)算的示意圖如下:

大數(shù)據(jù)分析中關(guān)系數(shù)據(jù)庫SQL的設(shè)計(jì)思想
 

  EXCEPT 或者 MINUS 操作符用于返回兩個(gè)集合的差集,即出現(xiàn)在第一個(gè)查詢結(jié)果中,但不在第二個(gè)查詢結(jié)果中的記錄,并且排除了結(jié)果中的重復(fù)數(shù)據(jù)。
 

  EXCEPT 運(yùn)算符的示意圖如下:

大數(shù)據(jù)分析中關(guān)系數(shù)據(jù)庫SQL的設(shè)計(jì)思想
 

  除此之外,DISTINCT 運(yùn)算符用于消除重復(fù)數(shù)據(jù),也就是排除集合中的重復(fù)元素。
 

  SQL 中的關(guān)系概念來自數(shù)學(xué)中的集合理論,因此 UNION、INTERSECT 和 EXCEPT 分別來自集合論中的并集(∪\cup∪)、交集(∩\cap∩)和差集(?\setminus?)運(yùn)算。
 

  需要注意的是,集合理論中的集合不允許存在重復(fù)的數(shù)據(jù),但是 SQL 允許。因此,SQL 中的集合也被稱為多重集合(multiset);多重集合與集合理論中的集合都是無序的,但是 SQL 可以通過 ORDER BY 子句對(duì)查詢結(jié)果進(jìn)行排序。
 

六、JOIN
 

  在 SQL 中,不僅實(shí)體對(duì)象存儲(chǔ)在關(guān)系表中,對(duì)象之間的聯(lián)系也存儲(chǔ)在關(guān)系表中。因此,當(dāng)我們想要獲取這些相關(guān)的數(shù)據(jù)時(shí),需要使用到另一個(gè)操作:連接查詢(JOIN)。
 

  常見的 SQL連接查類型包括內(nèi)連接、外連接、交叉連接等。其中,外連接又可以分為左外連接、右外連接以及全外連接。
 

  內(nèi)連接(Inner Join)返回兩個(gè)表中滿足連接條件的數(shù)據(jù),內(nèi)連接的原理如下圖所示:

大數(shù)據(jù)分析中關(guān)系數(shù)據(jù)庫SQL的設(shè)計(jì)思想
 

  左外連接(Left Outer Join)返回左表中所有的數(shù)據(jù);對(duì)于右表,返回滿足連接條件的數(shù)據(jù);如果沒有就返回空值。
 

  左外連接的原理如下圖所示:
 

大數(shù)據(jù)分析中關(guān)系數(shù)據(jù)庫SQL的設(shè)計(jì)思想

  右外連接(Right Outer Join)返回右表中所有的數(shù)據(jù);對(duì)于左表,返回滿足連接條件的數(shù)據(jù),如果沒有就返回空值。右外連接與左外連接可以互換,以下兩者等價(jià):

大數(shù)據(jù)分析中關(guān)系數(shù)據(jù)庫SQL的設(shè)計(jì)思想
 

  全外連接(Full Outer Join)等價(jià)于左外連接加上右外連接,同時(shí)返回左表和右表中所有的數(shù)據(jù);對(duì)于兩個(gè)表中不滿足連接條件的數(shù)據(jù)返回空值。
 

  全外連接的原理如下圖所示:

大數(shù)據(jù)分析中關(guān)系數(shù)據(jù)庫SQL的設(shè)計(jì)思想
 

  交叉連接也稱為笛卡爾積(Cartesian Product)。兩個(gè)表的交叉連接相當(dāng)于一個(gè)表的所有行和另一個(gè)表的所有行兩兩組合,結(jié)果的數(shù)量為兩個(gè)表的行數(shù)相乘。
 

  交叉連接的原理如下圖所示:

大數(shù)據(jù)分析中關(guān)系數(shù)據(jù)庫SQL的設(shè)計(jì)思想
 

  其他類型的連接還有半連接(SEMI JOIN)、反連接(ANTI JOIN)。
 

  集合操作將兩個(gè)集合合并成一個(gè)更大或更小的集合;連接查詢將兩個(gè)集合轉(zhuǎn)換成一個(gè)更大或更小的集合,同時(shí)獲得了一個(gè)更大的元素(更多的列)。很多時(shí)候集合操作都可以通過連接查詢來實(shí)現(xiàn),例如:

大數(shù)據(jù)分析中關(guān)系數(shù)據(jù)庫SQL的設(shè)計(jì)思想
 

  等價(jià)于:

大數(shù)據(jù)分析中關(guān)系數(shù)據(jù)庫SQL的設(shè)計(jì)思想
 

  我們已經(jīng)介紹了許多查詢的示例,接下來看看其他的數(shù)據(jù)操作。
 

七、DML
 

  DML 表示數(shù)據(jù)操作語言,也就是插入、更新和刪除。以下是一個(gè)插入語句示例:

大數(shù)據(jù)分析中關(guān)系數(shù)據(jù)庫SQL的設(shè)計(jì)思想
 

  我們通過一個(gè) INSERT 語句插入了 3 條記錄,或者說是插入了一個(gè)包含 3 條記錄的關(guān)系表。因?yàn)椋琔NION ALL 返回的是一個(gè)關(guān)系表。VALUES 同樣是指定了一個(gè)關(guān)系表,在 SQL Server 和 PostgreSQL 中支持以下語句:

大數(shù)據(jù)分析中關(guān)系數(shù)據(jù)庫SQL的設(shè)計(jì)思想
 

  前面我們已經(jīng)說過,F(xiàn)ROM 之后是一個(gè)關(guān)系表,所以這里的 VALUES 也是一樣。由于我們經(jīng)常插入單條記錄,并沒有意識(shí)到實(shí)際上是以表為單位進(jìn)行操作。
 

  同樣,UPDATE 和 DELETE 語句也都是以關(guān)系表為單位的操作;只不過我們習(xí)慣了說更新一行數(shù)據(jù)或者刪除幾條記錄。


 

預(yù)約申請(qǐng)免費(fèi)試聽課

填寫下面表單即可預(yù)約申請(qǐng)免費(fèi)試聽!怕錢不夠?可先就業(yè)掙錢后再付學(xué)費(fèi)! 怕學(xué)不會(huì)?助教全程陪讀,隨時(shí)解惑!擔(dān)心就業(yè)?一地學(xué)習(xí),可推薦就業(yè)!

?2007-2021/北京漫動(dòng)者教育科技有限公司版權(quán)所有
備案號(hào):京ICP備12034770號(hào)

?2007-2022/ lb577.com 北京漫動(dòng)者數(shù)字科技有限公司 備案號(hào): 京ICP備12034770號(hào) 監(jiān)督電話:010-53672995 郵箱:bjaaa@aaaedu.cc

京公網(wǎng)安備 11010802035704號(hào)

網(wǎng)站地圖