1.關(guān)系
1.1創(chuàng)建成績(jī)表scores,結(jié)構(gòu)如下
id
學(xué)生
科目
成績(jī)
思考:學(xué)生列應(yīng)該存什么信息呢?
答:學(xué)生列的數(shù)據(jù)不是在這里新建的,而應(yīng)該從學(xué)生表引用過來醉拓,關(guān)系也是一條數(shù)據(jù);根據(jù)范式要求應(yīng)該存儲(chǔ)學(xué)生的編號(hào)收苏,而不是學(xué)生的姓名等其它信息
同理亿卤,科目表也是關(guān)系列,引用科目表中的數(shù)據(jù)
創(chuàng)建scores表的語句如下:
1.2外鍵的級(jí)聯(lián)操作
在刪除students表的數(shù)據(jù)時(shí)鹿霸,如果這個(gè)id值在scores中已經(jīng)存在排吴,則會(huì)拋異常
推薦使用邏輯刪除,還可以解決這個(gè)問題
可以創(chuàng)建表時(shí)指定級(jí)聯(lián)操作懦鼠,也可以在創(chuàng)建表后再修改外鍵的級(jí)聯(lián)操作
語法
alter table scores add constraint stu_sco foreign key(stuid) references students(id) on delete cascade;
級(jí)聯(lián)操作的類型包括:
restrict(限制):默認(rèn)值钻哩,拋異常
cascade(級(jí)聯(lián)):如果主表的記錄刪掉,則從表中相關(guān)聯(lián)的記錄都將被刪除
set null:將外鍵設(shè)置為空
no action:什么都不做
2.多表連查
2.1當(dāng)查詢結(jié)果來源于多張表時(shí)肛冶,需要使用連接查詢
關(guān)鍵:找到表間的關(guān)系街氢,當(dāng)前的關(guān)系是
students表的id---scores表的stuid
subjects表的id---scores表的subid
則上面問題的答案是:
結(jié)論:當(dāng)需要對(duì)有關(guān)系的多張表進(jìn)行查詢時(shí),需要使用連接join
2.2連接查詢
連接查詢分類如下:
表A inner join 表B:表A與表B匹配的行會(huì)出現(xiàn)在結(jié)果中
表A left join 表B:表A與表B匹配的行會(huì)出現(xiàn)在結(jié)果中睦袖,外加表A中獨(dú)有的數(shù)據(jù)珊肃,未對(duì)應(yīng)的數(shù)據(jù)使用null填充
表A right join 表B:表A與表B匹配的行會(huì)出現(xiàn)在結(jié)果中,外加表B中獨(dú)有的數(shù)據(jù)馅笙,未對(duì)應(yīng)的數(shù)據(jù)使用null填充
在查詢或條件中推薦使用“表名.列名”的語法
如果多個(gè)表中列名不重復(fù)可以省略“表名.”部分
如果表的名稱太長(zhǎng)伦乔,可以在表名后面使用' as 簡(jiǎn)寫名'或' 簡(jiǎn)寫名',為表起個(gè)臨時(shí)的簡(jiǎn)寫名稱
3.自關(guān)聯(lián)
簡(jiǎn)單的來說就是表的某一列關(guān)聯(lián)著表的另外一列董习,就拿省和城市來說
如上圖所示設(shè)計(jì)的表結(jié)構(gòu)就要?jiǎng)?chuàng)建兩張表烈和,如果再加上區(qū)、縣阱飘、街道等等斥杜,就要?jiǎng)?chuàng)建多張數(shù)據(jù)表虱颗,這樣對(duì)表的性能沒有最大化的運(yùn)用沥匈,新增的表也會(huì)增大開銷,觀察發(fā)現(xiàn)可以將兩張表合并成一張表如下圖所示
可以給province這張表添加一個(gè)字段proid,設(shè)置為null,這樣provinces表和city表就可以合并成一張表areas,創(chuàng)建areas表的語句如下
4.視圖
對(duì)于復(fù)雜的查詢忘渔,在多次使用后高帖,維護(hù)是一件非常麻煩的事情
解決:定義視圖
視圖本質(zhì)就是對(duì)查詢的一個(gè)封裝
定義視圖
視圖的用途就是查詢
5.事務(wù)
當(dāng)一個(gè)業(yè)務(wù)邏輯需要多個(gè)sql完成時(shí),如果其中某條sql語句出錯(cuò)畦粮,則希望整個(gè)操作都退回
使用事務(wù)可以完成退回的功能散址,保證業(yè)務(wù)邏輯的正確性
5.1事務(wù)四大特性(簡(jiǎn)稱ACID)
原子性(Atomicity):事務(wù)中的全部操作在數(shù)據(jù)庫(kù)中是不可分割的乖阵,要么全部完成,要么均不執(zhí)行
一致性(Consistency):幾個(gè)并行執(zhí)行的事務(wù)预麸,其執(zhí)行結(jié)果必須與按某一順序串行執(zhí)行的結(jié)果相一致
隔離性(Isolation):事務(wù)的執(zhí)行不受其他事務(wù)的干擾瞪浸,事務(wù)執(zhí)行的中間結(jié)果對(duì)其他事務(wù)必須是透明的
持久性(Durability):對(duì)于任意已提交事務(wù),系統(tǒng)必須保證該事務(wù)對(duì)數(shù)據(jù)庫(kù)的改變不被丟失吏祸,即使數(shù)據(jù)庫(kù)出現(xiàn)故障
要求:表的類型必須是innodb或bdb類型对蒲,才可以對(duì)此表使用事務(wù)
5.2事務(wù)語句
開啟begin;
提交commit;
回滾rollback;