4.1.一對(duì)一
一張表的一條記錄一定只能與另外一張表的一條記錄進(jìn)行對(duì)應(yīng),反之亦然。
有時(shí)候,為了業(yè)務(wù),或者避免一張表中數(shù)據(jù)量過(guò)大,過(guò)復(fù)雜,在開(kāi)發(fā)中會(huì)進(jìn)行一對(duì)一方式來(lái)設(shè)計(jì)表。

一對(duì)一.png
4.2. 一對(duì)多(1方建主表(id為主鍵字段), 多方建外鍵字段)
一個(gè)實(shí)體的某個(gè)數(shù)據(jù)與另外一個(gè)實(shí)體的多個(gè)數(shù)據(jù)有關(guān)聯(lián)關(guān)系, 一對(duì)多的關(guān)系在設(shè)計(jì)的時(shí)候,需要設(shè)計(jì)表的外鍵。
4.2.1. 班級(jí)表和學(xué)生表設(shè)計(jì)

image.png

image.png
部門(mén)表和員工表設(shè)計(jì)

image.png
4.2.2.創(chuàng)建數(shù)據(jù)庫(kù)表
constraint 約束
foreign key就是表與表之間的某種約定的關(guān)系,由于這種關(guān)系的存在,能夠讓表與表之間的數(shù)據(jù),更加的完整,關(guān)連性更強(qiáng)。
foreign key語(yǔ)句的式例:FOREIGN KEY(Sno) REFERENCES Student(Sno)
注意:表的外鍵必須是另一張表的主鍵
//創(chuàng)建班級(jí)表create tableclass(idintprimary key auto_increment,namevarchar(20));//創(chuàng)建學(xué)生表create tablestudent(idintprimary key auto_increment,namevarchar(20),sexvarchar(20),class_idint,constraint? foreignkey(class_id)referencesclass(id));//插入班級(jí)數(shù)據(jù)insertintoclassvalues(1,'ceshiban');insertintoclassvalues(2,'kaifa');//插入學(xué)生數(shù)據(jù)insertintostudentvalues(1,'zhangsan','nan',1);insertintostudentvalues(2,'lisi','nan',2);insertintostudentvalues(3,'jingjing','nan',2);//聯(lián)查select*fromstudentwhereclass_id=(selectidfromclasswhereid=2);
補(bǔ)一個(gè)外鍵的注意(默認(rèn)是約束): 刪除主鍵信息時(shí),當(dāng)該主鍵字段值在外鍵表中存在時(shí),該記錄是不能刪除的。---要把外鍵表是的相關(guān)信息刪除之后,才能刪除。
子查詢(xún):嵌套在其他查詢(xún)中的查詢(xún)。
4.3、多對(duì)多( 3個(gè)表= 2個(gè)實(shí)體表 + 1個(gè)關(guān)系表 )
一個(gè)實(shí)體的數(shù)據(jù)對(duì)應(yīng)另外一個(gè)實(shí)體的多個(gè)數(shù)據(jù),另外實(shí)體的數(shù)據(jù)也同樣對(duì)應(yīng)當(dāng)前實(shí)體的多個(gè)數(shù)據(jù)。
一個(gè)學(xué)生可以有多個(gè)老師,一個(gè)老師可以教多個(gè)學(xué)生
解決方案:創(chuàng)建一個(gè)中間表,專(zhuān)門(mén)用來(lái)維護(hù)多表之間的對(duì)應(yīng)關(guān)系,通常是能夠唯一標(biāo)識(shí)出數(shù)據(jù)的字段(主鍵)
create tableteacher(idintprimary key,namevarchar(100));create table student(idintprimary key,namevarchar(100));create tableteacher_student(teacher_idint,student_idint,constraint foreignkey(teacher_id)referencesteacher(id),constraint foreignkey(student_id)referencesstudent(id));insertintoteachervalues(1,'梁老師');insertintoteachervalues(2,'李老師');insertintostudentvalues(1,”張三”);insertintostudentvalues(2,”李四”);insertintoteacher_studentvalues(1,1);insertintoteacher_studentvalues(1,2);insertintoteacher_studentvalues(2,1);insertintoteacher_studentvalues(2,2);//查詢(xún)李老師所教的學(xué)生selectidfromteacherwherename=’李老師’selectstudent_idfromteacher_studentwhereteacher_id=idselect*fromstudentwhereidin(selectstudent_idfromteacher_studentwhereteacher_id=(selectidfromteacherwherename='李老師'));//查詢(xún)張三的所有老師select*fromteacherwhereidin(selectteacher_idfromteacher_studentwherestudent_id=(selectidfromstudentwherename='張三'));
五、 連表查詢(xún)
分類(lèi):內(nèi)連接、外連接、交叉連接
5.1. 初始定義表結(jié)構(gòu)
create tablecustomer(idintprimary key auto_increment,namevarchar(20),cityvarchar(20));create tableorders(idintprimary key auto_increment,good_namevarchar(20),pricefloat(8,2),customer_idint);insertintocustomer(name,city)values('李老師','東北');insertintocustomer(name,city)values('崔老師','山西');insertintocustomer(name,city)values('張老師','內(nèi)蒙');insertintocustomer(name,city)values('閆老師','天津');insertintoorders(good_name,price,customer_id)values('電腦',59,1);insertintoorders(good_name,price,customer_id)values('筆記本',88,2);insertintoorders(good_name,price,customer_id)values('吹風(fēng)機(jī)',99,1);insertintoorders(good_name,price,customer_id)values('香水',300,3);insertintoorders(good_name,price,customer_id)values('牛奶',100,6);
5.2.交叉查詢(xún)
交叉查詢(xún),又叫笛卡爾積查詢(xún),會(huì)將左表和右表的信息,做一個(gè)乘積將所有信息查詢(xún)出來(lái),會(huì)產(chǎn)生臨時(shí)表,比較占用內(nèi)存,生成的記錄數(shù)=表1 X表2
select*fromcustomer,orders;select*fromcustomer crossjoinorders;
5.3. 內(nèi)連接查詢(xún)
內(nèi)連接,inner join on 查詢(xún)兩張表,設(shè)定條件,將兩張表中對(duì)應(yīng)的數(shù)據(jù)查詢(xún)出來(lái)
不會(huì)產(chǎn)生笛卡爾積,不會(huì)產(chǎn)生臨時(shí)表,性能高
select*fromcustomer c innerjoinorders o on c.id=o.customer_id;select*fromcustomer,orderswherecustomer.id=orders.customer_id;select*fromcustomer c,orders owherec.id=o.customer_id;
5.4. 左外連接
左外連接? left join on 設(shè)定條件,將兩張表對(duì)應(yīng)的數(shù)據(jù)查詢(xún)出來(lái),同時(shí)將左表自己沒(méi)有關(guān)聯(lián)的數(shù)據(jù)也查詢(xún)出來(lái)
注意:join前面是左,后面是右
select*fromcustomer c leftjoinorders o on c.id=o.customer_id;
5.5. 右外連接
右外連接 right join? on 設(shè)定條件,將兩張表對(duì)應(yīng)的數(shù)據(jù)查詢(xún)出來(lái),同時(shí)將右表自己沒(méi)有關(guān)聯(lián)的所有數(shù)據(jù)查詢(xún)出來(lái)
select*fromcustomer c rightjoinorders o on c.id=o.customer_id;
5.6. 聯(lián)合查詢(xún)
select*fromcustomer leftjoinorders on customer.id=orders.customer_idhaving price>20;
六、MySQL圖形化工具navicat
6.1. 安裝介紹
6.2. Navicat工具使用步驟
6.2.1. 鏈接,mysql,輸入用戶(hù)名,密碼

