數(shù)據(jù)庫筆記(十)——關(guān)系代數(shù)

基本運(yùn)算

每一種基本運(yùn)算的結(jié)果都是一個新的關(guān)系,可以用這個關(guān)系繼續(xù)參與運(yùn)算霹菊,借此便可進(jìn)行復(fù)雜的運(yùn)算

  • 選擇運(yùn)算(select)==>相當(dāng)于SQL語句中的WHERE子句的職能

    • 格式:σ選擇謂詞(關(guān)系)

    • 舉個栗子:
      • σSAL>1000(EMP)

      • 上式表示取出查詢工資大于1000的所有員工的信息

      • 等價于下面的SQL語句

      SELECT *
      FROM EMP
      WHERE SAL > 1000
      
    • 選擇謂詞的分類
      • 比較:=、≠蜈彼、<案狠、≤、>和≥
      • 連詞:and(∧)延都、or(∨)和not(?)==>可以將多個謂詞合并成一個大的謂詞
      • 可以包括兩個屬性(字段的比較):σCOMM>SAL(EMP)表示抽成大于工資的人
  • 投影運(yùn)算(project)==>相當(dāng)于SQL語句中的SELECT子句的職能

    • 格式:∏字段序列(關(guān)系)

    • 舉個栗子
      • ENAME,SAL(EMP)

      • 上式表示查看所有員工的姓名和工資

      • 等價于下面的SQL語句

      SELECT ENAME, SAL
      FROM EMP
      
  • 關(guān)系的組合運(yùn)算==>就像SQL中select、where子句那樣的組合效果

    • 舉個栗子
      • ENAME,SALSAL>1000(EMP))

      • 上面的式子求出了所有工資大于1000的員工的名字和工資(實際上就是將σSAL>1000(EMP)執(zhí)行的結(jié)果當(dāng)做一個臨時的關(guān)系睛竣,參與了投影運(yùn)算得到的)

      • 等價于下面的SQL語句

      SELECT ENAME, SAL
      FROM EMP
      WHERE SAL > 1000
      
    • 事實關(guān)系的組合運(yùn)算就是那么簡單晰房,分析的時候把每個簡單運(yùn)算的結(jié)果當(dāng)做一個新的關(guān)系參與后面的運(yùn)算,這樣一層層剝開來射沟,再復(fù)雜的語句也變得容易分析
  • 并運(yùn)算(union)==>相當(dāng)于SQL中UNION關(guān)鍵字的職能

    • 格式:(關(guān)系r)∪(關(guān)系s)

    • 舉個栗子
      • ENAME,SALSAL>1000(EMP)) ∪ ∏ENAME,SALCOMM>300(EMP))

      • 上面的式子求出了所有工資大于1000或抽成大于300的員工的姓名和工資殊者,等價于下面的SQL語句

      SELECT ENAME, SAL
      FROM EMP
      WHERE SAL > 1000
      UNION
      SELECT ENAME, SAL
      FROM EMP
      WHERE COMM > 300
      
    • 幾點(diǎn)需要額外注意的
      • 此處的并運(yùn)算是集合運(yùn)算,所以結(jié)果是去重的验夯,結(jié)果集中不存在重復(fù)的元組(而在SQL語句中猖吴,指定UNION ALL是可以保留重復(fù)的

      • 關(guān)系r與關(guān)系s必須是同元的,即它們的屬性的數(shù)目要求必須相同(這就和SQL語句中UNION使用的時候要求上下兩個語句的字段數(shù)相同是一樣的意思)

      • 關(guān)系r和關(guān)系s對應(yīng)位置的屬性域應(yīng)該是類型兼容的(同樣和SQL中UNION使用時挥转,每個對應(yīng)位置字段類型兼容是一樣的意思)

  • 集合的差運(yùn)算(set-defference)==>相當(dāng)于SQL語句中的EXCEPT

    • 格式:(關(guān)系r)-(關(guān)系s)

    • 舉個栗子
      • ENAME,SALSAL>1000(EMP)) - ∏ENAME,SALCOMM>300(EMP))
      • 上面的式子表示工資大于1000但抽成不大于300的員工的姓名和工資海蔽,等價于下面的SQL語句
      SELECT ENAME, SAL
      FROM EMP
      WHERE SAL > 1000
      EXCEPT
      SELECT ENAME, SAL
      FROM EMP
      WHERE COMM > 300
      
    • 幾點(diǎn)需要額外注意的
      • 此處的注意同上面的并運(yùn)算的注意事項
  • 笛卡爾積運(yùn)算(Cartesian-product)==>等價于SQL語句中兩個表進(jìn)行笛卡爾積(全匹配)得到的結(jié)果共屈,即SQL中進(jìn)行多表連接時不指定連接條件的情況

    • 格式:(關(guān)系r)×(關(guān)系)

    • 舉個栗子:
      • EMP × DEPT
      • 上面的式子表示兩個表進(jìn)行全匹配,等價于下面的SQL語句
      SELECT *
      FROM EMP, DEPT
      
    • 下面兩個式子是等價的
      • ENAME,DNAMEEMP.DEPTNO=DEPT.DEPTNOJOB="MANAGER"(EMP×DEPT)))
      • ENAME,DNAMEEMP.DEPTNO=DEPT.DEPTNO((σJOB="MANAGER"(EMP))×DEPT)
      • 下面是對這兩個式子的SQL轉(zhuǎn)化党窜,轉(zhuǎn)化之后就一目了然了
        -- 對應(yīng)第一個式子
        SELECT ENAME, DNAME
        FROM EMP JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO
        WHERE JOB = 'MANAGER'
        
        -- 對應(yīng)第二個式子
        SELECT ENAME, DNAME
        FROM DEPT JOIN (SELECT *
                        FROM EMP
                        WHERE JOB = 'MANAGER')
                  ON EMP.DEPTNO = DEPT.DEPTNO
        
  • 更名運(yùn)算(rename)==>等價于SQL語句中as的職能

    • 格式:ρX(A1,A2,...,An)(E)==>表示的是將關(guān)系E更名為X趁俊,Ai表示的是給E的第i個字段指定別名

    • 舉個栗子
      • ENAME,DNAMEe.DEPTNO=d.DEPTNOJOB="MANAGER"e(EMP)×ρd(DEPT))))
      • 上面式子含義就不解釋了,是上面舉的栗子刑然,只是引入了更名運(yùn)算符,它等價于下面的SQL語句
      SELECT ENAME, DNAME
      FROM EMP e JOIN DEPT d ON e.DEPTNO = d.DEPTNO
      WHERE JOB = 'MANAGER'
      
  • 來暇务,學(xué)習(xí)完上面的基本運(yùn)算泼掠,來做個實際的栗子,要求找到員工表中的最高工資(因為目前還沒有介紹類似SQL中組函數(shù)的操作垦细,后面會介紹择镇。所以通過以下方式來實現(xiàn))

    • step1: 找到所有不是最高工資的人
      • e1.SALe1.sal < e2.sale1(EMP)×ρe2(EMP)))
    • step2: 用所有的員工減去上面的員工,即得到最高工資
      • SAL(EMP) - ∏e1.SALe1.sal < e2.sale1(EMP)×ρe2(EMP)))
  • 在書寫關(guān)系運(yùn)算表達(dá)式的時候可以用序列號代替字段名(但是不直觀括改,不常用腻豌,一般不用)

    • 舉個栗子
      • $6$6 < $14(EMP×EMP))
      • 等價于下面的運(yùn)算
      • e1.SALe1.sal < e2.sale1(EMP)×ρe2(EMP)))

