數(shù)據(jù)庫設計:建表
數(shù)據(jù)庫設計三大范式:
(1)確保每一列的原子性:每一列都不可再拆分
//不符合規(guī)范
//規(guī)范
(2)確保表中的每一列都和主鍵相關:每一行只做一件事情,只要表中出現(xiàn)重復的數(shù)據(jù),就要把表拆分開
//不規(guī)范,數(shù)據(jù)重復
訂單編號 ?聯(lián)系人 ?電話 ?地址 詳細地址
1001 小波 110 ??北京市 北京市
1002 路人甲 112 xxxxxxx xxxxxxx
1003 小波 110 北京市 北京市
1004 小波 110 北京市 北京市
//規(guī)范
1荠瘪、訂單表
訂單編號 聯(lián)系人編號
1001 1
1002 2
1003 1
1004 1
2啸胧、用戶表
聯(lián)系人編號 聯(lián)系人 ?電話 ?地址 詳細地址
1 小波 110 北京市 北京市
2 路人甲 112 xxxxxxx xxxxxxx
(3)表中的每一列必須和主鍵直接相關,而不是間接相關
//不規(guī)范
學生編號 ?學生姓名 ?性別 電話 所在學校 學校地址 學校電話
1001 小波 man 110 華育
//規(guī)范
學生編號 ?學生姓名 ?性別 電話 學校編號
1001 小波 man 110 001
學校編號 學校名稱 學校地址 學校電話
001 華育 北京 12345678
外鍵:
作用:為了保證兩種數(shù)據(jù)表中的數(shù)據(jù)的一致性
要求:(1)一般給從表添加外鍵約束
(2)必須保證帶有外鍵約束的字段和主表中參考的主鍵字段的數(shù)據(jù)類型一致
(3)外鍵必須參考的是另一張表中的主鍵字段
(4)存儲引擎innodb
//mysql默認的存儲引擎是myisam //創(chuàng)建表時添加外鍵
create table orders(
?oid int(11) not null auto_increment primary key,
??? uid int(11) not null,
??? money decimal(11,2) not null,
??? orderTime datetime not null,
??? foreign key(uid) references users(uid)//外鍵訂單表uid參考的是用戶表的主鍵uid
)engine=innodb charset=utf8;
查看創(chuàng)建表時的Sql show create table 表名;
刪除外鍵alter table 表名 drop foreign key 外鍵名;alter table orders drop foreign key orders_ibfk_1;
對已經(jīng)存在的表添加外鍵 alter table books add foreign key(type_id) references book_type(type_id);
在刪除或者更新主表記錄時,從表應該如何處理相關的記錄
on delete//當刪除時
on update//當更新時
//允許的級聯(lián)動作:
(1)cascade:關聯(lián)操作,如果主表被更新或刪除,從表也會執(zhí)行相應的操作
(2)restrict:拒絕主表的相關操作
(3)set null:表示從表數(shù)據(jù)不指向主表任何記錄
(4)no action:無動作
//刪除主表的數(shù)據(jù)時蔚万,從表數(shù)據(jù)也會被刪掉
alter table books add foreign key(type_id) references book_type(type_id) on delete cascade;
alter table orders add foreign key(uid) references users(uid) on delete cascade;
多表查詢
1select * from dept,person;也叫笛卡爾積
2mysql> select * from dept,person where dept.id=person.bid;
3開發(fā)中一般使用等值查詢
mysql> select id,bname,name,degree from person,dept where dept.id=person.bid;
注:多表查指定字段,最好用表名.字段名,如果多表中有重名字段則必須用表名.字段名
關聯(lián)查詢(表連接)
定義:兩張及兩張以上的表临庇,把他們按照一定的條件連接起來
什么情況下使用連接查詢:
?在同一頁面中反璃,同一個模塊中,需要來自不同表中的數(shù)據(jù)
圖書Id 圖書名字 圖書類型
(1)內(nèi)連接
//取的是兩張表數(shù)據(jù)的交集假夺,會丟失數(shù)據(jù)
//select 字段名 from 表名1 inner join 表名2 on 表1.關聯(lián)字段=表2.關聯(lián)字段版扩;
select bk.id,bk.b_name,bt.type_name from books as bk inner join book_type as bt on bk.type_id=bt.type_id;
select bk.id,bk.b_name,bt.type_name from books as bk,book_type as bt where bk.type_id=bt.type_id;
(2)外連接
(1)左鏈接(left join):會讀取左邊表的全部數(shù)據(jù),即使右表無對應數(shù)據(jù)
????? A left join B:A在左邊作為主表,A表全部數(shù)據(jù)都會顯示出來,而B表只會顯示符合條件的數(shù)據(jù)侄泽,B表記錄不足的地方會以Null補足
?//select 字段名 from 表名1 left join 表名2 on 表1.關聯(lián)字段=表2.關聯(lián)字段礁芦;
select bk.id,bk.b_name,bt.type_name from books bk left join book_type bt
?on bk.type_id = bt.type_id;
?b)右連接(right join):會讀取右邊表的全部數(shù)據(jù),若左邊表無對應的數(shù)據(jù)悼尾,會以Null來補足
??? A right join B:B表在右邊柿扣,作為主表
子查詢
(什么情況下使用
(1)一般涉及到兩張表及兩張以上的表
(2)通過一個已知表的條件去查找另一個表的數(shù)據(jù)(必須保證兩張表有一個共同的字段))
select * from score where stid =(select stid from student where name = '小雪')? and coid = (select coid from course where co_name = '英語');
聚合函數(shù),通常與group by一起使用 count();max();min();sum()求和;avg() 求平均值
查詢結果中有重復的數(shù)據(jù)闺魏,只取每組中的第一條記錄
Having
distinct 去重 寫兩個 聯(lián)合去重
字符串函數(shù),會影響mysql執(zhí)行效率
截取字符串substr(string,start,length)=substring(string,start,length)
? string:要截取的字符串
? start:從哪個位置開始截,從1開始
? length:截取多少長度
select substr(b_name,1,2) from books;
拼接字符串
select concat(1,2,3);//結果123
任意一個參數(shù)為Null,結果就為null
select concat(1,2,null);//結果null
select concat(b_name,price) from books;
select 字段名,字段名, ... (*)
???? from 表名 where 子句??
???? group by子句
???? having子句
???? order by子句
???? limit子句
???? desc(asc)
執(zhí)行順序 from-on-join-where-group by-having-
Case when用法:
SELECT? 字段1,?????????
??? case?????????????????? -------------如果
??? when sex='1' then '男' -------------sex='1'未状,則返回值'男'
??? when sex='2' then '女' -------------sex='2',則返回值'女'?
??? else? ’其他’??????????????? -------------其他的返回'其他’
??? end?
??? as 別名????????????????? -------------結束
from?? sys_user??????????? --------整體理解: 在sys_user表中如果sex='1'析桥,則返回值'男'如果sex='2'司草,則返回值'女' 否則返回'其他’
無限極分類(遞歸)表
ID? name????? pid(父級ID)
1?? 理財??????? 0
2?? 眾籌??????? 0
3?? 保險??????? 0
4?? 京東下金庫?? 1
5?? 票據(jù)理財???? 1
6?? 基金理財???? 1
7?? 智能硬件??? 2
8?? 流行文化??? 2
9?? 車險??????? 3
10? 健康險????? 3
11? 意外險????? 3