多表設計
4.1.一對一
一張表的一條記錄一定只能與另外一張表的一條記錄進行對應宴抚,反之亦然袄膏。
有時候践图,為了業(yè)務,或者避免一張表中數(shù)據(jù)量過大沉馆,過復雜码党,在開發(fā)中會進行一對一方式來設計表。
一對一.png
4.2. 一對多(1方建主表(id為主鍵字段), 多方建外鍵字段)
一個實體的某個數(shù)據(jù)與另外一個實體的多個數(shù)據(jù)有關聯(lián)關系斥黑, 一對多的關系在設計的時候揖盘,需要設計表的外鍵。
4.2.1. 班級表和學生表設計
image.png
image.png
部門表和員工表設計
image.png
4.2.2.創(chuàng)建數(shù)據(jù)庫表
constraint 約束
foreign key就是表與表之間的某種約定的關系锌奴,由于這種關系的存在兽狭,能夠讓表與表之間的數(shù)據(jù),更加的完整,關連性更強椭符。
foreign key語句的式例:FOREIGN KEY(Sno) REFERENCES Student(Sno)
注意:表的外鍵必須是另一張表的主鍵
//創(chuàng)建班級表create tableclass(idintprimary key auto_increment,namevarchar(20));//創(chuàng)建學生表create tablestudent(idintprimary key auto_increment,namevarchar(20),sexvarchar(20),class_idint,constraint? foreignkey(class_id)referencesclass(id));//插入班級數(shù)據(jù)insertintoclassvalues(1,'ceshiban');insertintoclassvalues(2,'kaifa');//插入學生數(shù)據(jù)insertintostudentvalues(1,'zhangsan','nan',1);insertintostudentvalues(2,'lisi','nan',2);insertintostudentvalues(3,'jingjing','nan',2);//聯(lián)查select*fromstudentwhereclass_id=(selectidfromclasswhereid=2);
補一個外鍵的注意(默認是約束): 刪除主鍵信息時荔燎,當該主鍵字段值在外鍵表中存在時,該記錄是不能刪除的销钝。---要把外鍵表是的相關信息刪除之后有咨,才能刪除。
子查詢:嵌套在其他查詢中的查詢蒸健。
4.3座享、多對多( 3個表= 2個實體表 + 1個關系表 )
一個實體的數(shù)據(jù)對應另外一個實體的多個數(shù)據(jù),另外實體的數(shù)據(jù)也同樣對應當前實體的多個數(shù)據(jù)似忧。
一個學生可以有多個老師渣叛,一個老師可以教多個學生
解決方案:創(chuàng)建一個中間表,專門用來維護多表之間的對應關系盯捌,通常是能夠唯一標識出數(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);//查詢李老師所教的學生selectidfromteacherwherename=’李老師’selectstudent_idfromteacher_studentwhereteacher_id=idselect*fromstudentwhereidin(selectstudent_idfromteacher_studentwhereteacher_id=(selectidfromteacherwherename='李老師'));//查詢張三的所有老師select*fromteacherwhereidin(selectteacher_idfromteacher_studentwherestudent_id=(selectidfromstudentwherename='張三'));
五淳衙、 聯(lián)表查詢
分類:內(nèi)連接、外連接饺著、交叉連接
5.1. 初始定義表結構
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('吹風機',99,1);insertintoorders(good_name,price,customer_id)values('香水',300,3);insertintoorders(good_name,price,customer_id)values('牛奶',100,6);
5.2.交叉查詢
交叉查詢箫攀,又叫笛卡爾積查詢,會將左表和右表的信息幼衰,做一個乘積將所有信息查詢出來靴跛,會產(chǎn)生臨時表,比較占用內(nèi)存渡嚣,生成的記錄數(shù)=表1 X表2
select*fromcustomer,orders;select*fromcustomer crossjoinorders;
5.3. 內(nèi)連接查詢
內(nèi)連接梢睛,inner join on 查詢兩張表,設定條件识椰,將兩張表中對應的數(shù)據(jù)查詢出來
不會產(chǎn)生笛卡爾積绝葡,不會產(chǎn)生臨時表,性能高
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ù)據(jù)查詢出來藏畅,同時將左表自己沒有關聯(lián)的數(shù)據(jù)也查詢出來
注意:join前面是左,后面是右
select*fromcustomer c leftjoinorders o on c.id=o.customer_id;
5.5. 右外連接
右外連接 right join? on 設定條件种蘸,將兩張表對應的數(shù)據(jù)查詢出來墓赴,同時將右表自己沒有關聯(lián)的所有數(shù)據(jù)查詢出來
select*fromcustomer c rightjoinorders o on c.id=o.customer_id;
5.6. 聯(lián)合查詢
select*fromcustomer leftjoinorders on customer.id=orders.customer_idhaving price>20;
六、MySQL圖形化工具navicat
6.1. 安裝介紹
6.2. Navicat工具使用步驟
6.2.1. 鏈接航瞭,mysql诫硕,輸入用戶名,密碼
連接.png
image.png
6.2.2.新建庫刊侯,鼠標點擊右鍵
image.png
image.png
6.2.3.新建表
image.png
七章办、數(shù)據(jù)庫備份與恢復
1. 使用圖形界面工具:
image.png
2. 使用doc命令:
mysqldump –u用戶名 –p密碼 數(shù)據(jù)庫名>生成的腳本文件路徑
注意,不要打分號,不要登錄mysql藕届,直接在cmd下運行
注意挪蹭,生成的腳本文件中不包含create database語句
mysqldump -uroot -proot host>C:\Users\Administrator\Deskt
op\mysql\1.sql
image.png
3. 導入SQL文件
image.png
導入文件
image.png
刷新即可,F(xiàn)5刷新
4.恢復
a)使用圖形界面工具:
b)使用doc命令行:
i.不登錄恢復
mysql -u用戶名 -p密碼 數(shù)據(jù)庫<腳本文件路徑
注意休偶,不要打分號梁厉,不要登錄mysql,直接在cmd下運行
image.png
ii.登錄之后恢復
選擇庫 use 庫名稱
Source sql文件路徑
image.png
八踏兜、數(shù)據(jù)庫常用性能優(yōu)化(了解)
數(shù)據(jù)庫性能優(yōu)化這塊词顾,我們考慮比較多的還是查詢這塊,互聯(lián)網(wǎng)項目對數(shù)據(jù)查詢非常頻繁碱妆,對效率肉盹,性能要求比較高。
查詢這塊優(yōu)化的話疹尾,主要就需要使用索引這種方式上忍,所謂索引就是建立一種快速查找的方式,比如我們查字典,有一個ABCD的索引.
image.png
舉個例子,如果我們創(chuàng)建一個表create table user(id integer ,name varchar(20)纳本,job varchar(20));如果我們數(shù)據(jù)庫中有1000萬條數(shù)據(jù)窍蓝,當我查詢select * from user where name=’張三’的時候,這種查詢方式就類似于整個數(shù)據(jù)庫的掃描,效率非常低饮醇。
image.png
我們可以給這個name設置一個索引create index n on user (name);這是設置一種普通(normal)索引它抱,然后我們查詢的時候秕豫,有了這個索引朴艰,效率就會大大提升,當然對于索引混移,它的方式有BTree類型和Hash類型祠墅,是兩種管理數(shù)據(jù)庫索引的方式,這個我沒有深入研究歌径。這個我們可以自己設置毁嗦。默認是btree。
索引類型的話回铛,有normal(普通類型)類型狗准、unique(唯一類型)、fulltext全文索引茵肃、主鍵索引腔长、非空索引、聚集索引验残。
①主鍵索引捞附,primary key 在設置的時候,已經(jīng)指定了,其實也是非空索引鸟召。
②非空索引是not null,設置這種方式的該字段下內(nèi)容不能為空胆绊,
③聚集索引(聯(lián)合索引),是在設置多個查詢條件的時候使用欧募。比如 創(chuàng)建一張表压状,有名字,有工作跟继,我們想經(jīng)常頻繁的用到名字和工作它倆結合在一起來查詢數(shù)據(jù)庫中表的數(shù)據(jù)何缓。這個時候,可以將名字和工作指定為聚集索引还栓。create index m on user(name,job); 這樣當我們指定select * from user where name=xxx and job=xxx的時候碌廓,就會按照索引方式來做。
這種優(yōu)化方式就是索引優(yōu)化剩盒,在使用索引優(yōu)化方案的時候谷婆,我們需要注意避免在索引字段上使用條件函數(shù)等操作。
了解:
Show index form orders;查看索引