附加運(yùn)算

附加運(yùn)算是由基本運(yùn)算組成的,不能增強(qiáng)基本運(yùn)算的運(yùn)算能力嘱能,但是能簡化運(yùn)算

  • 集合交運(yùn)算(intersection)==>相當(dāng)于SQL語句中INTERSECT關(guān)鍵字的職能

    • 格式:(關(guān)系r)∩(關(guān)系s)

    • 因為集合交運(yùn)算是可以由前面的基本運(yùn)算組合產(chǎn)生的吝梅,所以把它歸到附加運(yùn)算
      • A ∩ B <=> A - (A - B)
    • 舉個栗子
      • ENAME,SALSAL>1000(EMP)) ∩ ∏ENAME,SALCOMM>300(EMP))
      • 上面的式子表示工資大于1000并且抽成大于300的員工的姓名和工資,等價于下面的SQL語句
      SELECT ENAME, SAL
      FROM EMP
      WHERE SAL > 1000
      INTERSECT
      SELECT ENAME, SAL
      FROM EMP
      WHERE COMM > 300
      
  • 自然連接(natural join)==> 相當(dāng)于SQL語句中的NATURAL JOIN

    • 格式:(關(guān)系)?(關(guān)系)

    • 自然連接的形式化定義

      • r,s是兩個關(guān)系
      • R惹骂,S是上面兩個關(guān)系對應(yīng)的關(guān)系模式(其實就是上述兩個關(guān)系各自的屬性列表)
      • R ∩ S 表示r和s的同名屬性列表
      • R ∪ S 表示出現(xiàn)在r或s上的屬性名列表(是一個集合苏携,不包同名屬性,存在同名屬性會去重)
      • R - S 表示出現(xiàn)在R上对粪,但不出現(xiàn)在S上的屬性名列表
      • 則可做如下定義
      • r?s = ∏R∪Sr.A1=s.A1 ∧ r.A2=s.A2 ∧ ... ∧ r.An=s.An(r×s)) 右冻,其中 R∩S={A1, A2, ..., An}
    • 舉個栗子
      • name, course_id(instructor ? teaches)
      • 上面的式子列出了所有老師的名字以及其所授課程的id,等價于下面的SQL語句
      SELECT name, course_id
      FROM intructor natural join teaches
      

    ps: 兩個關(guān)系模式執(zhí)行自然連接以后屬性的排布順序:

    • 排在最前面的是兩個關(guān)系模式相同的屬性
    • 其次是只屬于第一個關(guān)系模式的屬性
    • 最后是只屬于第二個關(guān)系模式的屬性

    V谩I磁ぁ!所以所兩個關(guān)系模式進(jìn)行自然連接以后儡遮,總的屬性的個數(shù)是減少了乳蛾,具體減少的個數(shù)等于同名屬性的個數(shù)

  • theta連接==>是帶限定條件的笛卡爾積

    • 格式:(關(guān)系)?Θ(關(guān)系)

    • 形式化定義:
      • r ?Θ s = σΘ(r × s)
    • 舉個栗子
      • name, course_id(instructor ?instructor.ID = teaches.ID ∧ instructor.salary > 5000 teaches)
      • 上面的式子表示列出所有工資大于5000的老師的名字以及其所授課程的id, 等價于下面的SQL語句
      -- 使用 join...on 的時候 on 后面寫連接條件鄙币,然后將其它條件放在where里
      SELECT name, course_id
      FROM instructor join teaches on instructor.ID = teaches.ID
      WHERE instructor.salary > 5000     
      
  • 除運(yùn)算(division)

    這個在書上沒講屡久,是老師上課的時候補(bǔ)充的

    • 格式:(關(guān)系)÷(關(guān)系)

    • 形式化定義:
      R÷S = ∏R∪S( ( ∏R-S(r) × S ) - ∏R-S, S(r) )
    • 解釋起來挺麻煩的,這邊給出一個博客鏈接:點(diǎn)我
  • 賦值運(yùn)算

    就是將一個關(guān)系表達(dá)式的結(jié)果賦值取一個臨時的名字爱榔,就相當(dāng)于定義了一個臨時關(guān)系被环。這個操作就相當(dāng)于SQL中with語句的職能

    • 格式: temp_name ← 關(guān)系表達(dá)式

    • 舉個栗子:
      temp1 ← R × S
      temp2 ← σr.A1=s.A1 ∧ r.A2=s.A2 ∧ ... ∧ r.An=s.An(temp1)
      result = ∏R∪S(temp2)
    • 上面的式子等價于: result = r?s
  • 外連接運(yùn)算

    • 左外連:?
    • 右外連:?
    • 全外連:?

