數(shù)據(jù)庫(二)2018-08-24

1. MySQL是一個關(guān)系型數(shù)據(jù)庫, 關(guān)系型數(shù)據(jù)庫描述的就是實體與實體之間的關(guān)系.聊到實體與實體之間的關(guān)系(表與表之間的關(guān)系), 就勢必要聊到約束:
約束的作用: 
    保證數(shù)據(jù)的完整性.
單表約束:
    主鍵約束: primary key   //一般后邊還會寫上auto_increment
    唯一約束: unique
    非空約束: not null
    
多表約束:
    外鍵約束: foreign key
    

案例:
    創(chuàng)建一個部門表(dept) 和 員工信息表(employee), 
    正常的邏輯應(yīng)該是, 先刪除員工, 再清除部門, 
    而如果這兩張表之間沒有主外鍵約束的話, 就可以直接刪除部門, 而沒有先清除該部門的員工, 這樣做是不符合實際生活中的邏輯的.
  1. 可視化界面的使用
    SQLyog
3. 多表的分析和設(shè)計
在實際開發(fā)中, 經(jīng)常會向數(shù)據(jù)庫中創(chuàng)建多個表, 而且多個表之間都是有關(guān)系的.

關(guān)系分類:
    一對多的關(guān)系:
        一個部門可以有多個員工, 一個員工只能屬于某一個部門. 
        一個分類下有多個商品, 一個商品只能屬于某一個分類.
        一個用戶產(chǎn)生多個訂單, 一個訂單只能屬于某一個用戶.
    
    多對多的關(guān)系:
        一個學(xué)生可以選擇多門課程, 一個課程也可以被多個學(xué)生選擇.
        一個訂單包含多個商品, 一個商品也可以在多個訂單中.
    
    一對一的關(guān)系: 
        一個公司只能對應(yīng)一個注冊地址, 一個注冊地址只能對應(yīng)一個公司.
4. 多表建表原則:
一對多的建表原則:
    在"多"的一方創(chuàng)建一個字段, 作為外鍵, 指向"一"的一方的主鍵.
    
    
多對多的建表原則:
    需要創(chuàng)建第三張表(中間表), 在中間表中至少需要有兩個字段, 分別作為外鍵指向多對多雙方的主鍵.
    
    
一對一的建表原則:
    唯一外鍵對應(yīng):
        示例:
            公司表
                cid int primary key auto_increment
                cname varchar(20)
                
            地址表:
                aid int primary key auto_increment
                aname varchar(20)
                
                //再新建一列: cno int unique 
    
    主鍵對應(yīng):
        兩張表的主鍵保證一一對應(yīng).
5. 多表查詢
    連接查詢:
        交叉連接(了解即可):
            select * from A,B;      //最終結(jié)果獲取到的是兩個表的笛卡爾積, 一般不用這種做法.
            
        內(nèi)連接:(inner join)
            顯示內(nèi)連接:
                select * from A inner join B on 條件;
            隱式內(nèi)連接:
                select * from A,B where 條件;
                
        外連接:(outer join)
            左外連接:
                select * from A left outer join B on 條件;
            右外連接:
                select * from A right outer join B on 條件;
    
    
        內(nèi)連接和外連接的區(qū)別:
            內(nèi)連接:    查到的是 兩個表的交集.
            左外連接:   左邊表的全部 和 兩個表的交集.
            右外連接:   右邊表的全部 和 兩個表的交集.
    
    子查詢:
        概述:
            指的是一條語句的查詢條件需要依賴另一條語句的查詢結(jié)果.
            in:    只要滿足其中一個就行.
            any:   只要比給定的所有值中的任意一個大(小)就行.
            all:   必須比給定的所有值都要大(小).
        需求:
            查詢收入在5000元及其以上的員工的所在部門;
                SELECT * FROM dept WHERE did IN (SELECT dno FROM employee WHERE salary >= 5000);
            查詢部門編號比"收入在5000元及其以上的員工所在部門編號任意一個" 大的 所有部門的名稱及部門編號
                select * from dept where did > any(select dno from employee where salary >=5000);
                
            查詢部門編號比"收入在5000元及其以上的員工所在部門編號任意一個" 都大的 所有部門的名稱及部門編號
                select * from dept where did > all(select dno from employee where salary >=5000);