連接.png

image.png
6.2.2.新建庫(kù),鼠標(biāo)點(diǎn)擊右鍵

image.png

image.png
6.2.3.新建表

image.png
七、數(shù)據(jù)庫(kù)備份與恢復(fù)
1. 使用圖形界面工具:

image.png
2. 使用doc命令:
mysqldump –u用戶(hù)名 –p密碼 數(shù)據(jù)庫(kù)名>生成的腳本文件路徑
注意,不要打分號(hào),不要登錄mysql,直接在cmd下運(yùn)行
注意,生成的腳本文件中不包含create database語(yǔ)句
mysqldump -uroot -proot host>C:\Users\Administrator\Deskt
op\mysql\1.sql

image.png
3. 導(dǎo)入SQL文件

image.png
導(dǎo)入文件

image.png
刷新即可,F(xiàn)5刷新
4.恢復(fù)
a)使用圖形界面工具:
b)使用doc命令行:
i.不登錄恢復(fù)
mysql -u用戶(hù)名 -p密碼 數(shù)據(jù)庫(kù)<腳本文件路徑
注意,不要打分號(hào),不要登錄mysql,直接在cmd下運(yùn)行

image.png
ii.登錄之后恢復(fù)
選擇庫(kù) use 庫(kù)名稱(chēng)
Source sql文件路徑