擴(kuò)展運(yùn)算

擴(kuò)展運(yùn)算是不能用基本的關(guān)系代數(shù)運(yùn)算來實現(xiàn)的一類查詢,可以滿足復(fù)雜的查詢需求

  • 廣義投影(Generalized-projection)

    與基本運(yùn)算中的投影運(yùn)算相比详幽,就是多了允許在選擇列表中出現(xiàn)表達(dá)式(在基本運(yùn)算中的投影的選擇列表中只能出現(xiàn)字段)

    • 格式:∏F1, F2, ... , Fn(E)

      • 其中F1, F2, ... , Fn可以是字段或者是表達(dá)式
      • E代表一個關(guān)系
    • 舉個栗子:
      • name, sal * 1.2(instructor)

      • 上面的式子表示查出所有老師的名字筛欢,以及漲了20%以后的工資浸锨,等價于下面的SQL語句

      SELECT name, sal * 1.2
      FROM instructor
      
  • 聚集函數(shù)(Aggregation function)

    聚集函數(shù)的符號表示是用書寫體G,這邊就直接用G指代了

    聚集函數(shù)是輸入值的一個匯聚版姑,以多個值作為輸入柱搜,將一個單一的值作為返回結(jié)果

    多重集:使用聚集函數(shù)對其進(jìn)行操作的匯集中,一個值可以出現(xiàn)多次剥险,值出現(xiàn)的順序是無關(guān)緊要的聪蘸。這樣的匯集稱為多重集(就比方說統(tǒng)計一個員工表中員工的數(shù)量,然后我們通過統(tǒng)計員工的名字來統(tǒng)計表制,即便是同名的員工我們也是計算的)

    • 格式: G1, G2, ... , GnGF1(A1), F2(A2), ..., Fn(An)(E)

      • 其中前面的G1, G2, ... , Gn表示的是分組條件
      • 后面的F1(A1), F2(A2), ..., Fn(An)是聚集函數(shù)表達(dá)式列表
      • Fi(i = 1, 2, ..., n)表示聚集函數(shù):sum健爬、count、average么介、max娜遵、min
      • A1, A2, ... , An代表字段
    • 舉個栗子:
      • A1, A2Gsum(A3)(∏A1, A2, ..., AnP(r1×r2×...×rm)) )
      • 等價于下面的SQL語句
      SELECT A1, A2, sum(A3)
      FROM r1, r2, ..., rm
      WHERE P
      GROUP BY A1, A2
      
    • 上面的聚集函數(shù)在進(jìn)行計算的時候采用的都是多重集,也就是相同的值可以多次重復(fù)計算(也就是在執(zhí)行聚集函數(shù)的時候是不去重計算)壤短,如果要去重計算的話就要采用下面的幾個函數(shù)寫法
      • sum_distinct
      • count_distinct
      • averag_distinct
      • max_distinct
      • min_distinct
    • 舉個栗子:
      • A1, A2Gsum_distinct(A3)(∏A1, A2, ..., AnP(r1×r2×...×rm)) )
      • 上面的式子等價于下面的SQL語句
      SELECT A1, A2, sum(distinct A3)
      FROM r1, r2, ..., rm
      WHERE P
      GROUP BY A1, A2
      
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末设拟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子久脯,更是在濱河造成了極大的恐慌纳胧,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帘撰,死亡現(xiàn)場離奇詭異躲雅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)骡和,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門相赁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人慰于,你說我怎么就攤上這事钮科。” “怎么了婆赠?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵绵脯,是天一觀的道長。 經(jīng)常有香客問我休里,道長蛆挫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任妙黍,我火速辦了婚禮悴侵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拭嫁。我一直安慰自己可免,他們只是感情好抓于,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著浇借,像睡著了一般捉撮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上妇垢,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天巾遭,我揣著相機(jī)與錄音,去河邊找鬼闯估。 笑死灼舍,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的睬愤。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼纹安,長吁一口氣:“原來是場噩夢啊……” “哼尤辱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起厢岂,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤光督,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后塔粒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體结借,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年卒茬,在試婚紗的時候發(fā)現(xiàn)自己被綠了船老。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡圃酵,死狀恐怖柳畔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情郭赐,我是刑警寧澤薪韩,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站捌锭,受9級特大地震影響俘陷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜观谦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一拉盾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧豁状,春花似錦盾剩、人聲如沸雷激。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屎暇。三九已至,卻和暖如春驻粟,著一層夾襖步出監(jiān)牢的瞬間根悼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工蜀撑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挤巡,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓酷麦,卻偏偏與公主長得像矿卑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子沃饶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1.簡介 數(shù)據(jù)存儲有哪些方式母廷?電子表格,紙質(zhì)文件糊肤,數(shù)據(jù)庫琴昆。 那么究竟什么是關(guān)系型數(shù)據(jù)庫? 目前對數(shù)據(jù)庫的分類主要是...
    喬震閱讀 1,707評論 0 2
  • 5.多表查詢 多表查詢 目的:從多張表獲取數(shù)據(jù) 前提:進(jìn)行連接的多張表中有共同的列 等連接 通過兩個表具有相同意義...
    喬震閱讀 1,209評論 0 0
  • mysql數(shù)據(jù)庫中 :database : 文件夾table : 數(shù)據(jù)表(數(shù)據(jù)文件) 進(jìn)入mysqlmysql -...
    賦閑閱讀 558評論 0 0
  • oracle 數(shù)據(jù)庫的scott帳號馆揉。 <>作為查詢條件時业舍,可以使用!= 來替換升酣。 SQL> select * f...
    莊棟棟閱讀 2,130評論 0 0
  • 捉迷藏似乎一直都是小朋友們孜孜不倦喜歡的一種游戲噩茄。 我記得我小時候就很喜歡玩脚牍,那個時候男生女生在操場上一起玩,很是...
    蘇蘇柳的寫寫畫畫閱讀 210評論 0 1