6. 事務(wù)
概述: 
    事務(wù)指的是邏輯上的一組操作, 組成這組操作的各個邏輯單元要么全部都成功, 要么全失敗.
    
    //MySQL中默認情況下,一條語句是一個事務(wù), 事務(wù)會自動提交.  
    //Oracle中默認事務(wù)是不提交的, 需要手動提交事務(wù).

MySQL事務(wù)管理的命令:
    start transaction;      //開啟事務(wù)
    SQL語句1;             //要執(zhí)行的SQL語句
    SQL語句2;         
    commit                  //提交事務(wù)
    rollback;               //回滾事務(wù)
    
    show variables like '%commit%';
    
    
事務(wù)的特性:
    1. 原子性.
        強調(diào)事務(wù)的多個操作不可分割.  
    2. 一致性.
        強調(diào)事務(wù)執(zhí)行的前后, 數(shù)據(jù)完整性保持一致.
    3. 隔離性
        強調(diào)事務(wù)執(zhí)行過程中, 不應(yīng)該受到其他事務(wù)的干擾.
    4. 持久性
        強調(diào)事務(wù)一旦結(jié)束, 數(shù)據(jù)就持久到數(shù)據(jù)庫中.
        
如果不考慮事務(wù)的隔離性, 有可能會引發(fā)一些安全性的問題.
    讀的方面:
        臟讀:     指的是一個事務(wù)讀到另一個事務(wù)未提交的數(shù)據(jù).
        不可重復(fù)讀: 指的是一個事務(wù)讀到了另一個事務(wù)已經(jīng)提交的 update的數(shù)據(jù), 
                    導(dǎo)致多次查詢結(jié)果不一致.
        虛讀/幻讀:  指的是一個事務(wù)讀到了另一個事務(wù)已經(jīng)提交的 insert的數(shù)據(jù),
                    導(dǎo)致多次查詢結(jié)果不一致.
    寫的方面: (了解就行, 不用重點掌握)
        丟失更新.
    
    
    解決事務(wù)的讀問題:
        設(shè)置事務(wù)的隔離級別:
            read uncommitted:   //未提交讀
                臟讀, 不可重復(fù)讀, 虛讀都有可能發(fā)生.
            read committed:     //已提交數(shù)據(jù)庫
                避免臟讀, 但是不可重復(fù)讀和虛讀是有可能發(fā)生的.
            repeatable read:    //可重復(fù)讀
                避免臟讀, 不可重復(fù)讀. 但是虛讀是有可能發(fā)生的.
            serializable: 串行化的
                避免臟讀, 不可重復(fù)讀, 虛讀
                
        安全性:
            read uncommitted < read committed < repeatable read< Serializable
        效率:
            read uncommitted > read committed > repeatable read  > Serializable
            
    一般數(shù)據(jù)庫設(shè)置: read committed 和 repeatable read
        MySQL默認:    repeatable read
        Oracle默認: read committed