image.png
八、數(shù)據(jù)庫(kù)常用性能優(yōu)化(了解)
數(shù)據(jù)庫(kù)性能優(yōu)化這塊,我們考慮比較多的還是查詢(xún)這塊,互聯(lián)網(wǎng)項(xiàng)目對(duì)數(shù)據(jù)查詢(xún)非常頻繁,對(duì)效率,性能要求比較高。
查詢(xún)這塊優(yōu)化的話(huà),主要就需要使用索引這種方式,所謂索引就是建立一種快速查找的方式,比如我們查字典,有一個(gè)ABCD的索引.

image.png
舉個(gè)例子,如果我們創(chuàng)建一個(gè)表create table user(id integer ,name varchar(20),job varchar(20));如果我們數(shù)據(jù)庫(kù)中有1000萬(wàn)條數(shù)據(jù),當(dāng)我查詢(xún)select * from user where name=’張三’的時(shí)候,這種查詢(xún)方式就類(lèi)似于整個(gè)數(shù)據(jù)庫(kù)的掃描,效率非常低。

image.png
我們可以給這個(gè)name設(shè)置一個(gè)索引create index n on user (name);這是設(shè)置一種普通(normal)索引,然后我們查詢(xún)的時(shí)候,有了這個(gè)索引,效率就會(huì)大大提升,當(dāng)然對(duì)于索引,它的方式有BTree類(lèi)型和Hash類(lèi)型,是兩種管理數(shù)據(jù)庫(kù)索引的方式,這個(gè)我沒(méi)有深入研究。這個(gè)我們可以自己設(shè)置。默認(rèn)是btree。
索引類(lèi)型的話(huà),有normal(普通類(lèi)型)類(lèi)型、unique(唯一類(lèi)型)、fulltext全文索引、主鍵索引、非空索引、聚集索引。
①主鍵索引,primary key 在設(shè)置的時(shí)候,已經(jīng)指定了,其實(shí)也是非空索引。
②非空索引是not null,設(shè)置這種方式的該字段下內(nèi)容不能為空,
③聚集索引(聯(lián)合索引),是在設(shè)置多個(gè)查詢(xún)條件的時(shí)候使用。比如 創(chuàng)建一張表,有名字,有工作,我們想經(jīng)常頻繁的用到名字和工作它倆結(jié)合在一起來(lái)查詢(xún)數(shù)據(jù)庫(kù)中表的數(shù)據(jù)。這個(gè)時(shí)候,可以將名字和工作指定為聚集索引。create index m on user(name,job); 這樣當(dāng)我們指定select * from user where name=xxx and job=xxx的時(shí)候,就會(huì)按照索引方式來(lái)做。
這種優(yōu)化方式就是索引優(yōu)化,在使用索引優(yōu)化方案的時(shí)候,我們需要注意避免在索引字段上使用條件函數(shù)等操作。
了解:
Show index form orders;查看索引

作者:Anwfly
鏈接:http://www.itdecent.cn/p/41c819d7b59e
來(lái)源:簡(jiǎn)書(shū)
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。