mysql資料庫(入門)五
阿新 • • 發佈:2018-12-21
關聯關係之表設計
- 外來鍵: 用來建立關係的欄位稱為外來鍵
- 主鍵: 用來表示資料唯一性的欄位稱為主鍵
一對一
- 有AB兩張表,A表中的一條資料對應B表中的一條資料同時B表一條對應A表一條,這種關係稱為一對一
- 應用場景:商品表和商品詳情表,
- 如何建立關係: 在從表中新增外來鍵,外來鍵的值指向主表的主鍵
練習:請設計表儲存以下資料
create table user(id int primary key auto_increment,username varchar(10),password varchar(10)); create table userinfo(userid int,nick varchar(10),tel varchar(15),address varchar(20)); insert into user values(null,'wukong','123456'),(null,'bajie','bacd'),(null,'libai','aabbcc'); insert into userinfo values(1,'齊天大聖','13833446622','花果山'),(2,'二師兄','13833446622','高老莊'),(3,'李白','13833446622','語文書裡');
完成以下查詢:
select u.username,u.password
from user u join userinfo ui
on u.id=ui.userid
where ui.nick='李白';
select *
from user u join userinfo ui
on u.id=ui.userid;
select ui.nick from user u join userinfo ui on u.id=ui.userid where u.username='bajie';
一對多
- AB兩張表,A表中的一條資料對應B表中的多條資料,同時B表中的一條資料對應A表中的一條資料,稱為一對多
- 應用場景: 員工-部門, 商品-分類
- 如何建立關係: 在多的一端新增外來鍵指向另外一張表的主鍵
練習:建立表儲存以下資料 t_emp t_dept
create table t_emp(empno int primary key auto_increment,ename varchar(10),age int,sal int,deptno int); create table t_dept(deptno int primary key auto<em>increment,dname varchar(10),loc varchar(10)); insert into t_dept values(null,'神仙部','花果山'),(null,'三國部','蜀國'),(null,'海賊部','日本'); insert into t_emp values(null,'悟空',28,3000,1),(null,'劉備',34,8000,2),(null,'路飛',18,1000,3),(null,'八戒',30,4000,1);
select e.ename,d.dname
from t_emp e join t_dept d
on e.deptno=d.deptno;
select e.ename,e.sal
from t_emp e join t_dept d
on e.deptno=d.deptno
where d.loc='花果山';
多對多
- AB兩張表,A表中一條資料對應B表中多條資料同時B表中一條資料對應A表中多條,稱為多對多
- 應用場景: 老師-學生 使用者-角色
- 如何建立關係:需要建立新的關係表,表中新增兩個外來鍵,指向兩個主表的主鍵
練習:建立表儲存以下資料
create table teacher(id int primary key auto_increment,name varchar(10));
create table student(id int primary key auto_increment,name varchar(10));
create table t_s(tid int,sid int);
insert into teacher values(null,'唐僧'),(null,'老師');
insert into student values(null,'悟空'),(null,'大哥'),(null,'大姐');
insert into t_s values(1,1),(1,2),(2,2),(2,3);
select s.name
from teacher t join t_s ts
on t.id=ts.tid
join student s
on ts.sid=s.id
where t.name='蒼老師';
select t.name
from teacher t join t_s ts
on t.id=ts.tid
join student s
on ts.sid=s.id
where s.name='大哥'
表設計之許可權管理案例
-
建立三張主表user(id,name) role(id,name) module(id,name) 和兩張關係表 u_r(uid,rid)(使用者和角色) r_m(rid,mid)(角色和許可權)
create table user(id int primary key auto_increment,name varchar(10)); create table role(id int primary key auto_increment,name varchar(10)); create table module(id int primary key auto_increment,name varchar(10)); create table u_r(uid int,rid int); create table r_m(rid int,mid int);
儲存以下資料: 使用者表:劉德華,貂蟬
insert into user values(null,'劉德華'),(null,'貂蟬');
角色表:男遊客,男管理員,女遊客,女會員
insert into role values(null,'男遊客'),(null,'男管理員'),(null,'女遊客'),(null,'女會員');
許可權表:男瀏覽,男發帖,男刪帖,女瀏覽,女發帖
insert into module values(null,'男瀏覽'),(null,'男發帖'),(null,'男刪帖'),(null,'女瀏覽'),(null,'女發帖');
關係:男遊客->男瀏覽;男管理員->男瀏覽,男發帖,男刪帖;女遊客-》女瀏覽;女會員-》女瀏覽,女發帖
劉德華-》男管理員和女遊客
貂蟬-》女會員和男遊客
insert into r_m values(1,1),(2,1),(2,2),(2,3),(3,4),(4,4),(4,5);
insert into u_r values(1,2),(1,3),(2,4),(2,1);
select u.name,m.name
from user u join u_r ur
on u.id=ur.uid
join r_m rm
on ur.rid=rm.rid
join module m
on rm.mid=m.id;
select m.name
from user u join u_r ur
on u.id=ur.uid
join r_m rm
on ur.rid=rm.rid
join module m
on rm.mid=m.id
where u.name='劉德華';
select u.name
from user u join u_r ur
on u.id=ur.uid
join r_m rm
on ur.rid=rm.rid
join module m
on rm.mid=m.id
where m.name='男瀏覽';