7.演示:
    演示"臟讀"的產(chǎn)生:
        1. 開啟兩個cmd窗口A, B.
        2. 查看當(dāng)前的事務(wù)的隔離級別:
            select @@tx_isolation
            //默認為: repeatable read
        3. 將A窗口的隔離級別修改為: read uncommitted;
            set session transaction isolation level read uncommitted;
        4. 再次查看下兩個窗口的的隔離級別:
            select @@tx_isolation;
        5. 在A, B兩個窗口中分別開啟事務(wù):
        6. 在B窗口中完成轉(zhuǎn)賬.
            //注意: 先不要提交事務(wù).
        7. 在A窗口中進行查詢.
            //發(fā)現(xiàn)轉(zhuǎn)賬已經(jīng)成功, 說明臟讀已經(jīng)發(fā)生了.
            //臟讀: 一個事物讀取到另一個事務(wù)未提交的數(shù)據(jù).
        
    
    演示"不可重復(fù)讀"的產(chǎn)生:
        1. 開啟兩個cmd窗口A, B.
        2. 查看當(dāng)前的事務(wù)的隔離級別:
            select @@tx_isolation
            //默認為: repeatable read
        3. 將A窗口的隔離級別修改為: read committed;
            set session transaction isolation level read committed;
        4. 再次查看下兩個窗口的的隔離級別:
            select @@tx_isolation;
        5. 在A, B兩個窗口中分別開啟事務(wù):
        6. 在B窗口中完成轉(zhuǎn)賬.
            //注意: 先不要提交事務(wù).
        7. 在A窗口中進行查詢.
            //發(fā)現(xiàn)A窗口中的數(shù)據(jù)沒有變化, 說明臟讀沒有發(fā)生.
            //臟讀: 一個事物讀取到另一個事務(wù)未提交的數(shù)據(jù).
        8. 在B窗口中提交事務(wù).
            //發(fā)現(xiàn)A窗口中的數(shù)據(jù)已經(jīng)變化了, 說明"不可重復(fù)讀"已經(jīng)產(chǎn)生了,
            //不可重復(fù)讀: 指的是一個事務(wù)讀到了另一個事務(wù)已經(jīng)提交的 update的數(shù)據(jù), 
            //導(dǎo)致多次查詢結(jié)果不一致.
        
    避免演示"不可重復(fù)讀"的產(chǎn)生:
        1. 開啟兩個cmd窗口A, B.
        2. 查看當(dāng)前的事務(wù)的隔離級別:
            select @@tx_isolation
            //默認為: repeatable read
        3. 將A窗口的隔離級別修改為: repeatable read;
            set session transaction isolation level repeatable read;
        4. 再次查看下兩個窗口的的隔離級別:
            select @@tx_isolation;
        5. 在A, B兩個窗口中分別開啟事務(wù):
        6. 在B窗口中完成轉(zhuǎn)賬.
            //主要: 先不要提交事務(wù).
        7. 在A窗口中進行查詢.
            //發(fā)現(xiàn)A窗口中的數(shù)據(jù)沒有變化, 說明臟讀沒有發(fā)生.
            //臟讀: 一個事物讀取到另一個事務(wù)未提交的數(shù)據(jù).
        8. 在B窗口中提交事務(wù).
            //發(fā)現(xiàn)A窗口中的數(shù)據(jù)已經(jīng)變化了, 說明"不可重復(fù)讀"已經(jīng)產(chǎn)生了,
            //不可重復(fù)讀: 指的是一個事務(wù)讀到了另一個事務(wù)已經(jīng)提交的 update的數(shù)據(jù), 
            //導(dǎo)致多次查詢結(jié)果不一致.  
        
    演示: Serializable 串行化的
8. truncate table 和 delete from 區(qū)別?
//truncate(重置),  delete(刪除表數(shù)據(jù)), drop(刪除數(shù)據(jù)庫, 數(shù)據(jù)表)
truncate table:
    可以清除數(shù)據(jù), 而且會重置Id, 相當(dāng)于是: 把表摧毀了, 然后創(chuàng)建一張和該表一模一樣的表.
    屬于DDL語句, 不可以結(jié)合 事務(wù)使用.

delete from:
    可以清除數(shù)據(jù), 但是不會重置id.
    屬于DML語句, 可以結(jié)合 事務(wù) 使用.
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蹈胡,一起剝皮案震驚了整個濱河市沐绒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌全度,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件械哟,死亡現(xiàn)場離奇詭異漓雅,居然都是意外死亡,警方通過查閱死者的電腦和手機畏鼓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來壶谒,“玉大人云矫,你說我怎么就攤上這事『共耍” “怎么了让禀?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵挑社,是天一觀的道長。 經(jīng)常有香客問我巡揍,道長痛阻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任吼肥,我火速辦了婚禮录平,結(jié)果婚禮上麻车,老公的妹妹穿的比我還像新娘缀皱。我一直安慰自己,他們只是感情好动猬,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布啤斗。 她就那樣靜靜地躺著,像睡著了一般赁咙。 火紅的嫁衣襯著肌膚如雪钮莲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天彼水,我揣著相機與錄音崔拥,去河邊找鬼。 笑死凤覆,一個胖子當(dāng)著我的面吹牛链瓦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播盯桦,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼慈俯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拥峦?” 一聲冷哼從身側(cè)響起贴膘,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎略号,沒想到半個月后刑峡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡玄柠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年突梦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片随闪。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡阳似,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铐伴,到底是詐尸還是另有隱情撮奏,我是刑警寧澤俏讹,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站畜吊,受9級特大地震影響泽疆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜玲献,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一殉疼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捌年,春花似錦瓢娜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至托酸,卻和暖如春褒颈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背励堡。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工谷丸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人应结。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓刨疼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親摊趾。 傳聞我的和親對象是個殘疾皇子币狠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

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